【计算机网络】深入理解ARP协议:工作原理、报文格式与安全防护

文章目录

  • 前言
  • [1. ARP 协议简介](#1. ARP 协议简介)
  • [2. ARP 报文格式](#2. ARP 报文格式)
      • [ARP 工作流程](#ARP 工作流程)
  • [3. ARP 攻击](#3. ARP 攻击)
  • 总结

前言

ARP 协议是在局域网中获取对应当前局域网中 IP 地址的 MAC 地址的协议。

举一个生活中的例子。

现在我们的信件来到了小区(一个局域网)门口(路由器"网关"),现在小区中的每一个家庭都有一个门牌号(IP地址),这个门牌号是小区中唯一的。但是送信的人知道把信封送到哪一个门牌号,但是不知道具体的物理地址(MAC地址)在哪里,于是就在整个小区中大喊一声(广播):"谁是门牌号xxxx(IP)",这个时候对应的家庭(对应的目的 IP 地址)听到了这个请求(ARP请求),于是就回复道:"我是xxx,地址在yyy(物理 MAC 地址)",于是送信的人听到了这个回复(ARP 回复),就知道往哪一个家庭送信封了。

上面的这个生活中的例子解释了大致的 ARP 协议的流程,下面我们正式来认识 ARP 协议。

1. ARP 协议简介

  • ARP

    ARP(Address Resolution Protocol,地址解析协议)是一个位于 TCP/IP 协议栈中的网络层和数据链路层之间的一层协议 ,主要用于:通过 IP 地址来发现对应设备的 MAC 地址的协议。

text 复制代码
┌─────────────────────┐
│    应用层            │
├─────────────────────┤
│    传输层 (TCP/UDP)  │
├─────────────────────┤
│   网络层 (IP)        │ ← 传统意义上的"网络层"
├─────────────────────┤
│   ARP协议模块        │ ← 跨越两层的"服务层"
├─────────────────────┤
│  数据链路层 (以太网)  │
├─────────────────────┤
│    物理层            │
└─────────────────────┘
  • 为什么需要 ARP 协议?

    当我们的数据在一个局域网中传输的时候,路由器准备下一跳 的时候,拿到的地址是目标主机的 IP 地址。但是下层进行网络通信的时候,并不是直接使用 IP 地址而是使用 MAC 地址 (因为数据最后在局域网中的寻址方式是通过 MAC 地址来进行寻址的)。所以在进行数据传输的时候,本主机是不得知吓一跳的 MAC 地址的 。即在网络通信的时候,源主机知道目标主机的 IP 地址,但是不知道目标主机的硬件地址。

    而 ARP 协议建立了主机 IP 地址和 MAC 地址的关系 。其核心作用:在同一个局域网内,数据包最终如何被传递到目标设备的问题。。

2. ARP 报文格式

注意:这个协议不需要将数据传递给上层协议,甚至不携带任何上层数据。

  • 如下图:

下面我们来介绍一下各个字段:

  1. 硬件类型:

    指明发送方想要知道的物理网络类型。例如:以太网(1)、令牌环网(6)、帧中继(15)......

  2. 协议类型:

    指明发送方要映射的高层协议地址类型。例如:IPv4(0x0800)、IPv6(不适用 ARP)

  3. 硬件地址长度:

    指明 MAC 地址的长度(单位字节)。例如:以太网的 MAC(6)

  4. 协议地址长度:

    指明协议地址(IP 地址)的长度(单位字节)。例如:IPv4(4)

  5. op(操作类型)

    指明当前的 ARP 是一个请求还是应答。例如:ARP 请求(1),ARP应答(2)、RARP 请求(3,已被淘汰)、RARP(4)

  6. 发送端 MAC 地址:

    指明发送方的物理地址。

  7. 发送端的 IP 地址:

    指明发送端的 IP 地址。

  8. 目的 MAC 地址:

    接收方的物理地址。在 ARP 请求中,这个字段被设置为全1(FF:FF:FF:FF:FF:FF),因为发送方还不知道目标的 MAC 地址,这正是我们需要得到的;在 ARP 响应中,这个字段被设置为请求方的 MAC 地址。

  9. 目标 IP 地址:

    指明接受方的 IP 地址。这个字段可用于上层 ARP 协议层能够解析是否这个 ARP 请求/响应 发给自己的


ARP 工作流程

下面我们结合一个示例(数据都是假设的),来说明 ARP 协议的工作:

  • 主机A(也可以是路由器):IP 地址 192.168.1.50/24;MAC 地址 AA:AA:AA:AA:AA:AA

  • 主机B:IP 地址 192.168.1.52/24;MAC 地址 BB:BB:BB:BB:BB:BB

    假设主机A给主机B发送数据。两台主机在一个局域网中

  1. 主机A检测 ARP 缓存。主机A接受到数据之后,在主机A的网络层决定要发送IP数据包时,在将其递交给数据链路层之前,先检测对应的 ARP 缓存表中有没有对应目标 IP 地址的 MAC 地址。如果有则直接交付给下层数据链路层进行数据帧的封装;否则进入下一步。

  2. 主机A构建 ARP 广播 。主机A会暂停数据包的发送环节 ,开始构建一个 ARP 请求(所以 ARP 是不携带数据的)进行当前局域网的 ARP 请求广播(目标 MAC 地址填充全1)。(字段的填写这里就省略)然后进行数据链路层的封装成数据帧,交付到网络中。

  3. 局域网其余主机进行匹配,匹配成功构建 ARP 应答。局域网中所有的主机都会从网络中得到收到来自主机A的 ARP 请求,都会通过底层设备(网卡)读取交付到上层协议。上层协议在解析 ARP 请求的时候,发现当前的目标 IP 地址并不是自己的地址,那么就会直接丢失这个 ARP 请求。如果匹配成功,例如 主机B收到了主机A的 ARP 请求,这个时候匹配 IP 地址成功,主机B也会将主机A的 MAC 和 IP 信息加入自己的缓存中,于是主机B就构建 ARP 应答,此时的应答具有单播功能,直接可以发送给主机A。

  4. 主机A收到 ARP 应答,获取 MAC 地址,更新 ARP 缓存表,发送数据。主机A在收到来自主机B的 ARP 应答之后就能获取到主机B的 MAC 地址,同时更新 ARP 缓存表,然后就可以将之前的数据包进行数据链路层的封装进行发送了。

主机A 网络层 主机A ARP协议 主机A 数据链路层 网络 主机B 数据链路层 主机B ARP协议 主机B 网络层 1. 检测ARP缓存 查询目标IP的MAC地址 返回MAC地址 交付IP数据包 (携带目标MAC) 封装数据帧 发送数据帧 无对应条目 2. 构建ARP广播 暂停数据发送 构建ARP请求广播 (目标MAC=FF:FF:FF:FF:FF:FF) 广播ARP请求帧 3. 匹配并构建应答 所有主机收到广播 上传解析ARP请求 检查目标IP是否匹配? 将A的IP-MAC加入缓存 构建ARP单播应答 发送ARP应答帧 4. 获取MAC并发送数据 传递ARP应答 解析应答,获取B的MAC 更新ARP缓存表 通知MAC地址就绪 交付IP数据包 (携带目标MAC) 封装数据帧 发送数据帧 alt [缓存命中] [缓存未命中] 主机A 网络层 主机A ARP协议 主机A 数据链路层 网络 主机B 数据链路层 主机B ARP协议 主机B 网络层


3. ARP 攻击

在上述的过程中,我们发现:

  • ARP 只会傻乎乎地收到响应之后进行 ARP 缓存的更新。基于这样一个特性,我们的 ARP 缓存表就可能收到外部的攻击!

ARP 攻击

  • 攻击者通过伪造的 ARP 报文,恶意篡改受害者 ARP 缓存表的性行为。其核心目的就是冒充其它设备的身份。

场景:

我们引入一个攻击者M:

  • M:IP = 192.168.1.99/24,MAC = MM:MM:MM:MM:MM:MM
  1. 对主机A进行欺骗 :攻击者M主动向主机A发送一个伪造的 ARP 应答包(注意:这里甚至不需要主机A主动发起 ARP 响应包)。这个包指明了当前的 IP 地址是"192.168.1.52/24"(主机B),MAC 地址是"MM:MM:MM:MM:MM:MM"(攻击者M的MAC 地址)。于是由于 ARP 协议无条件的信任,那么主机A会将自己的 ARP 缓存表中的原本 192.168.1.52 <=> BB:BB:BB:BB:BB:BB 的映射改为:192.168.1.52 <=> MM:MM:MM:MM:MM:MM。

  2. 对主机B进行欺骗:与A同理。

  3. 后果:从此之后主机A、B发送给对方的数据都发送到了攻击者M这里,他就成为A、B之间的中间人。它可以进行一系列的操作:窃听、篡改、挟持......

解决方案

  1. 静态绑定 ARP
  2. ARP 防护软件
  3. 交换机安全功能
  4. 网络分段
  5. ......

大家有兴趣可以自行了解。

总结

  • ARP 协议定位:主要解决了在网络中传输数据而不清楚目标主机的实际物理地址的问题。(主要解决什么问题)

  • ARP 协议报文格式:

  • ARP 协议的工作流程

  • ARP 协议的漏洞、ARP 攻击。

相关推荐
守城小轩3 小时前
轻量级HTTP&Socks代理GOST: Linux编译安装
运维·网络·网络协议
qq_5470261793 小时前
Flowable 工作流引擎
java·服务器·前端
奋斗的蛋黄4 小时前
网络卡顿运维排查方案:从客户端到服务器的全链路处理
运维·服务器·网络
wanhengidc5 小时前
云手机搬砖 尤弥尔传奇自动化操作
运维·服务器·arm开发·安全·智能手机·自动化
进击的圆儿5 小时前
TCP可靠传输的秘密:从滑动窗口到拥塞控制
网络·网络协议·tcp/ip
图图图图爱睡觉6 小时前
主机跟虚拟机ip一直Ping不通,并且虚拟机使用ifconfig命令时,ens33没有ipv4地址,只有ipv6地址
服务器·网络·tcp/ip
deephub6 小时前
FastMCP 入门:用 Python 快速搭建 MCP 服务器接入 LLM
服务器·人工智能·python·大语言模型·mcp
lhxcc_fly6 小时前
Linux网络--8、NAT,代理,网络穿透
linux·服务器·网络·nat
摇滚侠6 小时前
Spring Boot3零基础教程,Spring Boot 应用打包成 exe 可执行文件,笔记91 笔记92 笔记93
linux·spring boot·笔记