前置知識: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,Chao.NET, 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地址 。于是此后發送主機發往目的主機的所有幀,都將發往該路由器,通過它向外發送。這種情況稱為 委托ARP或ARP代理 (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(Address Resolution Protocol)即地址解析協議, 用于實現從 IP 地址到 MAC 地址的映射,即詢問目標IP對應的MAC地址。
-
在網絡通信中,主機和主機通信的數據包需要依據OSI模型從上到下進行數據封裝,當數據封裝完整后,再向外發出。所以在局域網的通信中,不僅需要源目IP地址的封裝,也需要源目MAC的封裝。
-
一般情況下,上層應用程序更多關心IP地址而不關心MAC地址,所以需要通過ARP協議來獲知目的主機的MAC地址,完成數據封裝。
來源:https://www.cnblogs.com/Courage129/p/14322842.html