歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核分析 - 網絡[十]:ARP雜談

Linux內核分析 - 網絡[十]:ARP雜談

日期:2017/3/3 16:38:14   编辑:Linux內核

內核版本:2.6.34

雜談一:重復地址檢測

Linux協議棧中處理重復地址檢測報文的是arp_process()中的一段代碼, RFC2131是DHCP的草案,相應的sip==0是DHCP服務器用來檢測它所分發的地址是否重復的。

/* Special case: IPv4 duplicate address detection packet (RFC2131) */ 
if (sip == 0) {
    if (arp->ar_op == htons(ARPOP_REQUEST) &&
         inet_addr_type(net, tip) == RTN_LOCAL &&
         !arp_ignore(in_dev, sip, tip))
    arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
            dev->dev_addr, sha);
    goto out;
}

而根據RFC826中描述,正常的重復地址檢測報文特征是sip==tip

The gratuitous ARP packet is an ARP request with both sender's and the target's IP address fields containing the configured IP address.

A gratuitous ARP packet on an Ethernet is defined as

48.bit Destination Address = 0xffffffffffff (broadcast)

48.bit Source Address = Hardware adderss of interface

16.bit Frame type = 0x806 (ARP)

----------------------

16.bit Hardware type = 0x1 (Ethernet)

16.bit Protocol Type = 0x800 (IP)

8.bit Hardware Address size = 6

8.bit Protocol Address size = 4

16.bit Opcode = 1 (Request)

48.bit Sender Ethernet Address = Hardware address of interface

32.bit Sender IP Address = Configured IP address

48.bit Target Ethernet Address = Don't care

32.bit Target IP Address = Configured IP Address

問題:

linux協議棧除了對RFC2131規定的DHCP服務器使用的地址檢測格式進行響應,對RFC826中 規定的gratuitous arp報文不作處理,該報文會被協議棧直接丟棄掉。

實際情況是,在啟動linux網絡或配置新的IP時, Linux Host不會進行重復地址檢測,並且,對於其它主機發來的重復地址檢測報文也不會處理。

測試環境如下:

Linux Host的IP為 192.168.1.1,然後配置Windows Host的IP為192.168.1.1,Windows Host會發送gratuitous arp,但Linux Host並不會回應,默 許了兩個重復地址的存在。[誰能幫忙解釋下,感激]

雜談2:NUD狀態轉移的實際理解

根據NUD的狀態轉移,實際測試兩種 情況:NUD_INCOMPLETE和NUD_PROBE。

NUD_INCOMPLETE

Linux Host隨便telnet一個沒有使用的IP1,協議棧會為會IP1創建 一個鄰居表項,狀態由NUD_NONE遷移到NUD_INCOMPLETE,具體的協議棧流程在上篇ARP [http://blog.csdn.net/qy532846454/article/details/6806197]中分析的。

在Linux Host上telnet XX.XX.86.198,捕獲到 的發包狀況如下:

這三個報文是在進入NUD_INCOMPLETE狀態後,嘗試了3次ARP廣播(因為還未收到對方報文),對應arp_tbl中的參數 mcast_probe=3次數,每次嘗試間的時間間隔近似1s,對應arp_tbl中的參數retrans_time = 1HZ。

NUD_PROBE

NUD_PROBE測 試復雜一點,先由一台Host1(IP2)向Linux Host發送arp request請求,協議棧會為IP2創建一個鄰居表項,狀態由NUD_NONE - > NUD_STALE,然後Linux Host會響應request,狀態由NUD_STALE -> NUD_DELAY -> NUD_PROBE,具體的協議棧流程在 上篇ARP[http://blog.csdn.net/qy532846454/article/details/6806197]中分析的。

由Host1構造假arp request(sip=未被 使用IP, tip=Linux Host IP)給Linux Host,捕獲到的發包狀況如下:

每一個包是Host1發出的request,每二個包是Linux Host的回復,後三個包是3次ARP單播嘗試,此時處於NUD_PROBE狀態要嘗 試對方是否存活,由於sip使用的是虛假址,因此沒有響應,在嘗試了最大次數3次,對應arp_tbl中的參數ucast_probe=3次數, 每次嘗試的間隔時間近似1s,對應arp_tbl中的參數retrans_time=1HZ。

對比下windows這方面的處理可以發現,兩者在這方 面的行為相差很大:比如windows的網絡協議棧會處理RFC826所規定的gratuitous arp報文;windows的arp嘗試只會進行一次。

Copyright © Linux教程網 All Rights Reserved