ARP 协议详解
为什么需要 ARP
IP 地址是逻辑地址,就像你快递单上的收件人姓名;MAC 地址是物理地址,就像收件人的身份证号。邮局(路由器)看姓名决定送到哪个城市,但最后一公里快递员必须核对身份证号才能交到本人手上。
ARP(Address Resolution Protocol,地址解析协议,RFC 826) 的作用就是:已知对方的 IP 地址,查询对方的 MAC 地址。
ARP 工作流程:广播问,单播答
场景:主机 A(192.168.1.10)想 ping 主机 B(192.168.1.20)
第一步:查 ARP 缓存
主机 A 先翻自己的"通讯录"(ARP 缓存表):
Windows: arp -a
Linux: ip neigh
如果找到 192.168.1.20 → 00:1B:2C:3D:4E:5F,直接封装以太网帧发送。
第二步:发送 ARP 请求(广播)
如果没找到,主机 A 在子网内大喊(广播):
"谁是 192.168.1.20?请告诉我你的 MAC 地址!"
以太网目的 MAC: FF:FF:FF:FF:FF:FF(广播)
以太网源 MAC: 00:AA:BB:CC:DD:EE(主机 A)
ARP 操作码: 1(请求)
发送方 IP: 192.168.1.10
发送方 MAC: 00:AA:BB:CC:DD:EE
目标方 IP: 192.168.1.20
目标方 MAC: 00:00:00:00:00:00(未知,填零)
整个子网的所有设备都会收到这个广播,但只有 IP 是 192.168.1.20 的主机 B 会回应。
第三步:ARP 响应(单播)
主机 B 单播回复主机 A:
"我是 192.168.1.20,我的 MAC 是 00:1B:2C:3D:4E:5F"
以太网目的 MAC: 00:AA:BB:CC:DD:EE(主机 A)
以太网源 MAC: 00:1B:2C:3D:4E:5F(主机 B)
ARP 操作码: 2(响应)
发送方 IP: 192.168.1.20
发送方 MAC: 00:1B:2C:3D:4E:5F
目标方 IP: 192.168.1.10
目标方 MAC: 00:AA:BB:CC:DD:EE
第四步:更新 ARP 缓存
主机 A 收到响应后,把映射关系写入 ARP 缓存,通常保留 2~20 分钟(动态条目)。下次再访问 192.168.1.20 就不用广播了。
上图是 ARP 地址解析的完整时序。关键细节:请求是广播(FF:FF:FF:FF:FF:FF),响应是单播——只有目标主机回复,且直接单播给请求者,不再打扰其他设备。
ARP 缓存表详解
查看 ARP 表
# Windows
C:\> arp -a
接口: 192.168.1.10 --- 0x12
Internet 地址 物理地址 类型
192.168.1.1 00-50-56-c0-00-08 动态
192.168.1.20 00-1b-2c-3d-4e-5f 动态
192.168.1.88 00-50-56-ea-12-34 静态
# Linux
$ ip neigh
192.168.1.1 dev eth0 lladdr 00:50:56:c0:00:08 REACHABLE
192.168.1.20 dev eth0 lladdr 00:1b:2c:3d:4e:5f STALE
条目类型
| 类型 | 说明 | 生命周期 |
|---|---|---|
| 动态 | 通过 ARP 协议学习 | 几分钟到几十分钟,无访问则删除 |
| 静态 | 手工绑定(arp -s) | 重启前一直有效 |
ARP 状态机(Linux)
| 状态 | 含义 |
|---|---|
| REACHABLE | 刚确认过,可信 |
| STALE | 超过可达时间,但未失效,下次访问先确认 |
| DELAY | 准备发送探测,等待短暂时间 |
| PROBE | 正在发送 ARP 探测 |
| FAILED | 探测失败,无此邻居 |
Linux 的邻居缓存状态机设计精妙:REACHABLE 表示"刚确认过可信",STALE 表示"可能还可用但需验证",避免每次通信都发 ARP 请求造成广播风暴。
免费 ARP(Gratuitous ARP)
免费 ARP 是不发请求、直接广播自己的映射,操作码也是 1(请求),但发送方和目标方 IP 相同。
用途 1:IP 冲突检测
主机开机时广播:"我是 192.168.1.10,MAC 是 xx:xx:xx:xx:xx:xx"。如果子网内已有此 IP,对方会收到并报警(Windows 弹出"IP 地址冲突")。
用途 2:VRRP 主备切换
VRRP 备机升主时,广播免费 ARP:"网关 IP 192.168.1.1 的 MAC 现在改为我了"。子网内所有主机会更新 ARP 缓存,流量自动切到新主。
用途 3:更新 ARP 缓存
更换网卡后 MAC 变了,发送免费 ARP 让邻居更新。
代理 ARP(Proxy ARP)
路由器开启代理 ARP 后,会代替其他主机响应 ARP 请求。
场景:主机 A(192.168.1.10/24)想访问 192.168.2.10,但子网掩码配错了(配成 /16),以为对方在同一子网。A 发 ARP 请求找 192.168.2.10,路由器收到后代替响应:"192.168.2.10 的 MAC 是我(路由器)"。
风险:代理 ARP 会掩盖网络配置错误,增加广播流量,现代网络已不推荐开启。
ARP 欺骗与防御
ARP 欺骗(ARP Spoofing / ARP Poisoning)
攻击者 C 向 A 广播:"192.168.1.20 的 MAC 是我(C)!" 同时向 B 广播:"192.168.1.10 的 MAC 是我(C)!"
结果:A 发给 B 的流量先到 C,C 看完/改完再转发给 B。这就是中间人攻击(MITM)。
防御手段
| 手段 | 原理 |
|---|---|
| 静态 ARP 绑定 | arp -s 192.168.1.20 00:1b:2c:3d:4e:5f,但维护成本高 |
| DHCP Snooping + DAI | 交换机记录 IP-MAC 映射,拦截非法 ARP |
| 802.1X 认证 | 只有合法设备才能接入网络 |
| 动态 ARP Inspection(DAI) | Cisco 交换机特性,校验 ARP 包合法性 |
本篇小结
- ARP 解决"IP 地址 → MAC 地址"的映射问题
- 流程:查缓存 → 广播请求 → 单播响应 → 缓存结果
- 免费 ARP 用于 IP 冲突检测、VRRP 切换、MAC 更新
- 代理 ARP 已不推荐,会掩盖配置错误
- ARP 欺骗是局域网常见攻击,可用静态绑定或 DAI 防御
动手实践
查看本机 ARP 缓存:
arp -a(Win)或ip neigh(Linux)清空 ARP 缓存后 ping 网关,Wireshark 抓包观察 ARP 请求/响应:
# Windows arp -d * ping 192.168.1.1 # Linux ip neigh flush all ping 192.168.1.1Wireshark 过滤
arp,观察操作码(Opcode)1=请求,2=响应观察免费 ARP:重启虚拟机或切换 VRRP 主备时抓包,看是否有发送方 IP=目标方 IP 的 ARP 包