主機有時會使用自己的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