前言
計算機之間可以相互通信的前提是要知道對方的地址,才可以發送信息給其他計算機,就像別人要聯系你也得先知道你的電話號碼一樣。這里的地址因為網絡分層的原因就包括IP地址和MAC地址(即網卡地址、硬件地址)。
計算機發送的信息最終都是被轉換成比特流在物理層上傳輸,所以我們一定要知道的目的主機的MAC地址,最終信息才可以被發送給目的主機。但是我們一般只擁有目標主機的IP地址(假設之前沒有與該目的主機通信過),那么在向目的主機發送數據包之前,我們要先獲取到目標主機的MAC地址。ARP(Address Resolution Protocol)協議便是解決這個問題而存在的,ARP的功能就是將IP地址解析成MAC地址。下面將介紹ARP的工作流程以及抓包分析ARP協議。
ARP工作流程
通信主機依據在同一網段和不同網段可以分為兩種情況,兩種情況的工作過程都包括請求過程和響應過程。
相互通信主機在同一網段
主機A與主機B通信,知道主機B的IP地址后,還要得到主機B的MAC地址。通過將子網掩碼與主機B的IP地址相與發現目的主機與自己在同一網段中,於是主機A獲取主機B的MAC地址將按以下過程進行。
- 主機A首先在自己的
ARP緩存表中檢查主機B匹配的MAC地址,若有,則封裝數據包填寫好主機B的MAC地址,然后發送數據包;否則,向所在網段廣播ARP請求,執行下面將的流程。

- 同網段上的所有主機都會收到主機A的ARP請求並且檢查請求的IP地址是否與自己的IP地址匹配。若是不匹配,則求其該ARP請求
- 主機B發現自己的IP地址與請求的IP地址匹配,則將主機A的IP地址與MAC地址(映射關系)添加到自己ARP緩存表。
- 主機B將包含其MAC地址的ARP響應消息單播發送給主機A
- 主機A收到來自主機B的響應消息后,就會把主機B的IP地址與MAC地址的映射關系存入本地ARP緩存表中。該映射記錄的有效時限默認是120s,當超時后,若在與主機B通信則重復請求過程。得到主機B的MAC地址后,就可以與主機B正常通信了。
相互通信的主機在不同網段


- 當主機A與主機B不在同一網段時,主機A就需要通過網關將信息發送出去。主機A會按照第一種情況得到網關的MAC地址,然后封裝數據,將封裝好的數據發送給網關。在封裝數據包時,源IP地址和源MAC地址填的就是主機A的IP和MAC地址,目的IP填為主機B的IP地址,目的MAC地址填網關(信息是通過網關再傳出去)。
- 網關收到該數據包后,發現目標MAC地址是自己,但是目標IP確實其他主機,所以它不再繼續向上處理這個數據包。而是將數據包發送給下一跳路由(查路由表得出下一跳路由),發送前修改數據包的目的MAC地址為下一跳路由器的MAC地址(此地址由ARP請求獲得)。
- 直到到某一路由器時,該路由器發現,該數據包的目的IP地址在自己所連的網段中,便先獲取到主機B的MAC地址,然后修改數據包的目的MAC地址,就可以將數據包發送給主機B。由此實現不同網段的主機A和B的通信。
得出的幾點結論
- 需要注意ARP是解決同一局域網上的主機或路由器的IP地址和硬件地址映射問題。
- 當源主機和目的主機不在不同一網段上時,數據包就會經過路由轉發,數據包的目的MAC地址也將不斷變化,但是源IP和目的IP是不會變的。在同一網段,源主機就會直接使用ARP請求得到目的主機的MAC地址。
- 總的來說ARP請求過程可以概括為:廣播請求,單播回應
ARP緩存表
ARP緩存包含一個或多個表,這些表被稱為ARP緩存表,是用於存儲IP地址與其對應的MAC地址。為什么要把這些映射關系存儲起來呢?目的就是為了提高工作效率。將訪問的主機的MAC地址記下來,下一次訪問時就不必在啟用ARP協議(當然,映射記錄是由生存期限的)。
可以提高ARP效率的方法
ARP緩存是一種提高ARP效率的方法。還可以有:
- 收到ARP請求的所有主機都緩存其中的IP/MAC,而不是直接丟棄
- 主機入網時,主動廣播它的IP/MAC地址對
ARP抓包分析
ARP幀格式
請查看上一篇文章了解:https://www.cnblogs.com/myworld7/p/8430223.html#_label2
ARP請求包
廣播發送

ARP響應包
單播發送

無償ARP/免費ARP
廣播發送

小結
要想多了解協議,還是的抓包慢慢分析才得行。
