前置知識:mac地址
在說到ARP協(xié)議之前,需要了解MAC地址,在OSI七層模型中,第三層是網(wǎng)絡(luò)層,要解決的是下一跳機(jī)制確定的設(shè)備位置,具體來說就是網(wǎng)卡地址,MAC地址用于在網(wǎng)絡(luò)中唯一標(biāo)示一個 網(wǎng)卡 ,一臺設(shè)備若有一或多個網(wǎng)卡,則每個網(wǎng)卡都需要并有一個唯一的MAC地址。
MAC地址格式
MAC地址共48位(6個字節(jié)),以十六進(jìn)制表示。第1Bit為廣播地址(0)/群播地址(1),第2Bit為廣域地址(0)/區(qū)域地址(1)。前3~24位由IEEE決定如何分配給每一家制造商,且不重復(fù),后24位由實際生產(chǎn)該網(wǎng)絡(luò)設(shè)備的廠商自行指定且不重復(fù)。
ff:ff:ff:ff:ff:ff則作為廣播地址。
01:xx:xx:xx:xx:xx是多播地址,01:00:5e:xx:xx:xx是IPv4多播地址。
ARP協(xié)議簡介
地址解析協(xié)議(英語:Address Resolution Protocol,縮寫:ARP)是一個 通過解析網(wǎng)絡(luò)層地址來找尋數(shù)據(jù)鏈路層地址的網(wǎng)絡(luò)傳輸協(xié)議 ,它在IPv4中極其重要。
ARP是通過 網(wǎng)絡(luò)地址 來定位MAC地址。ARP已經(jīng)在很多 網(wǎng)路層 和 數(shù)據(jù)鏈接層 之間得以實現(xiàn),包括IPv4,Chao.NET, DECnet和Xerox PARC Universal Packet(PUP)使用IEEE 802標(biāo)準(zhǔn), 光纖分布式數(shù)據(jù)接口, X.25, 幀中繼和異步傳輸模式(ATM),IEEE 802.3和IEEE 802.11標(biāo)準(zhǔn)上IPv4占了多數(shù)流量。
在IPv6中, 鄰居發(fā)現(xiàn)協(xié)議 (NDP)用于代替 地址解析協(xié)議 (ARP)。
ARP功能
在以太網(wǎng)協(xié)議中規(guī)定,同一局域網(wǎng)中的一臺主機(jī)要和另一臺主機(jī)進(jìn)行直接通信,必須要知道目標(biāo)主機(jī)的 MAC地址 。而在TCP/IP協(xié)議中,網(wǎng)絡(luò)層和傳輸層只關(guān)心目標(biāo)主機(jī)的IP地址。這就導(dǎo)致在以太網(wǎng)中使用IP協(xié)議時, 數(shù)據(jù)鏈路層 的以太網(wǎng)協(xié)議接到上層IP協(xié)議提供的數(shù)據(jù)中,只包含目的主機(jī)的IP地址。于是需要一種方法, 根據(jù)目的主機(jī)的IP地址,獲得其MAC地址。這就是ARP協(xié)議要做的事情。所謂地址解析(address resolution)就是主機(jī)在發(fā)送幀前將目標(biāo)IP地址轉(zhuǎn)換成目標(biāo)MAC地址的過程 。
另外,當(dāng)發(fā)送主機(jī)和目的主機(jī)不在同一個局域網(wǎng)中時,即便知道對方的MAC地址,兩者也不能直接通信,必須經(jīng)過 路由轉(zhuǎn)發(fā) 才可以。所以此時,發(fā)送主機(jī)通過ARP協(xié)議獲得的將不是目的主機(jī)的真實MAC地址,而是一臺可以通往局域網(wǎng)外的 路由器的MAC地址 。于是此后發(fā)送主機(jī)發(fā)往目的主機(jī)的所有幀,都將發(fā)往該路由器,通過它向外發(fā)送。這種情況稱為 委托ARP或ARP代理 (ARP Proxy)。
在點對點鏈路中不使用ARP,實際上在點對點網(wǎng)絡(luò)中也不使用MAC地址,因為在此類網(wǎng)絡(luò)中分別已經(jīng)獲取了對端的IP地址。
圖解ARP協(xié)議
根據(jù)OSI數(shù)據(jù)封裝順序,發(fā)送方會自頂向下(從應(yīng)用層到物理層)封裝數(shù)據(jù),然后發(fā)送出去,如果P1 ping P2,那么發(fā)生下圖所示過程:

由于MAC是確定物理設(shè)備(網(wǎng)卡)唯一標(biāo)識,那么這個包在數(shù)據(jù)鏈路層就會失敗,因為沒法找到對應(yīng)的主機(jī),于是有了ARP協(xié)議,說得簡單點就是根據(jù)在發(fā)送數(shù)據(jù)之前,通過IP2獲取MAC2的過程:

這時候,有了 [IP1=>IP2, MAC1=>MAC2] ,這兩個信息就可以確定主機(jī),并且建立通訊,這時候有個問題,我們圖上是一對一的,如果這兩個主機(jī)不在一個局域網(wǎng)呢?離得很遠(yuǎn)很遠(yuǎn),那怎么辦?
解決辦法是廣播:

