4. ARP协议:从抓包看地址解析的台前幕后
ARP协议,说白了就是“谁有IP地址X.X.X.X?请告诉我你的MAC地址”。它工作在数据链路层和网络层之间,负责把IP地址翻译成MAC地址。没有它,你的数据包连局域网都出不去。
我记得刚入行那会儿,有一次线上服务突然大面积超时,排查了半天,最后发现是ARP表被污染了。从那以后,我对ARP协议就格外上心。今天咱们就通过抓包,把ARP的请求、响应、缓存、免费ARP这些细节彻底捋一遍。
核心要点:ARP是局域网通信的基石。主机在发送IP数据包前,必须先通过ARP获取目标IP对应的MAC地址。
4.1 ARP请求与响应:一问一答的原始模型
ARP的工作模式特别简单:广播问,单播答。我画个图你就明白了。
抓包的时候,ARP请求包有几个关键字段你得会看:
| 字段 | 值(示例) | 说明 |
|---|---|---|
| Hardware Type | 1 | 以太网 |
| Protocol Type | 0x0800 | IPv4 |
| Operation | 1(请求)/ 2(响应) | 区分是问还是答 |
| Sender MAC | AA:BB:CC:DD:EE:01 | 发送方的MAC地址 |
| Sender IP | 192.168.1.10 | 发送方的IP地址 |
| Target MAC | 00:00:00:00:00:00 | 请求包中填0,响应包中填目标MAC |
| Target IP | 192.168.1.20 | 要查询的IP地址 |
抓包小技巧:在Wireshark里直接输入 arp 过滤,就能只看ARP报文。请求包的目标MAC是广播地址 ff:ff:ff:ff:ff:ff,一眼就能认出来。
4.2 ARP缓存:别每次都广播问
你想想看,如果每次发数据前都广播一次,那网络里全是ARP请求,效率太低了。所以操作系统会把刚学到的IP-MAC映射关系缓存起来。
在Linux上,你可以用 arp -n 或者 ip neigh show 查看ARP缓存表:
# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.1.1 ether 00:11:22:33:44:55 C eth0
192.168.1.20 ether aa:bb:cc:dd:ee:02 C eth0
192.168.1.100 ether 11:22:33:44:55:66 C eth0
缓存条目有个老化时间,不同系统不一样:
| 操作系统 | 默认超时时间 | 备注 |
|---|---|---|
| Linux | 60秒(完整条目) | 不活跃条目15秒后标记为stale |
| Windows | 120秒(未使用) | 使用中条目会刷新 |
| macOS | 1200秒(20分钟) | 比较长,但会定期探测 |
我曾经踩过的坑:有一次做网络割接,把一台服务器的IP从旧机器迁移到新机器。结果旧机器的ARP缓存没清,新机器上线后,交换机还按旧MAC转发数据,导致业务中断了半小时。从那以后,我每次做IP迁移,都会先手动清一下网关和核心设备的ARP缓存。
4.3 免费ARP:我来了,都记住我
免费ARP(Gratuitous ARP)是个很有意思的东西。它本质上是一个ARP请求,但目标IP是自己的IP。说白了就是主机在说:“大家注意,我的IP是X.X.X.X,我的MAC是YY:YY:YY:YY:YY:YY,都给我记好了!”
免费ARP主要有三个用途:
- IP地址冲突检测:主机上线时发一个免费ARP,如果收到响应,说明网内有人用同一个IP,赶紧报错。
- 更新其他主机的ARP缓存:比如网卡换了、IP漂移了,发个免费ARP让大家都刷新一下。
- 网关冗余(VRRP/HSRP):主备切换时,新主设备发免费ARP,让交换机把流量切过来。
抓包的时候,免费ARP长这样:
Ethernet II, Src: 00:1a:2b:3c:4d:5e, Dst: ff:ff:ff:ff:ff:ff
Address Resolution Protocol (Gratuitous ARP)
Hardware type: Ethernet (1)
Protocol type: IPv4 (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: request (1)
Sender MAC address: 00:1a:2b:3c:4d:5e
Sender IP address: 192.168.1.100
Target MAC address: 00:00:00:00:00:00
Target IP address: 192.168.1.100 <-- 注意这里,目标IP等于发送方IP
关键区别:免费ARP的目标IP地址等于发送方IP地址。普通ARP请求的目标IP是你要查询的IP,而免费ARP的目标IP就是自己。
4.4 抓包实战:ARP交互全过程
咱们用Wireshark实际抓一次ARP交互。场景是这样的:主机A(192.168.1.10)第一次ping主机B(192.168.1.20)。
抓包结果如下:
No. Time Source Destination Protocol Info
1 0.000000 192.168.1.10 Broadcast ARP Who has 192.168.1.20? Tell 192.168.1.10
2 0.001234 192.168.1.20 192.168.1.10 ARP 192.168.1.20 is at aa:bb:cc:dd:ee:02
3 0.001456 192.168.1.10 192.168.1.20 ICMP Echo (ping) request
4 0.002345 192.168.1.20 192.168.1.10 ICMP Echo (ping) reply
整个过程就三步:
- 第1包:主机A广播ARP请求,问谁是192.168.1.20。
- 第2包:主机B单播ARP响应,告诉主机A自己的MAC地址。
- 第3-4包:主机A拿到MAC地址后,直接发送ICMP ping包,主机B回复。
注意看时间戳。ARP请求和响应之间只隔了1.2毫秒,非常快。而且后续的ping包直接就是单播了,不再需要ARP。
我个人的习惯:排查网络问题时,我会先看ARP缓存是否正常。如果ping不通,先 arp -n 看看目标IP有没有对应的MAC地址。如果没有,说明ARP解析失败了,问题大概率在二层。
4.5 ARP的局限性:为什么IPv6要换邻居发现协议
ARP虽然简单好用,但有几个硬伤:
- 无认证机制:任何人都可以伪造ARP响应,这就是ARP欺骗攻击的原理。
- 广播风暴风险:如果网内设备很多,ARP广播会消耗大量带宽。
- 跨网段不行:ARP只在同一广播域内有效,访问其他网段必须通过网关。
所以IPv6干脆抛弃了ARP,改用邻居发现协议(NDP),用ICMPv6报文来实现地址解析,还加入了安全机制。
安全提醒:ARP欺骗是局域网攻击的常见手段。攻击者发送伪造的ARP响应,让受害者的流量经过自己的机器。防范方法包括:静态ARP绑定、使用DAI(动态ARP检测)、部署802.1X认证。
好了,ARP协议的核心内容就这些。从请求响应到缓存管理,再到免费ARP的特殊用法,抓包都能看得一清二楚。下次你在Wireshark里看到ARP报文,应该能一眼认出它在干什么了。