ARP協議詳解


  ARP協議是網絡層協議,但並不同於IP協議。可以說,ARP協議是IP協議的底層協議,同時又是數據鏈路層的上層協議,每次發送IP數據包時,需要使用IP協議,而IP協議首先使用ARP模塊查詢目的地物理地址。ARP協議具體作用是進行IP和物理地址之間的轉換。

 

 

  之所以進行IP與物理地址的轉換,是因爲IP層以IP地址作爲通信雙方的地址,而數據鏈路層是以物理地址(mac)作爲通信雙方的地址,傳輸時,發送方需要同時知道接收者的IP地址以及物理地址。IP層協議處理過後的數據,最終需要通過數據鏈路層來傳輸。一般應用中,我們往往只知道對方的IP地址,而對物理地址一概不知。假設沒有ARP協議,那麼就會出現無法傳輸的情況。在ARP協議出現以前,人們爲了解決這個問題,使用一種叫做“靜態映射”的辦法,它在本機電腦建立一個表格,記錄對應的ip地址與mac地址。每次發送時,查詢該表格,得到mac地址,從而完成傳輸。這種方法有侷限性,因爲IP地址與物理地址的對應並非一成不變的。某些時候,物理地址也會變化。比如一個機器可能會更換其網卡,結果得到一個新的物理地址。靜態映射就失效了。

 

 

  沒有什麼可以阻擋人類前進的步伐。在靜態映射失效之後,互聯網從業者發明了ARP協議。它有另外一個名字,叫做“動態映射”,也是一種IP地址與物理地址的映射,但不是“靜態”的映射。主機只要在發送時知道IP地址或物理地址兩者中的一個。在ARP協議中,當一臺主機A知道對方的IP地址時,就可按照ARP協議生成一個ARP請求分組,然後A主機發送該請求分組,向局域網內所有其他主機發送該分組。

 

 

  ARP協議分組的具體工作原理是:既然知道了對方IP地址,想得到局域網內與該IP地址對應的物理地址,而局域網內不止一臺電腦,發送方只好通過發送一個ARP請求分組,該分組包含自己的IP地址以及MAC地址,以及對方的IP地址,對方的物理地址不知道,空着。有了這三樣,其他主機接收到該分組之後,可以讀取其中的目的IP地址,拿自己的IP地址進行比對,如果兩者一致,則在該ARP分組中寫入自己的物理地址,再發送回去,這個過程統稱爲應答;如果不一樣,那麼直接丟棄該包裹,不應答。

 

  除了上述這四樣最重要的東西,ARP分組還有許多內容。下圖是完整的ARP分組格式。

 

 

  有一個地方值得注意,ARP分組並非通過IP協議傳輸,而是,本身就作爲數據被封裝在數據鏈路幀,通過數據鏈路幀傳輸,在該幀的類型字段中,將指出此幀所攜帶的數據是ARP分組,幀中源地址使用發送端的物理地址,目的地址使用物理廣播地址,即向局域網內所有其他主機發送該分組。這個幀,也稱爲請求幀。相應地,是應答幀,應答幀即上文中ARP應答包,根據上文的介紹,應答幀只是單播幀,只是一對一傳輸,而不是向請求幀那樣一對多。

 

 

   ARP協議大致過程就是這樣了,有大俠在github上發佈了一個arp_joke代碼,是arp報文的一種應用。感興趣者可以殺過去看一看(https://github.com/Joinhack/arp_joke)。代碼中還有arp分組的結構體,我抄錄在下面。

struct ARP_HEADER{

                unsigned short arp_hdr;   /*ARP分組中的硬件類型,2字節,定義運行ARP的網絡的類型,以太網是類型1*/

                unsigned short arp_pro;  /*協議類型,2字節,定義上層協議類型,對於IPV4協議,該字段值爲0800*/

                unsigned char arp_hln;  /*硬件長度,8位字段,定義對應物理地址長度,以太網中這個值爲6*/

                unsigned char apr_pln; /*協議長度,8位字段,定義以字節爲單位的邏輯地址長度,對IPV4協議這個值爲4*/

                unsigned  short arp_opt;  /*16位字段,定義分組類型,是ARP請求(值爲1),或者ARP應答(值爲2)*/

                unsigned char arp_sha[6]; /*發送端硬件地址,可變長度字段,對以太網這個字段是6字節長*/

                unsigned char arp_spa[4]; /*發送端協議地址,可變長度字段,對IP協議,這個字段是4字節長*/

                unsigned char arp_tha[6]; /*接受端硬件地址*/

                unsigned long arp_tpa[4];/*接收端協議地址*/

};

  具體的代碼實施過程,每一個IP分組,都要先經過ARP協議,查詢ARP模塊中高速緩存表,表中存有許多臨時的IP地址以及對應的物理地址,若找到相應接受端的物理地址,那麼直接發送該IP分組;否則,將發送ARP分組廣播報文,查找目的地址物理地址。最後再發送該IP分組。

 

 

  如果不知道自己的IP地址,則可以使用RARP協議查詢,在網絡上,必然有一臺機器(路由器)知道該網絡內所有的IP地址,請求的機器上運行着RARP客戶程序,響應的機器運行着RARP服務器程序,藉助兩者,就可以查到自己的IP地址了。RARP分組格式完全與ARP協議相同。除了操作字段或者是3(請求標記),或者是4(回答標記)。此外,還有許多擴展協議,如BOOTP,DHCP協議,功能類似於ARP與RARP協議,只是它們能夠查詢到更多的信息,比如子網掩碼,路由器的IP地址,以及名字服務器的IP地址等等。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章