數據鏈路層如以太網或令牌環網都有本身的尋址機制(經常爲 48 bit 地址),這是使用數據鏈路的任何網絡層都必須聽從的,因此就須要將網絡層使用的協議地址轉換爲數據鏈路層使用的硬件地址.
shell
地址解析,用於將協議地址轉換爲硬件地址,或者將硬件地址轉換爲協議地址.緩存
將協議地址轉換爲硬件地址的整個流程:服務器
首先查詢內核 ARP 高速緩存表.網絡
若表中已經存在,則直接從表中取出硬件地址.併發
不然廣播 ARP 請求報文,而後等待迴應.而後從收到的 ARP 應答報文中取出硬件地址.spa
通常狀況下,當系統收到 ARP 請求或 ARP 應答報文時,都會將發送端的硬件地址,協議地址存放在 ARP 高速緩存中. 代理
不完整的表項,即只知道協議地址,殊不知道硬件地址的表項.如:code
地址 硬件地址 接口 10.223.0.1 (incomplete) wlan0 #這個就是不完整的表項.
硬件地址類型: 2 字節. /* 值爲 1 表示以太網硬件地址 */ 協議地址類型: 2 字節. /* 值爲 0x0800 表示 IP 層協議地址 */ 硬件地址長度: 1 字節. 協議地址長度: 1 字節. op: 2 字節 /* ARP 請求(值爲1),ARP 應答(值爲 2),RARP 請求(值爲 3),RARP 應答(值爲 4) */ 發送端硬件地址: 6 字節(由硬件地址長度字段決定,通常爲 6 個字節) 發送端協議地址: 4 字節(由協議地址長度字段決定) 接收端硬件地址: 6 字節(由硬件地址長度字段決定) 接收端協議地址: 4 字節(由協議地址長度字段決定)
發送 ARP 請求報文接口
構建 ARP 請求報文:{1;0x8000;6;4;1;自身硬件地址;自身協議地址;0;接收端協議地址}; 廣播該 ARP 請求報文; /* 此時請求獲取'接收端協議地址'對應的硬件地址. */
接受到 ARP 請求報文時.路由
if(arp_rece.接收端協議地址 == 當前網絡接口.協議地址){ arp_rece.接收端硬件地址=當前網絡接口.硬件地址. op=2; /* arp 應答 */ swap(arp_rece.發送端硬件地址,arp_rece.接收端硬件地址); swap(arp_rece.發送端協議地址,arp_rece.接收端協議地址); 將 arp_rece 發送到請求方. }else 丟棄該 ARP 請求報文
當 ARP 請求是從一個物理網絡 N 上的主機 A 發送到另外一個物理網絡 M 上的主機 B,此時 ARP 請求報文只能在物理網絡 N 內廣播,不會被轉發到物理網絡 M 上,因此理論上不該該會收到迴應的.
設 C 爲連接 N,M 的路由器,若 C 被配置成 ARP 代理,則 C 在收到 ARP 請求報文後,會將自身的硬件地址填入併發送 ARP 應答報文.此時 M,N 能夠共用一個子網號(通常狀況下,一個子網號中只能容納一個物理網絡).整個過程以下:
因爲 A,D 具備相同的子網號,因此此時 A 準備將 IP 數據包直接傳送給 D.即 A 將 (D的協議地址,IP 數據包) 送往網絡接口.
網絡接口廣播 ARP 請求分組請求獲得 D 的硬件地址,此時幀的格式:
ff:ff:ff:ff:ff:ff;A 的硬件地址;ARP;1;0x8000;6;4;1;A 的硬件地址;A 的協議地址;0;D 的協議地址
3. 路由器 C 收到該 ARP 請求幀,而且 C 已經被配置成 ARP 代理,因此此時 C 用本身的硬件地址來回答,幀的格式:
A 的硬件地址;C 的硬件地址;ARP;1;0x8000;6;4;2;C 的硬件地址;D 的協議地址;A 的硬件地址;A 的協議地址
4. A 收到了'D 的硬件地址'(其實是 C 的硬件地址),此時構建數據幀發送 IP 數據包,幀格式:
C 的硬件地址;A 的硬件地址;IP;IP 數據包的內容....
此時在 A 上運行 arp 命令
A$ arp -n 地址 類型 硬件地址 標誌 Mask 接口 10.201.1.62 ether 68:5d:43:f3:c3:e3 C eth0 10.201.1.100 ether f8:0f:41:58:63:fb C eth0 10.201.1.28 ether 18:9e:fc:7a:57:53 C eth0 10.201.1.254 ether 00:03:0f:12:c8:00 C eth0 10.201.1.107 ether f8:0f:41:58:63:fb C eth0 # f8:0f:41:58:63:fb 具備2個 IP 地址,因此能夠推測出 f8:0f:41:58:63:fb 起着 ARP 代理的功能.
指主機發送 ARP 查找本身的IP地址,一般,它發生在系統引導期間進行接口配置的時候.此時 ARP 請求分組格式:
1;0x8000;6;4;1;主機的硬件地址;主機的協議地址;0;主機的協議地址. # 此時接收端協議地址 == 發送端協議地址.
免費 ARP 請求的用途:
一個主機能夠經過它來肯定另外一個主機是否設置了相同的 IP 地址,若主機在發送免費 ARP 請求以後收到了 ARP 應答,則代表另外一個主機與當前主機設置了相同的 IP 地址.
用於更新其餘主機高速緩存表中相應的表項
用於將硬件地址轉換爲協議地址.通常無盤機(沒有硬盤的主機)在引導時會發送 RARP 請求報文來獲取自身的 IP 地址.
RARP 分組格式與 ARP 分組格式相同.見上.
無盤主機廣播 RARP 請求報文,此時 RARP 分組格式:
1;0x8000;6;4;3;自身硬件地址;0;0;0 # 注意 RARP 請求時,op==3
由 RARP 服務器負責 RARP 的響應,RARP 響應報文以單播的形式發送,此時 RARP 分組格式:
1;0x8000;6;4;4;RARP 服務器硬件地址;RARP 協議地址;無盤主機硬件地址;無盤主機協議地址