當(dāng)arp協(xié)議數(shù)據(jù)包進(jìn)行廣播時,非目的主機(jī)接受到這個包會直接丟棄,接收到這個包的目的主機(jī)PC2會直接將信息發(fā)送給PC1,注意,由于這時候PC2接收到的包中已經(jīng)有了PC1的IP地址以及MAC地址,所以不需要廣播,直接進(jìn)行發(fā)送進(jìn)行了。
經(jīng)過上面的處理,PC1獲取了PC2的MAC2地址,就可以把數(shù)據(jù)包發(fā)送出去,之后便可以進(jìn)行正常的通信。ARP的功能和實現(xiàn)過程是如此的簡單:它在發(fā)送方需要目標(biāo)MAC地址的時及時出手,通過"一問一答"的方式獲取到特定IP對應(yīng)的MAC地址,然后存儲到本地【ARP緩存表】,后續(xù)需要的話,就到這里查找。
ARP緩存表
如果我想向局域網(wǎng)中的某個電腦再發(fā)送一個數(shù)據(jù),那么我的電腦就會從已有的 ARP緩存表 中尋找這個IP地址對應(yīng)的物理地址的ARP表項,然后直接將數(shù)據(jù)寫入以太網(wǎng)數(shù)據(jù)幀中讓網(wǎng)卡進(jìn)行發(fā)送即可,而如果沒有找到這個IP地址,那么這個數(shù)據(jù)就沒法立即發(fā)送,電腦會先在局域網(wǎng)上廣播一個 ARP請求 (目標(biāo)MAC地址為 FF-FF-FF-FF-FF-FF ),廣播的ARP請求發(fā)出后,處于同一局域網(wǎng)內(nèi)的所有主機(jī)都會接收到這個請求,如果目標(biāo)IP地址與接收到ARP請求的主機(jī)自身IP地址吻合就會返回一個ARP應(yīng)答,告訴請求者(即我的電腦)自身的MAC地址,當(dāng)我的電腦收到這個ARP應(yīng)答后,就去建立一個ARP表項,并且重新將數(shù)據(jù)發(fā)送出去。
ARP協(xié)議的核心就是對緩存表的操作,發(fā)送數(shù)據(jù)包的時候,查找ARP緩存表以得到對應(yīng)的MAC地址,在ARP緩存表中的TTL即將過期的時候更新緩存表以保證ARP表項有效,此外ARP協(xié)議還需要不斷處理來自局域網(wǎng)中其他主機(jī)的ARP請求。
如果兩臺電腦不在一個網(wǎng)段,電腦查詢自己的路由表,知道如果想和博客主機(jī)通信則必須通過網(wǎng)關(guān)(gateway)來中轉(zhuǎn), 所以會在與網(wǎng)關(guān)直連的網(wǎng)卡上請求網(wǎng)關(guān)的MAC地址,因為電腦要把發(fā)給PC2主機(jī)的數(shù)據(jù)先發(fā)給網(wǎng)關(guān),當(dāng)合法以太幀到達(dá)網(wǎng)關(guān)并且順利接收,網(wǎng)關(guān)會將數(shù)據(jù)遞交給IP層,IP層查詢路由表,找到與博客主機(jī)直連的接口 (假設(shè)是直連的,實際上肯定不是直連的),網(wǎng)關(guān)會發(fā)一個ARP請求到博客主機(jī)上,請求它的MAC地址,網(wǎng)關(guān)收到應(yīng)答后將建立新的ARP表項并將開始維護(hù)ARP緩存表,然后完成最終的通信。
APR緩存表有一定的時限性,因為ARP是動態(tài)處理的,ARP表項的生存時間是一般為5-10分鐘(LwIP中默認(rèn)是5分鐘),而ARP請求的等待時間是5秒鐘,當(dāng)這些時間到達(dá)后,就會更新ARP表項,如果在物理鏈路層無法連通則會刪除表項, 另外電腦重啟的話ARP緩存表會被清空 。因此每個協(xié)議棧的實現(xiàn)都必須維護(hù)著一個定時器(超時機(jī)制)來管理ARP緩存表,在必要的時候更新及刪除ARP表項,關(guān)于怎么處理的就不多追究,有興趣的可以看LwIP的etharp_tmr源碼。
ARP報文
ARP報文格式如下:
當(dāng)ARP報文封裝在以太網(wǎng)幀中,格式:
在ARP首部一開始的 2個字節(jié) 存儲的是硬件類型,表示要知道目標(biāo)網(wǎng)卡的硬件類型,其中,值為 1 表示以太網(wǎng)地址;接下來還有 2字節(jié) 的協(xié)議類型,其中, 0x0800 表示IP協(xié)議,其他還可能是 ICMP/IGMP協(xié)議 等;接下來有 1個字節(jié) 表示硬件地址長度,指出該報文中硬件地址的長度,對于以太網(wǎng)硬件類型,它的值為6;還有 1字節(jié) 的協(xié)議地址長度,如果是ARP協(xié)議、IP協(xié)議等,該值為4;ARP首部最后的op字段用于記錄ARP操作的類型,分別是:
-
ARP請求,其值為1。
-
ARP應(yīng)答,其值為2。
-
RARP請求,其值為3。
-
RARP應(yīng)答,其值為4。
-
ARP(Address Resolution Protocol)即地址解析協(xié)議, 用于實現(xiàn)從 IP 地址到 MAC 地址的映射,即詢問目標(biāo)IP對應(yīng)的MAC地址。
-
在網(wǎng)絡(luò)通信中,主機(jī)和主機(jī)通信的數(shù)據(jù)包需要依據(jù)OSI模型從上到下進(jìn)行數(shù)據(jù)封裝,當(dāng)數(shù)據(jù)封裝完整后,再向外發(fā)出。所以在局域網(wǎng)的通信中,不僅需要源目IP地址的封裝,也需要源目MAC的封裝。
-
一般情況下,上層應(yīng)用程序更多關(guān)心IP地址而不關(guān)心MAC地址,所以需要通過ARP協(xié)議來獲知目的主機(jī)的MAC地址,完成數(shù)據(jù)封裝。
來源:https://www.cnblogs.com/Courage129/p/14322842.html






