引言
從前一篇“網絡底層知識講解”文章中,我們知道計算機中會維護一個ARP緩存表,這個表記錄著IP地址與MAC地址的映射關系,我們可以通過在電腦的控制臺通過arp -a指令查看一下我們自己計算機的ARP緩存表:

ARP緩存表
那么什么是ARP協議呢?
初識ARP
ARP協議是地址解析協議(Address Resolution Protocol)是通過解析IP地址得到MAC地址的,是一個在網絡協議包中極其重要的網絡傳輸協議,它與網卡有著極其密切的關系,在TCP/IP分層結構中,把ARP劃分為網絡層,為什么呢,因為在網絡層看來,源主機與目標主機是通過IP地址進行識別的,而所有的數據傳輸又依賴網卡底層硬件,即鏈路層,那么就需要將這些IP地址轉換為鏈路層可以識別的東西,在所有的鏈路中都有著自己的一套尋址機制,如在以太網中使用MAC地址進行尋址,以標識不同的主機,那么就需要有一個協議將IP地址轉換為MAC地址,由此就出現了ARP協議,所有ARP協議在網絡層被應用,它是網絡層與鏈路層連接的重要樞紐,每當有一個數據要發送的時候都需要在通過ARP協議將IP地址轉換成MAC地址,在IP層及其以上的層次看來,他們只標識IP地址,從不跟硬件打交道,就像我一樣,我做應用層的工作,而不會去寫底層驅動,得專門有個同事將驅動寫完給我,我只需要知道他提供的API接口就行了,而我就專心處理我的工作,我相信他能把驅動寫好,我只需要直接調用即可。
ARP緩存表
既然已經解釋了ARP協議的用途及重要性,那么它是如何工作的?為了實現IP地址與MAC地址的查詢與轉換,ARP協議引入了ARP緩存表的概念,每臺主機或路由器在維護著一個ARP緩存表(ARP table),這個表包含IP地址到MAC地址的映射關系,表中記錄了對,我稱之為ARP表項,如我們前面那張圖所展示的一樣,他們是主機最近運行時獲得關于其他主機的IP地址到MAC地址的映射,當需要發送數據的時候,主機就會根據數據報中的目標IP地址信息,然后在ARP緩存表中進行查找對應的MAC地址,最后通過網卡將數據發送出去。ARP緩存表包含一個壽命值(TTL,也稱作生存時間),它將記錄每個ARP表項的生存時間,生存時間到了就會從緩存表中刪除。從一個表項放置到ARP緩存表中開始,一個表項通常的生存時間一般是10分鐘嗎,當然,這些生存時間是可以任意設置的,我們一般使用默認即可。
一句話總結ARP協議的工作
ARP協議的主要工作就是建立、查詢、更新、刪除ARP表項。
ARP表項的建立
當主機開機的時候,ARP緩存表肯定是空的,那么怎么一步步建立 ARP表項呢?如果此時想發送數據怎么辦呢?因為沒有ARP表項,說明就找不到IP地址到MAC地址的映射關系,這樣子也就無法發送數據了。
其實協議棧的實現還是很強大的,如果沒有ARP表項,那么主機就會去建立ARP表項。
以我們的電腦為例,在開機的時候,我們的電腦肯定是沒有ARP表項的(或者應該說只有路由器的ARP表項,因為可能是動態獲取IP地址):

7
對于局域網
如果我想向局域網中的某個電腦發送一個數據,那么我的電腦就會從已有的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請求。
對于公網
比如我的電腦向訪問我的博客:https://jiejietop.cn
因為我的博客主機是處于外網的,那么我的電腦在訪問的時候,也是找不到緩存表的,那它只能通過網關,讓網關將數據轉發到我的博客主機上,即:

8
因為我的電腦與博客主機不在一個網段,電腦查詢自己的路由表,知道如果想和博客主機通信則必須通過網關(gateway)來中轉,所以會在與網關直連的網卡上請求網關的MAC地址,因為電腦要把發給博客主機的數據先發給網關,當合法以太幀到達網關并且順利接收,網關會將數據遞交給IP層,IP層查詢路由表,找到與博客主機直連的接口(假設是直連的,實際上肯定不是直連的),網關會發一個ARP請求到博客主機上,請求它的MAC地址,網關收到應答后將建立新的ARP表項并將開始維護ARP緩存表,然后完成最終的通信。
ARP緩存表的超時處理
ARP是動態處理的,現在總結一下:ARP表項的生存時間是一般為5-10分鐘(LwIP中默認是5分鐘),而ARP請求的等待時間是5秒鐘,當這些時間到達后,就會更新ARP表項,如果在物理鏈路層無法連通則會刪除表項。
因此每個協議棧的實現都必須維護著一個定時器(超時機制)來管理ARP緩存表,在必要的時候更新及刪除ARP表項,關于怎么處理的我們就不多追究,有興趣的可以看LwIP的etharp_tmr()源碼。
說點題外話:因為
ARP協議是一個動態的協議,很多網絡攻擊都是利用ARP協議進行的,如ARP欺騙,ARP洪水攻擊等等,而且這種攻擊是很難防御的,當然也有辦法,直接將動態的ARP緩存表設置為靜態就行了,但是這就違背了ARP協議的動態地址解析特性。
ARP報文
ARP的請求與應答都是依賴ARP報文結構進行的,ARP報文是放在以太網數據幀中進行發送的,下面是ARP報文的格式:

9
當它封裝在以太網幀中的格式:

10
在ARP表建立前,主機并不知道目標MAC地址,所以在一開始的時候只能通過廣播的方式將ARP請求包發送出去,處于同一局域網的主機都能接收到廣播的數據包。所以一開始目標MAC地址是FF-FF-FF-FF-FF-FF,而以太網首部的幀類型是有多種,對于ARP數據包來說,其值為0x0806,對于IP數據報來說,其值為0x0800。
在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的請求與應答即可,RARP是逆地址解析協議,在這里我們就不用去了解,它在網絡中基本已經被淘汰,用于主機在啟動的時候獲得自己的IP地址。
對于ARP首部后面的四個字段分別是源MAC地址、源IP地址、目標MAC地址、目標IP地址,這些就是比較簡單的了。
為了加深理解,我們使用wireshark網絡抓包工具形象地講解報文格式與內容,關于wireshark網絡抓包工具的使用方式我就不做過多講解,網上教程一大把,打開工具,然后抓取電腦網絡中的數據包。

11

-
ip地址
+關注
關注
0文章
309瀏覽量
18939 -
ARP協議
+關注
關注
0文章
10瀏覽量
7120 -
網絡傳輸協議
+關注
關注
0文章
5瀏覽量
6043
發布評論請先 登錄
關于ARP協議發送與接收, FPGA板子上面與PC端主機通信,出現以下情況怎么辦?
基于ARP協議的非法入網檢測與阻止技術研究
基于ARP協議的攻擊及其防御方法分析
高可用性群集系統ARP協議問題研究
ARP協議動態交互仿真系統的設計
ARP協議分析
arp協議的作用是什么?arp協議的工作原理介紹
arp協議的缺點介紹及防范
arp協議屬于哪一層_arp協議的主要功能
ARP協議的工作原理_arp攻擊防御措施
FPGA以太網-ARP協議介紹
ARP協議原理是什么
評論