ARP缓存更新机制
众所周知,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 会恢复。原因暂不明。