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请求与响应流程 主机A IP: 192.168.1.10 主机B IP: 192.168.1.20 广播域(同一网段) ① ARP请求(广播) “谁是192.168.1.20?请告诉192.168.1.10” ② ARP响应(单播) “我是192.168.1.20,我的MAC是 AA:BB:CC:DD:EE:02” 交换机 交换机学习MAC地址,后续数据帧直接转发

抓包的时候,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. 第1包:主机A广播ARP请求,问谁是192.168.1.20。
  2. 第2包:主机B单播ARP响应,告诉主机A自己的MAC地址。
  3. 第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报文,应该能一眼认出它在干什么了。