引言
從前一篇“網(wǎng)絡(luò)底層知識(shí)講解”文章中,我們知道計(jì)算機(jī)中會(huì)維護(hù)一個(gè)ARP緩存表,這個(gè)表記錄著IP地址與MAC地址的映射關(guān)系,我們可以通過(guò)在電腦的控制臺(tái)通過(guò)arp -a指令查看一下我們自己計(jì)算機(jī)的ARP緩存表:
ARP緩存表
那么什么是ARP
協(xié)議呢?
初識(shí)ARP
ARP協(xié)議是地址解析協(xié)議(Address Resolution Protocol
)是通過(guò)解析IP地址
得到MAC地址
的,是一個(gè)在網(wǎng)絡(luò)協(xié)議包中極其重要的網(wǎng)絡(luò)傳輸協(xié)議,它與網(wǎng)卡有著極其密切的關(guān)系,在TCP/IP
分層結(jié)構(gòu)中,把ARP
劃分為網(wǎng)絡(luò)層
,為什么呢,因?yàn)樵?code>網(wǎng)絡(luò)層看來(lái),源主機(jī)與目標(biāo)主機(jī)是通過(guò)IP地址
進(jìn)行識(shí)別的,而所有的數(shù)據(jù)傳輸又依賴(lài)網(wǎng)卡底層硬件,即鏈路層
,那么就需要將這些IP地址
轉(zhuǎn)換為鏈路層可以識(shí)別的東西,在所有的鏈路中都有著自己的一套尋址機(jī)制,如在以太網(wǎng)中使用MAC地址
進(jìn)行尋址,以標(biāo)識(shí)不同的主機(jī),那么就需要有一個(gè)協(xié)議將IP地址轉(zhuǎn)換為MAC地址
,由此就出現(xiàn)了ARP協(xié)議
,所有ARP協(xié)議
在網(wǎng)絡(luò)層被應(yīng)用,它是網(wǎng)絡(luò)層與鏈路層連接的重要樞紐,每當(dāng)有一個(gè)數(shù)據(jù)要發(fā)送的時(shí)候都需要在通過(guò)ARP協(xié)議
將IP地址轉(zhuǎn)換成MAC地址
,在IP層及其以上的層次看來(lái),他們只標(biāo)識(shí)IP地址,從不跟硬件打交道,就像我一樣,我做應(yīng)用層的工作,而不會(huì)去寫(xiě)底層驅(qū)動(dòng),得專(zhuān)門(mén)有個(gè)同事將驅(qū)動(dòng)寫(xiě)完給我,我只需要知道他提供的API接口就行了,而我就專(zhuān)心處理我的工作,我相信他能把驅(qū)動(dòng)寫(xiě)好,我只需要直接調(diào)用即可。
ARP緩存表
既然已經(jīng)解釋了ARP協(xié)議
的用途及重要性,那么它是如何工作的?為了實(shí)現(xiàn)IP地址
與MAC地址
的查詢(xún)與轉(zhuǎn)換
,ARP協(xié)議
引入了ARP緩存表
的概念,每臺(tái)主機(jī)或路由器在維護(hù)
著一個(gè)ARP緩存表(ARP table)
,這個(gè)表包含IP地址到MAC地址的映射關(guān)系
,表中記錄了
對(duì),我稱(chēng)之為ARP表項(xiàng)
,如我們前面那張圖
所展示的一樣,他們是主機(jī)最近
運(yùn)行時(shí)獲得關(guān)于其他主機(jī)的IP地址
到MAC地址
的映射,當(dāng)需要發(fā)送數(shù)據(jù)的時(shí)候,主機(jī)就會(huì)根據(jù)數(shù)據(jù)報(bào)中的目標(biāo)IP地址
信息,然后在ARP緩存表中進(jìn)行查找對(duì)應(yīng)的MAC地址
,最后通過(guò)網(wǎng)卡將數(shù)據(jù)發(fā)送出去。ARP緩存表
包含一個(gè)壽命值(TTL,也稱(chēng)作生存時(shí)間)
,它將記錄每個(gè)ARP表項(xiàng)
的生存時(shí)間,生存時(shí)間到了就會(huì)從緩存表中刪除。從一個(gè)表項(xiàng)放置到ARP緩存表
中開(kāi)始,一個(gè)表項(xiàng)通常的生存時(shí)間一般是10
分鐘嗎,當(dāng)然,這些生存時(shí)間是可以任意設(shè)置的,我們一般使用默認(rèn)即可。
一句話(huà)總結(jié)ARP協(xié)議的工作
ARP協(xié)議的主要工作就是建立、查詢(xún)、更新、刪除ARP表項(xiàng)。
ARP表項(xiàng)的建立
當(dāng)主機(jī)開(kāi)機(jī)的時(shí)候,ARP緩存
表肯定是空的,那么怎么一步步建立 ARP表項(xiàng)
呢?如果此時(shí)想發(fā)送數(shù)據(jù)怎么辦呢?因?yàn)闆](méi)有ARP表項(xiàng)
,說(shuō)明就找不到IP地址
到MAC地址
的映射關(guān)系
,這樣子也就無(wú)法發(fā)送數(shù)據(jù)了。
其實(shí)協(xié)議棧的實(shí)現(xiàn)還是很強(qiáng)大的,如果沒(méi)有ARP表項(xiàng)
,那么主機(jī)就會(huì)去建立ARP表項(xiàng)
。
以我們的電腦為例,在開(kāi)機(jī)的時(shí)候,我們的電腦肯定是沒(méi)有ARP表項(xiàng)
的(或者應(yīng)該說(shuō)只有路由器的ARP表項(xiàng)
,因?yàn)榭赡苁莿?dòng)態(tài)獲取IP地址):
7
對(duì)于局域網(wǎng)
如果我想向局域網(wǎng)中的某個(gè)電腦發(fā)送一個(gè)數(shù)據(jù),那么我的電腦就會(huì)從已有的ARP緩存表
中尋找這個(gè)IP地址對(duì)應(yīng)的物理地址的ARP表項(xiàng)
,然后直接將數(shù)據(jù)寫(xiě)入以太網(wǎng)數(shù)據(jù)幀中讓網(wǎng)卡進(jìn)行發(fā)送即可,而如果沒(méi)有找到這個(gè)IP地址
,那么這個(gè)數(shù)據(jù)就沒(méi)法立即發(fā)送,電腦會(huì)先在局域網(wǎng)上廣播一個(gè)ARP請(qǐng)求
(目標(biāo)MAC地址為FF-FF-FF-FF-FF-FF
),廣播的ARP請(qǐng)求發(fā)出后,處于同一局域網(wǎng)內(nèi)的所有主機(jī)都會(huì)接收到這個(gè)請(qǐng)求,如果目標(biāo)IP地址
與接收到ARP請(qǐng)求的主機(jī)自身IP地址
吻合就會(huì)返回
一個(gè)ARP應(yīng)答
,告訴請(qǐng)求者(即我的電腦)自身的MAC地址
,當(dāng)我的電腦收到這個(gè)ARP應(yīng)答
后,就去建立一個(gè)ARP表項(xiàng)
,并且重新將數(shù)據(jù)發(fā)送出去。
ARP協(xié)議的核心就是對(duì)緩存表的操作,發(fā)送數(shù)據(jù)包的時(shí)候,查找ARP緩存表
以得到對(duì)應(yīng)的MAC地址
,在ARP緩存表中的TTL
即將過(guò)期的時(shí)候更新
緩存表以保證ARP表項(xiàng)
有效,此外ARP協(xié)議還需要不斷處理來(lái)自局域網(wǎng)中其他主機(jī)的ARP請(qǐng)求
。
對(duì)于公網(wǎng)
比如我的電腦向訪問(wèn)我的博客:https://jiejietop.cn
因?yàn)槲业牟┛椭鳈C(jī)是處于外網(wǎng)的,那么我的電腦在訪問(wèn)的時(shí)候,也是找不到緩存表的,那它只能通過(guò)網(wǎng)關(guān),讓網(wǎng)關(guān)將數(shù)據(jù)轉(zhuǎn)發(fā)到我的博客主機(jī)上,即:
8
因?yàn)槲业碾娔X與博客主機(jī)不在一個(gè)網(wǎng)段,電腦查詢(xún)自己的路由表
,知道如果想和博客主機(jī)
通信則必須通過(guò)網(wǎng)關(guān)(gateway)
來(lái)中轉(zhuǎn),所以會(huì)在與網(wǎng)關(guān)
直連的網(wǎng)卡上請(qǐng)求網(wǎng)關(guān)的MAC地址
,因?yàn)殡娔X要把發(fā)給博客主機(jī)的數(shù)據(jù)先發(fā)給網(wǎng)關(guān),當(dāng)合法以太幀到達(dá)網(wǎng)關(guān)并且順利接收,網(wǎng)關(guān)會(huì)將數(shù)據(jù)遞交給IP層
,IP層查詢(xún)路由表,找到與博客主機(jī)直連的接口(假設(shè)是直連的,實(shí)際上肯定不是直連的),網(wǎng)關(guān)會(huì)發(fā)一個(gè)ARP請(qǐng)求
到博客主機(jī)上,請(qǐng)求它的MAC地址
,網(wǎng)關(guān)收到應(yīng)答后將建立新的ARP表項(xiàng)
并將開(kāi)始維護(hù)ARP緩存表
,然后完成最終的通信。
ARP緩存表的超時(shí)處理
ARP是動(dòng)態(tài)
處理的,現(xiàn)在總結(jié)一下:ARP表項(xiàng)
的生存時(shí)間是一般為5-10
分鐘(LwIP
中默認(rèn)是5
分鐘),而ARP請(qǐng)求
的等待時(shí)間是5秒鐘
,當(dāng)這些時(shí)間到達(dá)后,就會(huì)更新ARP表項(xiàng)
,如果在物理鏈路層無(wú)法連通則會(huì)刪除表項(xiàng)。
因此每個(gè)協(xié)議棧的實(shí)現(xiàn)都必須維護(hù)著一個(gè)定時(shí)器(超時(shí)機(jī)制)
來(lái)管理ARP緩存表
,在必要的時(shí)候更新及刪除ARP表項(xiàng)
,關(guān)于怎么處理的我們就不多追究,有興趣的可以看LwIP的etharp_tmr()
源碼。
說(shuō)點(diǎn)題外話(huà):因?yàn)?code>ARP協(xié)議是一個(gè)動(dòng)態(tài)的協(xié)議,很多網(wǎng)絡(luò)攻擊都是利用
ARP協(xié)議
進(jìn)行的,如ARP欺騙,ARP洪水攻擊
等等,而且這種攻擊是很難防御的,當(dāng)然也有辦法,直接將動(dòng)態(tài)的ARP緩存表
設(shè)置為靜態(tài)就行了,但是這就違背了ARP協(xié)議
的動(dòng)態(tài)地址解析
特性。
ARP報(bào)文
ARP的請(qǐng)求與應(yīng)答都是依賴(lài)ARP報(bào)文
結(jié)構(gòu)進(jìn)行的,ARP報(bào)文
是放在以太網(wǎng)數(shù)據(jù)幀中進(jìn)行發(fā)送的,下面是ARP報(bào)文
的格式:
9
當(dāng)它封裝在以太網(wǎng)幀中的格式:
10
在ARP表建立前,主機(jī)并不知道目標(biāo)MAC地址
,所以在一開(kāi)始的時(shí)候只能通過(guò)廣播的方式將ARP請(qǐng)求包
發(fā)送出去,處于同一局域網(wǎng)的主機(jī)都能接收到廣播的數(shù)據(jù)包。所以一開(kāi)始目標(biāo)MAC地址
是FF-FF-FF-FF-FF-FF
,而以太網(wǎng)首部的幀類(lèi)型是有多種,對(duì)于ARP數(shù)據(jù)包
來(lái)說(shuō),其值為0x0806
,對(duì)于IP數(shù)據(jù)報(bào)
來(lái)說(shuō),其值為0x0800
。
在ARP首部一開(kāi)始的2個(gè)字節(jié)存儲(chǔ)的是硬件類(lèi)型,表示要知道目標(biāo)網(wǎng)卡的硬件類(lèi)型,其中,值為1
表示以太網(wǎng)地址;接下來(lái)還有2
字節(jié)的協(xié)議類(lèi)型,其中,0x0800
表示IP協(xié)議
,其他還可能是ICMP/IGMP協(xié)議
等;接下來(lái)有1個(gè)字節(jié)表示硬件地址長(zhǎng)度,指出該報(bào)文中硬件地址的長(zhǎng)度,對(duì)于以太網(wǎng)硬件類(lèi)型,它的值為6
;還有1字節(jié)的協(xié)議地址長(zhǎng)度,如果是ARP協(xié)議、IP協(xié)議
等,該值為4
;ARP首部最后的op
字段用于記錄ARP操作的類(lèi)型,分別是:
- ARP請(qǐng)求,其值為1。
- ARP應(yīng)答,其值為2。
- RARP請(qǐng)求,其值為3。
- RARP應(yīng)答,其值為4。
我們只關(guān)心ARP的請(qǐng)求與應(yīng)答即可,RARP是逆地址解析協(xié)議,在這里我們就不用去了解,它在網(wǎng)絡(luò)中基本已經(jīng)被淘汰,用于主機(jī)在啟動(dòng)的時(shí)候獲得自己的IP地址。
對(duì)于ARP首部后面的四個(gè)字段分別是源MAC地址、源IP地址、目標(biāo)MAC地址、目標(biāo)IP地址,這些就是比較簡(jiǎn)單的了。
為了加深理解,我們使用wireshark
網(wǎng)絡(luò)抓包工具形象地講解報(bào)文格式與內(nèi)容,關(guān)于wireshark
網(wǎng)絡(luò)抓包工具的使用方式我就不做過(guò)多講解,網(wǎng)上教程一大把,打開(kāi)工具,然后抓取電腦網(wǎng)絡(luò)中的數(shù)據(jù)包。
11
-
ip地址
+關(guān)注
關(guān)注
0文章
294瀏覽量
17006 -
ARP協(xié)議
+關(guān)注
關(guān)注
0文章
10瀏覽量
6885 -
網(wǎng)絡(luò)傳輸協(xié)議
+關(guān)注
關(guān)注
0文章
5瀏覽量
5859
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論