圖解ARP協議


前置知識:MAC地址

在說到ARP協議之前,需要了解MAC地址,在OSI七層模型中,第三層是網絡層,要解決的是下一跳機制確定的設備位置,具體來說就是網卡地址,MAC地址用於在網絡中唯一標示一個網卡,一台設備若有一或多個網卡,則每個網卡都需要並有一個唯一的MAC地址。

MAC地址格式

MAC地址共48位(6個字節),以十六進制表示。第1Bit為廣播地址(0)/群播地址(1),第2Bit為廣域地址(0)/區域地址(1)。前3~24位由IEEE決定如何分配給每一家制造商,且不重復,后24位由實際生產該網絡設備的廠商自行指定且不重復。

ff:ff:ff:ff:ff:ff則作為廣播地址。

01:xx:xx:xx:xx:xx是多播地址,01:00:5e:xx:xx:xx是IPv4多播地址。

ARP協議簡介

地址解析協議(英語:Address Resolution Protocol,縮寫:ARP)是一個通過解析網絡層地址來找尋數據鏈路層地址的網絡傳輸協議,它在IPv4中極其重要。

ARP是通過網絡地址來定位MAC地址。 ARP已經在很多網路層數據鏈接層之間得以實現,包括IPv4,Chaosnet, DECnet和Xerox PARC Universal Packet(PUP)使用IEEE 802標准, 光纖分布式數據接口, X.25, 幀中繼和異步傳輸模式(ATM),IEEE 802.3和IEEE 802.11標准上IPv4占了多數流量。

在IPv6中,鄰居發現協議(NDP)用於代替地址解析協議(ARP)。

ARP功能

在以太網協議中規定,同一局域網中的一台主機要和另一台主機進行直接通信,必須要知道目標主機的MAC地址。而在TCP/IP協議中,網絡層和傳輸層只關心目標主機的IP地址。這就導致在以太網中使用IP協議時,數據鏈路層的以太網協議接到上層IP協議提供的數據中,只包含目的主機的IP地址。於是需要一種方法,根據目的主機的IP地址,獲得其MAC地址。這就是ARP協議要做的事情。所謂地址解析(address resolution)就是主機在發送幀前將目標IP地址轉換成目標MAC地址的過程

另外,當發送主機和目的主機不在同一個局域網中時,即便知道對方的MAC地址,兩者也不能直接通信,必須經過路由轉發才可以。所以此時,發送主機通過ARP協議獲得的將不是目的主機的真實MAC地址,而是一台可以通往局域網外的路由器的MAC地址。於是此后發送主機發往目的主機的所有幀,都將發往該路由器,通過它向外發送。這種情況稱為委托ARPARP代理(ARP Proxy)。

在點對點鏈路中不使用ARP,實際上在點對點網絡中也不使用MAC地址,因為在此類網絡中分別已經獲取了對端的IP地址。

圖解ARP協議

根據OSI數據封裝順序,發送方會自頂向下(從應用層到物理層)封裝數據,然后發送出去,如果P1 ping P2,那么發生下圖所示過程:

由於MAC是確定物理設備(網卡)唯一標識,那么這個包在數據鏈路層就會失敗,因為沒法找到對應的主機,於是有了ARP協議,說得簡單點就是根據在發送數據之前,通過IP2獲取MAC2的過程:

這時候,有了[IP1=>IP2, MAC1=>MAC2],這兩個信息就可以確定主機,並且建立通訊,這時候有個問題,我們圖上是一對一的,如果這兩個主機不在一個局域網呢?離得很遠很遠,那怎么辦?

解決辦法是廣播:

當arp協議數據包進行廣播時,非目的主機接受到這個包會直接丟棄,接收到這個包的目的主機PC2會直接將信息發送給PC1,注意,由於這時候PC2接收到的包中已經有了PC1的IP地址以及MAC地址,所以不需要廣播,直接進行發送進行了。

