Terence's Blog

Jugglers and singers require applause.

系统收到两个ARP Reply时的处理机制

当主机发送ARP Requst(请求)包后同时收到两个ARP Reply(应答)包包含不同的MAC地址时主机会怎么处理呢?今天在公司测试时就碰到了这个问题。

ping 172.16.14.1

用Wireshark抓到了ARP Requst、ARP Reply交互的过程,发现主机收到了两个几乎同时到达的ARP Reply报文

测试发现:

  • Windows系统以最后收到的ARP Reply的内容更新ARP缓存表

  • Linux系统以最先收到的ARP Reply的内容更新ARP缓存表

windows系统中收到第一个ARP Reply时将它写入ARP缓存表,接着又收到第二个ARP Reply,于是把ARP缓存表中对应的旧表项覆盖了,这是符合逻辑的。但为什么Linux系统中ARP表项不会被第二个ARP Reply覆盖?

类Unix系统中有这么一个文件:/proc/sys/net/ipv4/neigh/DEV/locktime

找到的一个文档是这样解释的

An ARP/neighbor entry is only replaced with a new one if the old is at least locktime old. This prevents ARP cache thrashing.

以上面为例,当收到第二个ARP Reply报文时,距离上次更新的时间小于locktime(Archlinux默认99秒),因此系统不会更新ARP缓存表。