1. 程式人生 > >TCP/IP之ARP協議

TCP/IP之ARP協議

1. 地址解析協議(ARP)提供了一種在IPv4地址和乙太網地址之間的動態對映。
   備註:
        [1]. ARP僅用於IPv4,IPv6使用ICMPv6來完成類似的功能。
        [2]. ARP僅工作在同一IP子網,這意味著ARP快取中只會存在位於同一IP子網中的ARP表項。

2. ARP幀格式(不考慮802.1q或其他標記)
    欄位名               佔用長度    解釋

    dst-mac             6Bytes      目的乙太網地址,對於ARP請求,該欄位為鏈路層廣播地址ff:ff:ff:ff:ff:ff;

                                            對於ARP應答,該欄位為對應ARP請求報文中的src-mac

    src-mac            6Bytes      源乙太網地址
    type                 2Bytes      ARP協議號0x0806

    硬體地址型別    2Bytes      對於乙太網,該值為1(事實上ARP幾乎只會描述乙太網型別的硬體地址)
    協議地址型別    2Bytes      對於IPv4,該值位0x0800(同樣的,ARP幾乎只會描述IPv4型別的協議地址)
    硬體地址長度    1Bytes      乙太網地址固定為6位元組
    協議地址長度    1Bytes      IPv4地址固定為4位元組
    操作碼             2Bytes       標識該ARP的具體操作,目前基本只存在ARP請求(1)和ARP應答(2)這兩種
        
    源硬體地址      6Bytes       跟src-mac欄位內容重複
    源協議地址      4Bytes       通常就是傳送方的IPv4地址

    目的硬體地址   6Bytes       對於ARP請求,該欄位全0;

                                           對於ARP應答,該欄位為對應ARP請求報文中的src-mac

    目的協議地址    4Bytes      通常就是目的IPv4地址

3. ARP協議基本工作流程如下:
        請求方發出一個攜帶ARP請求的鏈路層廣播幀;
        同一廣播域中的所有主機都會接收到該ARP請求,IP地址不匹配的主機直接丟棄;
        只有IP地址匹配的主機會響應一個ARP應答,這個應答中包含了所請求的IPv4地址以及對應的MAC地址,並且這個ARP應答通常直接是以單播的形式發給請求方;
        同時應答方會學習ARP請求中請求方的IPv4地址和對應的MAC地址,並將這種對映關係記錄在其ARP快取表中;
        最後,ARP應答被請求方接收,將請求到的對映關係記錄在其ARP快取表中。至此兩邊主機的ARP快取表中都有了對方的ARP表項

4.
ARP快取為系統中所有介面維護協議地址到硬體地址的最新對映關係,每條動態ARP表項的老化時間是20分鐘。
   linux中使用arp命令操作ARP快取,常用options如下:
        -a              顯示ARP快取中的所有ARP表項
        -s <IP/host> <MAC>   手動新增一條ARP表項(這種靜態ARP表項不會老化)
        -d <IP/host>         刪除指定ARP表項(刪除後這條ARP表項還會殘留,但標記為incomplete)
   備註:
        [1]. 如果系統收到的ARP請求來自一個已經記錄在ARP快取中的IPv4地址,則這條ARP表項記錄的MAC地址會被該ARP請求重新整理,並且還通常伴隨著老化時間復位。
        [2]. linux中如果對一個同一IP子網中的不存在主機發起ARP請求,則會在ARP快取中記錄一條標記為incomplete的對應的ARP表項。

5. IPv4地址衝突檢測(ACD),顧名思義,就是用來檢測同一廣播域中的IPv4地址是否存在衝突。
   標準的ACD定義了以下兩類分組:
        [1]. ARP探測分組,用於探測一個候選IPv4地址是否已經被廣播域中的任何其他系統所使用。
             當一個介面被啟用或從睡眠中喚醒或一個新鏈路建立時觸發ARP探測分組。
             該分組格式上是3個特殊的ARP請求報文,其中"源協議地址"欄位被設定為0,"目的協議地址"欄位為本機準備使用的候選IPv4地址。
             備註:
                "源協議地址"欄位被設定為0可以避免候選IPv4地址被另一臺主機使用時的ARP快取汙染
        [2]. ARP通告分組,用於通告發送方使用候選IPv4地址的意圖,確保廣播域中相關係統的該ARP表項(如果存在)正確反映了當前使用的地址。
             當本機在傳送ARP探測分組期間沒有收到針對相同候選IPv4地址的ARP請求或應答,意味著在廣播域中沒有發現衝突,則開始向廣播域中傳送ARP通告分組。
             該分組格式上是2個特殊的ARP請求報文,其中"源協議地址"欄位和"目的協議地址"欄位都被設定為本機準備使用的候選IPv4地址(這跟免費ARP格式上一樣)。
   備註:

        在多臺裝置上的測試發現,實際系統似乎並不一定嚴格遵守了標準的ACD機制,比如有的省略了ARP通告分組: