1. 程式人生 > >ARP協議工作原理

ARP協議工作原理

-s docke roc 部分 sim p地址 mil ip地址 以太網

ARP協議可以完成任意網絡地址到任意物理地址的轉化,本次主要講解IP網絡地址到以太網(MAC地址)地址的轉化。ARP的工作原理:主機向自己所在的網絡廣播一個ARP請求,該請求包含目標機器的網絡地址。該網絡中的其他機器都會收到這個ARP請求,但只有包含目標網絡地址的機器會回應這個ARP請求,並且回應的信息中包含目標的物理地址。

  1. 以太網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協議工作原理