ARP協議工作原理
以太網ARP請求/應答報文詳解
以太網ARP請求/應答報文格式如下圖所示:
硬件類型 | 協議類型 | 硬件地址長度 | 協議地址長度 | 操作 | 發送端以太網地址 | 發送端IP地址 | 目的端以太網地址 | 目的端IP地址 |
2字節 | 2字節 | 1字節 | 1字節 | 2字節 | 6字節 | 4字節 | 6字節 | 4字節 |
以太網ARP請求/應答報文各字段介紹:
硬件類型字段定義物理地址的類型,MAC地址使用1來表示。
協議類型字段表示要映射的協議地址類型,IP地址使用0x800表示。
硬件地址長度和協議地址長度,顧名思義,代表他們由幾個字節來表示。以太網類型的硬件地址長度需要6個字節來表示,IP(V4)類型的協議地址長度需要4個字節來表示。
操作字段指出4種操作類型:ARP請求(值1)、ARP應答(值2)、RARP請求(值3)、RARP應答(值4)。
最後4個字段指定通信雙方的以太網地址與IP地址。發送方需要指定除了目的端的以太網地址外的其他三個地址,從而構建出ARP請求並發送出去。接受端發送ARP請求的目的端IP地址是自己,就將自己的以太網地址填充到裏面,並且交換發送端與目的端的以太網地址和IP地址,將操作字段的值設置為2並發送出去。
由上表可知,ARP報文的長度為28字節。如果再加上以太網幀的頭部與尾部的18個字節,則一個攜帶ARP請求/應答包的以太網幀的長度為46個,字節。不過有些要求以太網幀的數據部分的長度不低於46個字節,所以ARP請求/應答包將增加一些填充字節,以滿足該要求。在這種情況下,一個攜帶ARP請求/應答的以太網幀的長度為64個字節。
2. ARP高速緩存的查看和修改
通常ARP會維護一個高速緩存,其中保存著經常訪問(例如網關地址)以及最近訪問的機器的IP地址到物理地址的映射。這樣避免了重復的ARP請求,大大提高了發送數據包的速度。
Linux可以使用arp命令來查看和修改ARP高速緩存。例如:我的Ubuntu在某一時刻(註意:ARP高速緩存是動態變化的)的ARP高速緩存內容如下(命令arp -a)
第一行描述的是本機在docker0上面的IP地址與MAC地址,第二行描述的是本機在eth0上面的IP地址與MAC地址。下面兩條命令分別是刪除和添加一條ARP高速緩存項
$sudo arp -d 192.168.48.254 #刪除ARP緩存項
$sudo arp -s 192.168.48.254 00:50:56:e6:2d:1f #添加ARP緩存項
3. 使用tcpdump觀察ARP通信過程
為了清楚地了解ARP的通信過程,我們從本機上使用telnet命令登錄到docker0的echo服務(已開啟echo服務),並且使用tcpdump抓取兩個測試機器交換的以太網幀,具體操作如下所示:
$sudo arp -d 172.17.0.2 #清楚ARP緩存中的docker0的緩存項
$sudo tcpdump -i docker0 -ent '(dst 172.17.0.2 and src 172.17.0.1) or (dst 172.17.0.1 and src 172.17.0.2)' #開始抓包
$telnet 172.17.0.2 echo #在新的終端上面輸入該命令
在執行telnet命令之前,應該先使用arp -d 命令清除arp緩存區。否則的話,ARP通信將不被執行,我們也就無法獲得包含ARP的以太網幀。tcpdump抓取的眾多數據包中,只有最靠前的兩個與ARP通信有關系,現將內容列舉到下面:
1. 02:42:56:39:22:6e > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 172.17.0.2 tell 172.17.0.1, length 28
2. 02:42:ac:11:00:02 > 02:42:56:39:22:6e, ethertype ARP (0x0806), length 42: Reply 172.17.0.2 is-at 02:42:ac:11:00:02, length 28
由tcpdump抓取的數據包本質上還是以太網幀,我們通過該命令的眾多選項來控以太網幀制幀的過濾(比如:使用dst與src來指定目標端的IP地址與源端的IP地址)和顯示(使用 -e來顯示以太網幀的頭部信息)
第一個以太網幀數據包中,ARP的源端的物理地址是02:42:56:39:22:6e,目標端的物理地址是ff:ff:ff:ff:ff:ff,這是以太網的廣播地址,用來表示整個LAN。該LAN上的所有機器都會收到並處理這樣的幀。0x0806是以太網幀頭部的類型字段的值,它表示分用的模塊是ARP模塊。該以太網幀的長度是42個字節,其中數據部分的長度是28個字節。Request 表示這是一個ARP請求。“who-has 172.17.0.2 tell 172.17.0.1”表示本機要查詢的docker0的IP地址。
第二個以太網幀數據包中,ARP的源端的物理地址是02:42:ac:11:00:02,目標端的物理地址是02:42:56:39:22:6e。Reply表示這是一個ARP應打包。“172.17.0.2 is-at 02:42:ac:11:00:02”表示目標機器報告其物理地址。
ARP協議工作原理