IP冲突-- Gratuitous ARP
主机有时会使用自己的IP地址作为目标地址发送ARP请求。这种ARP请求称为Gratuitous ARP,主要有两个用途:
(1)检查重复地址(如果收到ARP响应表明存在重复地址)。
在windows NT下,网卡启动时,TCP/IP协议栈初始化时会最大发送3次Gratuitous ARP请求(初始化1次,0.5s,1s时各一次),当请求收到回应,Window NT将关闭协议栈,并警告用户IP冲突。
弹框或小黄条大家应该都不陌生,如果设置的只有一个静态IP,因为协议栈被关闭,无法上网。查看ipconfig 看不到受影响的IP地址。也就是说,IP地址谁先拿到就是谁的。
(2)用于通告一个新的数据链路标识。当一个设备收到一个arp请求时,发现arp缓冲区中已有发送者的IP地址,则更新此IP地址的MAC地址条目。
Windows NT 启动的时候广播 Gratuitous ARP,除了确认IP冲突外,那就是更新周边设备的ARP缓存。这对高可用方案中快速切换尤为重要,当IP 对应的MAC地址变了,如果周边设备缓存未更新、等到数据发送失败ICMP应答后重新发送ARP请求已经过了很长时间了。
注意此策略在Window Server 2008 下有所改动,Server 2008 在收到Gratuitous ARP 时并不会更新自己的路由表,Windows是为了考虑Gratuitous ARP 请求可能是冲突的设备发出来的,如果更新缓存会带来不少问题。怎么说了更与不更都会有些问题,最好的解决方案莫过于VRRP 实现的VIP地址,使用虚拟的MAC地址,在IP漂移的时候不必考虑ARP缓存问题。
到这也许会疑问我为啥只说Windows,是因为linux 压根不识别Gratuitous ARP:不发送、也不处理。这就是说linux下IP冲突问题就大发了,每次你问IPXX是谁?都有两个人回答你…当然具体数据发给了谁,看运气,对于服务器谁得应答先到,对于网络设备那就不同厂商的不一个样了,反正就是乱套了。
也许会想,还挺不错啊,变相的负载均衡。。。(类似 LVS DR模式)不过听网建的同学说,linux IP冲突会造成网络设备的负担,网络设备ARP 缓存处理需要靠CPU计算,两台机器搞来搞去就把设备CPU跑到90%+。
参考资料:
http://wiki.wireshark.org/Gratuitous_ARP
http://support.microsoft.com/kb/199773
http://serverfault.com/questions/268253/windows-2008-ignores-gratuitous-arp-requests