ARP地址解析協議原理


概述

網絡層以上的協議用IP地址來標識網絡接口,但以太數據幀傳輸時,以物理地址來標識網絡接口。因此我們需要進行IP地址與物理地址之間的轉化。

對於IPv4來說,我們使用ARP地址解析協議來完成IP地址與物理地址的轉化(IPv6使用鄰居發現協議進行IP地址與物理地址的轉化,它包含在ICMPv6中)。 

ARP協議提供了網絡層地址(IP地址)到物理地址(mac地址)之間的動態映射。ARP協議 是地址解析的通用協議

 

 請求的例子:

 

 

 

 

MAC 地址 與 IP地址

  Mac地址由設備制造商定義/分配,每一個硬件設備都有一個鏈路層主地址(MAC地址),保存在設備的永久內存中。設備的mac地址不會改變(現在可以進行mac地址偽裝) 
  IP地址由用戶配置給網絡接口, 網絡接口的IP地址是可以發生變化的(通過DHCP獲取IP,變化速度比較快)

獲取目的端的MAC地址(在一個以太網中)步驟如下: 

         1.發送ARP請求的以太網數據幀給以太網上的每個主機,即廣播(以太網源地址填全1)。ARP請求幀中包含了目的主機的IP地址。 
         2.目的主機收到了該ARP請求之后,會發送一個ARP應答,里面包含了目的主機的MAC地址。 

ARP協議工作原理

  1. 每個主機都會在自己的 ARP 緩沖區中建立一個 ARP 列表,以表示 IP 地址和 MAC 地址之間的對應關系。
  2. 主機(網絡接口)新加入網絡時(也可能只是mac地址發生變化,接口重啟等), 會發送免費ARP報文把自己IP地址與Mac地址的映射關系廣播給其他主機。
  3. 網絡上的主機接收到免費ARP報文時,會更新自己的ARP緩沖區。將新的映射關系更新到自己的ARP表中。
  4. 某個主機需要發送報文時,首先檢查 ARP 列表中是否有對應 IP 地址的目的主機的 MAC 地址,如果有,則直接發送數據,如果沒有,就向本網段的所有主機發送 ARP 數據包,該數據包包括的內容有:源主機 IP 地址,源主機 MAC 地址,目的主機的 IP 地址等。
  5. 當本網絡的所有主機收到該 ARP 數據包時:

             (A)首先檢查數據包中的 IP 地址是否是自己的 IP 地址,如果不是,則忽略該數據包。

             (B如果是,則首先從數據包中取出源主機的 IP 和 MAC 地址寫入到 ARP 列表中,如果已經存在,則覆蓋。

             (C 然后將自己的 MAC 地址寫入 ARP 響應包中,告訴源主機自己是它想要找的 MAC 地址。

          6.源主機收到 ARP 響應包后。將目的主機的 IP 和 MAC 地址寫入 ARP 列表,並利用此信息發送數據。如果源主機一直沒有收到 ARP 響應數據包,表示 ARP 查詢失敗。

ARP工作實例

下面我們就來談一談ARP地址解析協議是如何把目的地址的IP地址轉化成MAC地址的。 


1. 首先,主機A想要向主機B發送消息,但它不知道主機B的MAC地址,只知道主機B的IP地址。這時,主機A會在當前局域網下以廣播的形式發送ARP請求數據報,表示主機A想知道主機B的MAC地址(注:廣播時,以太網首部的目的地址為全f)。 
(ARP請求數據報.png) 


2. 由於是廣播,所以在本局域網上的所有主機都會受到主機A發送的ARP數據報,然后所有主機會把以太網首部這個報頭給去掉,向上面的網絡層發送ARP數據報。在這里我們便可以回答上面的問題了,以太網首部和ARP數據報內的MAC地址都不能少,一個是在數據鏈路層使用的,一個是在網絡層使用的,因為兩個層都不能看到互相的數據。 


3. 網絡層首先會檢查op字段,發現這時個ARP請求數據報,然后又會檢查目的IP地址字段,檢查完畢后,這時除了主機B外,在這個局域網內的其他主機都會把數據報丟棄,因為只有主機B的IP地址和目的IP地址是相同的。 
(ARP應答數據報)

ARP緩存

      ARP高速緩存(即ARP表)是 ARP地址解析協議能夠高效運行的關鍵, (如果有多次ARP響應時,以最后一次響應為准)

      ARP給IP地址和MAC地址中間做了動態映射,也就是說緩存了一個ARP表,將得到的IP地址和MAC地址對應起來,如果在表中沒有查到IP地址對應的MAC地址,就會發廣播去找。隨着用戶的使用,ARP表如果不做任何措施,就會變得越來越臃腫緩慢,就降低了網絡傳輸數據的效率,所以ARP緩存中每一項被設置了生存時間,一般是20分鍾,從被創建時開始計算,到時則清除,如果在計時期間又被使用了,計時會重置。

 

我們可以通過arp命令查看arp表: 


              這里寫圖片描述 


ARP表中記錄了一些IP地址與物理地址的映射,在arp表中,我們可以看到一個Flags字段,該字段有C、M、P三種取值: 

      C: 表明arp條目為通過ARP請求動態獲取,(一般存活時間為20min) 
      M:表明arp條目為手動設置。 
      P: 表示Publish,表示該ARP條目可以用於恢復其他主機的ARP請求。(用於ARP proxy)

 

報文格式(ARP 幀)

   這里寫圖片描述

    

 

     

   這里寫圖片描述

ARP幀以以太幀的形式存在,即ARP消息包含在以太幀中 ,因此包含以太幀的首部和尾部。(這里不考慮802.1p/q等特殊以太幀)。 

這里寫圖片描述


* 幀類型*:用來向收到數據報的主機表示該數據報的類型,常見類型如下: 
0800:IP數據報; 
0806:ARP請求/應答數據報; 
8035:RAPP請求/應答; 

ARP Request or Reply Message 是ARP幀的核心部分。 

前14字節是以太網首部幀格式 ,然后后面四個字段描述了本ARP幀涉及的硬件類型和協議類型。 
Hard Type:該字段占2個字節,指定硬件地址類型, 如值為1表示為以太網地址。 
Prot Type :該字段占2個字節,指定協議地址類型,如0x0800 表示協議地址類型為IPv4地址。該值與以太幀首部的類型字段相同。 
Hard Size: 表示硬件地址的大小(單位:字節),如以太網地址為6。
Prot Size : 表示協議地址的大小(單位:字節), 如IPv4地址大小為4。(硬件地址長度和協議地址長度,分別占1個字節,指出硬件地址和協議地址的長度,以字節為單位。)

OP : 表示ARP的消息類型。 
    1:ARP Request; 
    2:ARP Reply 
    3:RARP Request 
    4:RARP Reply

后面四個字段寫入的是一些物理地址和協議地址。不一定全部有值。 
對於ARP Request 而言,我們不知道目的MAC地址是什么,因此 Target’s Hardware Address 全部填充為0.

ARP幀的交互

當主機接收到一個針對其協議地址的ARP Request時,它會回應ARP Reply. 該Reply消息內容為:對調sender 和 Target 地址字段,然后將Sender’s Hardware Address(即原來的Target’s Hardware Address )修改為本機的Hardware Address。另外OP字段有1變為2.

 

局域網中一台主機獲取已知一台IP地址的主機的硬件地址過程:

當主機A向本局域網上的主機B發送IP數據報時,先在ARP高速緩存中查找B主機IP所對應的硬件地址,要是找到了,就將此硬件地址寫入到MAC幀首部的目的地址中,然后通過局域網發送;要是沒有找到,那么主機A會運行ARP,將會按照以下步驟找出主機B的硬件地址。
①主機A想局域網中廣播發送一個ARP請求分組,廣播的主要內容是:“我的IP地址是IPA,我的硬件地址是MACA,我要知道IP地址為IPB的主機的硬件地址”。
此時局域網中的主機都會收到這樣的一個數據幀。
②鏈路層在接收到這個數據幀之后將有效載荷和報頭分離之后,將有效載荷交付給ARP協議進行處理(因為MAC幀首部的幀類型為ARP協議)。
③在所有局域網中的主機獲得鏈路層交付的有效載荷后,它們會對其進行處理,發現其中的 接收端IP地址與自己的IP地址不同,則會將該數據報丟棄,不做處理。只有B主機會發現 接收端IP地址與自己的IP地址相同,此時B主機會向A主機單播一個響應分組(因為通過A的廣播,B知道了A的IP地址和硬件地址),“我的IP是IPB,我的硬件地址是MACB”。
④在主機A收到主機B的ARP響應分組后,就在ARP的告訴緩存中寫入B主機的IP地址到硬件地址的映射。
 

免費ARP 和 地址沖突檢測

* 免費ARP* 指的是 主機發送一個ARP請求,求尋找自己的IP地址 。常用在系統引導時,對網絡接口進行配置的時候。 
免費ARP有兩個重要作用 
1. 檢測網絡上是否有其他主機的IP地址與本機相同,即地址沖突檢測。 
2. 當主機向網絡廣播免費ARP時,其實她也將自己的IP地址與物理地址的映射關系廣播給其他主機了。因此,如果本機的硬件地址發生了變化,其他主機也應該做出相應的更新。

 

ARP請求發送到了目的端之后,目的端填上了自己的硬件地址,然后把兩個目的端地址和兩個發送端地址交換,把op的值置為2,再把該ARP數據報發回去。

前面提到的獲取目的端的MAC地址的步驟是在一個特殊的條件下完成了,即發送端和目的端都在同一個以太網中,那么當發送端和目的端不在同一個網絡中呢。 
這種情況下有一個術語叫ARP代理。連接發送端和目的端網絡的路由器就充當這樣一個代理。舉個簡單的例子,當主機A發送ARP請求給主機B時,它們處於不同的網絡,但是由路由器C相連,當C識別出主機B的IP地址屬於它連接的一個主機,這時C就會欺騙主機A,讓A誤認C就是目的主機,然后C就將ARP數據報發給B,最后B再將ARP應答發回來。

還有最后一個ARP特性:免費ARP 
它是指主機發送ARP查找自己的IP地址。 
作用有兩個: 
1.主機可以通過它來確定另一個主機有沒有設置同樣的IP地址。 
2.如果發送免費ARP的主機改變了硬件地址(換了網卡),那么這個分組就會更新其它主機高速緩存表中舊的硬件地址。

  ARP報頭定義如下: 

 
在學習到這些知識之后我們可以做這樣一些實驗,編寫一個腳本抓取和自己電腦處於同一局域網的其他主機的MAC地址。
原理很簡單,一個C類的地址最多有254台主機,所以我們可以暴力的去ping每個IP,我們就可以獲取到連接在本局域網中的其他主機的MAC地址。
[cpp]  view plain  copy
 
  1. #!/bin/bash  
  2.   
  3. net='192.168.199.'  
  4. i=1  
  5.   
  6. count=0  
  7. while [ $i -le 254 ]  
  8. do  
  9.     if [ $count -eq 20 ];then  
  10.         count=0  
  11.         sleep 1  
  12.     fi  
  13.     ping -c1 $net$i &  
  14.     let i++  
  15.     let count++  
  16. done  
  17.   
  18. wait  
  19. echo '############################################'  
  20. arp -a | grep -v 'incomplete'  
  21. echo '############################################'  
在我電腦上成功抓取到其他主機的硬件地址。
注意:如果是使用VM虛擬機,要將網絡適配器改為橋接模式
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM