计算机网络-ARP 协议详解
一、背景与产生原因
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),功能更完善,还支持路由器发现、地址自动配置等特性。
