TCP/IP之ARP協議
阿新 • • 發佈:2019-01-29
1. 地址解析協議(ARP)提供了一種在IPv4地址和乙太網地址之間的動態對映。
備註:
[1]. ARP僅用於IPv4,IPv6使用ICMPv6來完成類似的功能。
[2]. ARP僅工作在同一IP子網,這意味著ARP快取中只會存在位於同一IP子網中的ARP表項。
2. ARP幀格式(不考慮802.1q或其他標記)
欄位名 佔用長度 解釋
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地址
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格式上一樣)。
備註:
備註:
[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
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.
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通告分組: