一、背景与产生原因

ARP(Address Resolution Protocol,地址解析协议)于 1982 年被标准化,正式文档是 RFC 826,作者为 David C. Plummer(MIT)。

协议产生的背景是 DEC/Intel/Xerox 10 Mbit 以太网逐渐开始流行。以太网以 MAC 帧作为数据传输的基本单元,主机之间通过 48 位的 MAC 地址通信,而上层 IP 协议通过 32 位的 IP 地址通信。两层地址没有任何数学上的对应关系——当 IP 协议通过路由算法确定下一跳后,数据包无法直接根据 IP 地址投递。

RFC 826 明确指出解决这个问题有两种选择:

  • 各实现者各自发明地址解析方法(混乱、不可移植)
  • 所有人遵循一个统一标准(RFC 826 的目标)

注意:ARP 并非特定应用于 MAC 与 IP 之间,而是设计为支持多种数据链路层协议与网络层协议的通用机制。


二、ARP 报文格式

ARP 报文封装在以太网帧内,EtherType 字段值为 0x0806

以太网帧头(14 字节)

字段 长度 说明
目标 MAC 地址 6 字节 广播时填 FF:FF:FF:FF:FF:FF
源 MAC 地址 6 字节 发送方自身 MAC
EtherType 2 字节 ARP 固定为 0x0806

ARP 数据部分(28 字节)

字段 符号 长度 说明
硬件类型 ar$hrd 2 字节 以太网 = 1
协议类型 ar$pro 2 字节 IP = 0x0800
硬件地址长度 ar$hln 1 字节 以太网 MAC = 6
协议地址长度 ar$pln 1 字节 IPv4 = 4
操作码 ar$op 2 字节 请求 = 1,应答 = 2
发送方 MAC ar$sha 6 字节 发送方硬件地址
发送方 IP ar$spa 4 字节 发送方协议地址
目标 MAC ar$tha 6 字节 请求时填全 0
目标 IP ar$tpa 4 字节 待查询的目标 IP

ARP 报文总长度为 28 字节(不含以太网帧头)。


三、ARP 消息类型

ARP 报文格式里的操作码(ar$op)字段决定了这是哪一类消息。完整的操作码由 IANA 统一分配,常用的有以下四种:

操作码 名称 方向 说明
1 ARP Request(ARP 请求) 广播 “谁是 X.X.X.X?请告诉我你的 MAC”
2 ARP Reply(ARP 应答) 单播 “X.X.X.X 在这里,我的 MAC 是 XX:XX:XX:XX:XX:XX”
3 RARP Request(反向 ARP 请求) 广播 “我的 MAC 是 XX:XX:XX,有人知道我的 IP 吗?”
4 RARP Reply(反向 ARP 应答) 单播 “MAC 为 XX:XX:XX 的设备,你的 IP 是 X.X.X.X”

ARP Request(操作码 = 1)

发送方不知道目标 IP 对应的 MAC 时,以广播方式发出 ARP 请求。

关键字段:

  • 目标 MAC(ar$tha)填全 0(不知道,待查询)
  • 以太网帧目标 MAC 填 FF:FF:FF:FF:FF:FF(广播)
  • 局域网内所有主机都会收到,逐一对比 ar$tpa 是否是自己的 IP

ARP Reply(操作码 = 2)

目标主机收到 ARP 请求后,以单播方式直接回复给发送方。

关键字段:

  • 发送方 MAC(ar$sha)填自己的 MAC
  • 目标 MAC(ar$tha)填请求发起方的 MAC
  • 以太网帧目标 MAC 直接写请求方 MAC(单播,不再广播)

RARP Request / RARP Reply(操作码 = 3 / 4)

RARP(Reverse ARP,反向地址解析协议,RFC 903)是 ARP 的”逆向版”:已知自己的 MAC,想查对应的 IP。典型用途是无盘工作站启动时向 RARP 服务器询问自己的 IP 地址。

注意:RARP 已基本被 BOOTP 和 DHCP 取代,现代网络中几乎不再使用。

特殊变体

除上述标准消息类型外,还有两种常见的特殊形式,本文后续章节详细介绍:

  • 免费 ARP(Gratuitous ARP):操作码仍为 1(请求)或 2(应答),但查询的是自己的 IP,用于 IP 冲突检测和 MAC 更新通告。(1是检测IP是否冲突,2是强制更新他人缓存)
  • 代理 ARP(Proxy ARP):操作码为 2(应答),由路由器代替目标主机回复,用 MAC 地址欺骗发送方绕过网络边界。

四、工作原理

完整流程

主机 A 要向主机 B 发送数据
         │
         ▼
  查询本机 ARP 缓存表
         │
    ┌────┴────┐
  命中       未命中
    │           │
    ▼           ▼
直接封装帧   广播 ARP 请求
并发送       目标MAC=FF:FF:FF:FF:FF:FF
                │
                ▼
       局域网内所有主机收到广播
                │
         ┌──────┴──────┐
       IP不符         IP匹配(主机B)
         │                 │
         ▼                 ▼
       丢弃          单播回复 ARP 应答
                     附上自己的 MAC
                          │
                          ▼
                   主机A收到应答
                   更新 ARP 缓存
                          │
                          ▼
                   封装数据帧并发送

RFC 826 接收处理的关键优化

RFC 826 对报文接收处理有一个重要优化:在查看操作码(请求/应答)之前,先将发送方的 <协议类型, 发送方IP, 发送方MAC> 三元组合并到本地翻译表中

这是基于”通信通常是双向的”假设——如果 A 要和 B 通信,B 很可能也会需要和 A 通信,提前缓存对方信息可以减少一次广播。


五、ARP 缓存

每台网络设备都维护一张 ARP 缓存表,存储 IP 地址与 MAC 地址的映射关系。

动态 ARP 表项的生命周期

状态 说明
新建后 2 分钟内未使用 自动过期删除
持续使用中 每次使用续期 2 分钟
最长生命周期 10 分钟,到期必须重新解析

表项类型

  • 动态表项:由 ARP 协议自动学习,可老化,可被新报文更新,可被静态表项覆盖。
  • 静态表项:由管理员手工配置,不老化,优先级更高,适合固定设备。

常用命令

arp -a        # 查看 ARP 缓存表(Windows/Linux/macOS)
arp -s IP MAC # 添加静态 ARP 表项
arp -d IP     # 删除指定 ARP 表项

六、免费 ARP(Gratuitous ARP)

免费 ARP 是一种特殊的 ARP 请求,请求的是自己的 IP 对应的 MAC 地址(发送方 IP = 目标 IP)。发送方通常不期望收到应答,目的不是地址解析,而是”宣告”。

与普通 ARP 的区别

字段 普通 ARP 请求 免费 ARP 请求
目标 IP(ar$tpa 其他主机的 IP 自己的 IP
目标 MAC(ar$tha 全 0 全 0 或广播
期望收到应答? 否(收到则说明有冲突)

三大用途

① IP 地址冲突检测

设备接口 Up 时主动发送免费 ARP。正常情况下不会收到应答;若收到,说明局域网内已有设备占用了该 IP。

② 通告新 MAC 地址

设备更换网卡后,主动广播免费 ARP,让局域网内其他设备将 ARP 缓存中的旧 MAC 更新为新 MAC,无需等待老化。

③ VRRP 主备切换

备机接管主机 IP 后,立即发送免费 ARP,通知网络中所有设备更新 IP→MAC 映射,确保流量切换瞬间生效。


七、ARP 代理(Proxy ARP)

如果 ARP 请求来自一个网络的主机,目标主机在同一 IP 网段但不在同一物理网络(被路由器分隔),连接两个网络的路由器可以代为回答该 ARP 请求,将自己的 MAC 地址作为应答返回。

主机A                路由器                主机B
192.168.1.100    左口:192.168.1.1    192.168.1.200
      │          右口:192.168.1.2         │
──────┴────────────────────────────────── ┴──────
   物理网络1                            物理网络2

A 广播:谁是 192.168.1.200?
路由器代答:我是(用自己的 MAC)
A 把数据发给路由器,路由器再转发给 B

注意:Proxy ARP 可能掩盖真实的网络拓扑,且容易被滥用于 ARP 欺骗攻击,建议在安全敏感环境中关闭。


八、局限性与安全隐患

局限性

ARP 是局域网内部协议,只能解析同一广播域内的 IP→MAC 映射。跨路由器的传输由上层路由协议处理,ARP 无法解析远端主机的 MAC(也不需要,因为只需要下一跳网关的 MAC)。

安全隐患:ARP 欺骗(ARP Spoofing)

ARP 协议建立在网络中各主机互相信任的基础上,主机收到 ARP 应答时不会验证其真实性,直接写入缓存。

攻击者可以主动发送伪造的 ARP 应答,将自己的 MAC 地址映射到某个合法 IP(如网关 IP),从而:

  • 流量劫持:截获原本发往网关或其他主机的数据包
  • 中间人攻击(MitM):在转发流量的同时监听或篡改内容
  • 拒绝服务(DoS):将流量引向不存在的 MAC,使通信中断

常见防护措施

措施 说明
动态 ARP 检测(DAI) 交换机检查 ARP 报文合法性,结合 DHCP Snooping 绑定表验证
静态 ARP 绑定 对重要设备(如网关)手工绑定 IP-MAC,防止被篡改
ARP 防火墙 终端软件拦截异常 ARP 报文
802.1X 端口认证 从接入层控制非法设备入网

九、IPv6 中的替代协议

ARP 仅用于 IPv4。IPv6 使用 NDP(Neighbor Discovery Protocol,邻居发现协议) 替代 ARP,集成在 ICMPv6 中(RFC 4861),功能更完善,还支持路由器发现、地址自动配置等特性。