經過上面的處理,PC1獲取了PC2的MAC2地址,就可以把數據包發送出去,之后便可以進行正常的通信。ARP的功能和實現過程是如此的簡單:它在發送方需要目標MAC地址的時及時出手,通過"一問一答"的方式獲取到特定IP對應的MAC地址,然后存儲到本地【ARP緩存表】,后續需要的話,就到這里查找。

ARP緩存表

如果我想向局域網中的某個電腦再發送一個數據,那么我的電腦就會從已有的ARP緩存表中尋找這個IP地址對應的物理地址的ARP表項,然后直接將數據寫入以太網數據幀中讓網卡進行發送即可,而如果沒有找到這個IP地址,那么這個數據就沒法立即發送,電腦會先在局域網上廣播一個ARP請求(目標MAC地址為FF-FF-FF-FF-FF-FF),廣播的ARP請求發出后,處於同一局域網內的所有主機都會接收到這個請求,如果目標IP地址與接收到ARP請求的主機自身IP地址吻合就會返回一個ARP應答,告訴請求者(即我的電腦)自身的MAC地址,當我的電腦收到這個ARP應答后,就去建立一個ARP表項,並且重新將數據發送出去。

ARP協議的核心就是對緩存表的操作,發送數據包的時候,查找ARP緩存表以得到對應的MAC地址,在ARP緩存表中的TTL即將過期的時候更新緩存表以保證ARP表項有效,此外ARP協議還需要不斷處理來自局域網中其他主機的ARP請求。

如果兩台電腦不在一個網段,電腦查詢自己的路由表,知道如果想和博客主機通信則必須通過網關(gateway)來中轉,所以會在與網關直連的網卡上請求網關的MAC地址,因為電腦要把發給PC2主機的數據先發給網關,當合法以太幀到達網關並且順利接收,網關會將數據遞交給IP層,IP層查詢路由表,找到與博客主機直連的接口(假設是直連的,實際上肯定不是直連的),網關會發一個ARP請求到博客主機上,請求它的MAC地址,網關收到應答后將建立新的ARP表項並將開始維護ARP緩存表,然后完成最終的通信。

APR緩存表有一定的時限性,因為ARP是動態處理的,ARP表項的生存時間是一般為5-10分鍾(LwIP中默認是5分鍾),而ARP請求的等待時間是5秒鍾,當這些時間到達后,就會更新ARP表項,如果在物理鏈路層無法連通則會刪除表項,另外電腦重啟的話ARP緩存表會被清空。因此每個協議棧的實現都必須維護着一個定時器(超時機制)來管理ARP緩存表,在必要的時候更新及刪除ARP表項,關於怎么處理的就不多追究,有興趣的可以看LwIP的etharp_tmr()源碼。

ARP報文

ARP報文格式如下:

當ARP報文封裝在以太網幀中,格式:

在ARP首部一開始的2個字節存儲的是硬件類型,表示要知道目標網卡的硬件類型,其中,值為1表示以太網地址;接下來還有2字節的協議類型,其中,0x0800表示IP協議,其他還可能是ICMP/IGMP協議等;接下來有1個字節表示硬件地址長度,指出該報文中硬件地址的長度,對於以太網硬件類型,它的值為6;還有1字節的協議地址長度,如果是ARP協議、IP協議等,該值為4;ARP首部最后的op字段用於記錄ARP操作的類型,分別是:

  • ARP請求,其值為1。
  • ARP應答,其值為2。
  • RARP請求,其值為3。
  • RARP應答,其值為4。

ARP協議總結

  1. ARP(Address Resolution Protocol)即地址解析協議, 用於實現從 IP 地址到 MAC 地址的映射,即詢問目標IP對應的MAC地址。
  2. 在網絡通信中,主機和主機通信的數據包需要依據OSI模型從上到下進行數據封裝,當數據封裝完整后,再向外發出。所以在局域網的通信中,不僅需要源目IP地址的封裝,也需要源目MAC的封裝。
  3. 一般情況下,上層應用程序更多關心IP地址而不關心MAC地址,所以需要通過ARP協議來獲知目的主機的MAC地址,完成數據封裝。


免責聲明!

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



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