引言
從前一篇“網絡底層知識講解”文章中,我們知道計算機中會維護一個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文章
305瀏覽量
17372 -
ARP協議
+關注
關注
0文章
10瀏覽量
6979 -
網絡傳輸協議
+關注
關注
0文章
5瀏覽量
5929
發布評論請先 登錄
相關推薦
關于ARP協議發送與接收, FPGA板子上面與PC端主機通信,出現以下情況怎么辦?
基于ARP協議的非法入網檢測與阻止技術研究
基于ARP協議的攻擊及其防御方法分析
高可用性群集系統ARP協議問題研究
ARP協議動態交互仿真系統的設計

ARP協議分析
arp協議的作用是什么?arp協議的工作原理介紹

arp協議的缺點介紹及防范
arp協議屬于哪一層_arp協議的主要功能
ARP協議的工作原理_arp攻擊防御措施
FPGA以太網-ARP協議介紹

評論