众所周知,ARP 是一个链路层的地址解析协议,它以IP地址为键值,查询保有该IP地址主机的MAC地址。但是 ARP 协议的规范只是阐述了地址解析的细节,并没有规定协议栈的实现如何去维护ARP缓存,所以抽空搭建了环境,测试了下 ARP 缓存更新的一些机制。

Linux ARP 相关配置:/proc/sys/net/ipv4/neigh/ethX

状态机

状态机

更新机制

更新机制

QA

  • 为什么 stale 状态之后很久都不会被删除?
    其实这是因为还有路由缓存项在使用它,此时删除路由缓存之后,arp表项很快被删除。

    1
    ip route flush cache
  • 为什么 request 可以更新缓存? replay 却有限制?
    (猜测未证实)”本地确认“机制不仅在 delay 状态有效,reachable 也有用,但需要注意的是 delay 状态是由于引用将状态由 stale 推进至 delay,虽然 reachable 不会改变状态,但单边的 replay 不存在本地引用的过程。笔者认为,add 的前提条件是本地确认和引用,update 的条件是本地确认,replay 虽然达成本地确认的条件,但由于 lock 或其它未知原因,只能暂时刷新。

  • 不同 replay,为什么 windows 优选后者,linux 优选前者?
    优选后者符合逻辑,Linux 存在锁定时间(cat /proc/sys/net/ipv4/neigh/eth0/locktime),但强制多次会暂时更新,且无论是否锁定时间已过,都只是暂时更新,停止 replay 会恢复。原因暂不明。