在實踐中深刻理解ARP協議

0.說明緩存


    本文爲我我的計劃撰寫的博客專題《在實踐中深刻理解常見網絡協議》中關於ARP協議的一篇bash

有興趣的朋友能夠繼續關注個人博客,我將會陸續撰寫各類協議的實踐分析文章。網絡

        在同一個網絡(無特別說明,均指以太網絡)中進行通訊的主機,必需要擁有目標主機的MAC地址纔可以正確地將數據發送給目標主機,那麼如何知道目標主機的MAC地址呢?能夠經過ARP協議。ARP協議就是用來獲取目標IP地址所對應的MAC地址的,也就是說,ARP協議能夠動態地在三層IP地址和二層MAC地址之間創建一種映射關係。能夠用以下示意圖來形象表示其做用:
ide

wKioL1cHdYrzdFoQAABCVOaI8VA489.png

        能夠看到上面的圖示是把ARP協議劃分到網絡層,也既是認爲它是一個網絡層的協議,這是出於它爲網絡層的IP協議提供服務而考慮的。但實際上,因爲ARP協議用以解析出IP地址(邏輯地址)所對應數據鏈路層中的地址(物理地址/硬件地址),因此把其劃分在數據鏈路層也是沒有問題的,這並無嚴格的定義。學習

        咱們下面將經過具體的實踐過程來分析四種常見的ARP包:ARP請求包、ARP響應包、無償ARP包與IP地址衝突檢測,同時也會分析一下ARP代理的發生過程。
ui

        這裏會使用的環境以下:spa

  • 網絡設備模擬器:GNS3操作系統

  • 抓包軟件:Wireshark計算機網絡




1.網絡環境搭建3d


        爲了簡潔起見,這裏不設置一個較大的網絡環境來知足前面四種狀況ARP包分析的須要,而是在分析不一樣的ARP狀況時分別搭建較小的網絡環境,這樣可使咱們的分析更有針對性。




2.ARP包報文格式


        以下:

wKiom1cGFGHRkO7MAAB5efhRsBY432.jpg

        注意咱們關注的是28字節的ARP包,只不過上面的圖還包含了以太網首部字段信息(顯然以太網首部的幀類型爲ARP,在分析IP協議時提到過,這是一個數據分用的概念)。

        由於對於ARP包的分析,其實咱們更關心的應該是ARP請求包、ARP響應包、無償ARP包或者ARP代理相關的知識,然後面的實踐也主要是分類地進行討論。因此下面先給出一個普通ARP包(請求包)的實際結構,而後再給出每個字段的具體含義(參考了《TCP/IP詳解 卷1:協議》的部份內容),先做一個基本的瞭解,最後再詳細分析這些包產生的過程:

  • 一個普通ARP包(請求包的實際結構)

wKioL1cHfA6QwK28AACIULqKkL8900.png

  • ARP包各字段具體含義(對比上面實際抓到的包)

字段 含義
硬件類型

佔16位

表示硬件地址的類型,值爲1即表示以太網地址,也就是MAC地址

協議類型

點16位

表示要映射的協議地址類型,值爲0x0800即表示IP地址,由於本文都是在IP協議的基礎上進行分析的(即網絡層邏輯地址爲IP地址),因此所抓到的包的該字段類型都爲0x0800

硬件地址長度

佔8位

指出硬件地址的長度,單位爲字節,由於本文針對的是以太網,而以太網地址爲MAC地址,佔48位,即6字節,因此後面抓到的包中該字段的值都爲6,再也不做特別說明

協議地址長度

佔8位

指出三層邏輯地址的長度,單位爲字節,由於本文針對的是以太網地址和IP地址的映射,而IP地址佔32位,即6字節,因此後面抓到的包中該字段的值都爲4,再也不做特別說明

操做字段

指出操做類型,對應的值以下:

  • ARP請求:1

  • ARP響應:2

  • RARP請求:3

  • RARP響應:4

但由於RARP如今已經不多使用了,因此本文不會討論

發送端以太網地址

佔48位

準確上說是「發送端硬件地址」,但由於本文只針對以太網進行討論,因此表述爲「發送端以太網地址」

發送端IP地址

佔32位

準確上說是「發送端網絡層邏輯地址」,但由於本文只針對的是以太網地址和IP地址的映射的討論,因此表述爲「發送端IP地址」

目的以太網地址 佔48位
目的IP地址 佔32位




3.在實踐中分析ARP的實現過程:ARP請求、ARP響應


(1)網絡環境搭建

        本節主要是抓取ARP請求包和ARP響應包來分析ARP請求與響應的一個詳細過程,以及對應ARP包中相關字段的含義,這個實踐的網絡環境比較簡單,以下:

wKioL1cH9t3A3IpcAAAYFDS8dzg450.png

        在R1路由器上作以下配置:

R1#conf t
R1(config)#int f0/0
R1(config-if)#no shu
R1(config-if)#ip add 192.168.1.1 255.255.255.0
R1(config-if)#do wr

        在R2路由器上作以下配置:

R2#conf t
R2(config)#int f0/0
R2(config-if)#no shu
R2(config-if)#ip add 192.168.1.2 255.255.255.0
R2(config-if)#do wr

        而後在R1路由器上查看arp緩存表:

R1#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.1.1             -   cc01.127f.0000  ARPA   FastEthernet0/0

        能夠看到arp緩存表中並無192.168.1.2的MAC地址,因此若是待會R1發送數據給R2,必然會有ARP請求發生,因此這裏請確保R1中確實沒有192.168.1.2的MAC地址,若是有的話,建議重啓兩個路由器。(雖然能夠在路由器上執行clear arp-cache來清除arp緩存表,可是清除事後又會立刻生成,因此這裏建議直接重啓)


(2)抓取並分析ARP請求包和ARP響應包

        首先在R1和R2的鏈路上啓動Wireshark,監測R1的接口。(這是GNS3的功能,能夠直接抓取經過兩個路由器之間鏈路的數據包)

        在R1上執行以下命令:

Router#ping 192.168.1.2

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 44/62/76 ms

        !表示數據發送成功,能夠看到第一個是".",則表示數據發送失敗,這是由於,第一個包在發送時,R1中並無192.168.1.2的MAC地址,因而就去發送ARP請求來得到其MAC地址,可是當得到MAC地址以後,第一個包已經超時了(等待MAC地址超時),並無發送出去,能夠看下面抓到的包:

wKioL1cH-e3xXuGhAADU7E7LgVU534.png        

        能夠看到已經有2個ARP包(1個請求和1回答)和8個ICMP包(4個請求和4個回答),這裏咱們主要分析的是ARP包。

  • ARP請求包

        數據包結構以下:

wKiom1cH-kLC3NwiAABfmtjo-0M195.png

        字段分析以下:

a.硬件類型、協議類型、硬件地址長度、協議地址長度

        這幾個字段的內容跟前面討論的同樣,由於針對的是以太網和IP地址

b.操做字段Opcode

        能夠看到Opcode的值爲request(1),因此這是一個ARP請求包。

c.發送端以太網地址

        咱們是從R1向R2發送數據的。

        從前面的命令執行結果:

R1#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.1.1             -   cc01.127f.0000  ARPA   FastEthernet0/0

        這確實是R1的MAC地址(配置了192.168.1.1 IP地址的接口的MAC地址)。

d.發送端IP地址

        發送端也確實是192.168.1.1,也就是R1。

e.目的以太網地址

        能夠看到這裏爲全0,在ARP請求包中,會把目的以太網地址字段的值置爲全0,由於此時並不知道目的以太網地址是什麼(也就是不知道192.168.1.2的MAC地址是多少)。

f.目的IP地址

        數據包是從R1發送給R2的,因此目的IP地址就是192.168.1.2,R2收到這個ARP請求包以後,若是看到這個字段的內容是本身的IP地址,就會回覆這個ARP包,也就是會發送一個ARP響應包。


        其實字段內容並不難理解,不過這裏須要注意一點是,查看這個ARP請求包的數據鏈路層的目的MAC地址:

wKioL1cH_3eSuNofAABuEHLgQXk437.png

        會發現其是一個廣播地址,這也就意味着,發送一個ARP請求包,以太網中的全部主機都可以收到該ARP請求包,可是並非全部的主機都會回覆這個ARP請求包,只有當接收者的IP地址與ARP請求包中的Target IP address中標識的目的IP地址一致時纔會進行回覆。


  • ARP響應包

        數據包結構以下:

wKiom1cIAIjD5WhMAABfYHDqc2M769.png

        對比ARP請求包來分析,其實發現並無相關多少,只是有如下幾點區別:
a.ARP響應包的操做字段Opcode值爲reply(2)

b.ARP響應包的二層目的MAC地址爲ARP請求包發送者的MAC地址

        也就是說,ARP請求包是以廣播的形式發送的,但ARP則是以單播的形式發送的,那麼發給誰呢?ARP請求包是誰發送的,ARP響應包就發給誰,對應的二層目的MAC地址就是ARP請求包發送者的MAC地址

c.發送端以太網地址、發送端IP地址、目的以太網地址、目的IP地址

        跟ARP請求包的內容相反,只不過ARP響應包中的全部地址字段的值都是已知的,這個很容易理解,不過須要注意的是,在這個時候,ARP響應包到底要發給誰,已經很明確了,因此ARP響應包是一個單播包。


        正如上面看到的,理解常規的ARP請求包和ARP響應包的過程並不複雜,只要知道了網絡通訊的基本原理,各個字段的值也就很容易理解了。




4.在實踐中分析ARP的實現過程:無償ARP與IP地址衝突檢測


  • 有償ARP

        前面在獲取某個IP地址對應的MAC地址是,都須要先發送一個ARP請求包,而後再經過接收一個ARP響應包來知道該IP地址所對應的MAC地址,由於須要發送ARP請求包,咱們能夠認爲這是「有償」的,即要付出一些代價。

  • 無償ARP

        而所謂無償ARP,指的就是,我不須要發送一個ARP請求包,對方就會「無償」地把一個ARP響應包發給我(其實也主是主動發送過來),以此來告訴我它的MAC地址。

(1)網絡環境搭建

        可是在總結何時對方會主動把一個ARP響應包發送過來以前,咱們先實踐一下,網絡環境仍是用上面的那個:

wKioL1cH9t3A3IpcAAAYFDS8dzg450.png

        不過咱們須要修改一下R2的IP地址,修改成192.168.1.252(在這個過程當中抓包軟件Wireshark要打開),以下:

R2>en
R2#conf t
R2(config)#int f0/0
R2(config-if)#ip add 192.168.1.252 255.255.255.0


(2)抓取並分析ARP請求包和ARP響應包

        這樣作以後打開Wireshark軟件,會發現抓到下面這樣一個包:

wKioL1cIBo6T_ObPAAAgd1QXSaA867.png        能夠看到Info一列,有個Gratutous的標識,中文意思就是「無償,免費」的意思,咱們能夠查看一下數據包的結構:

wKiom1cIBo7w_G8_AABrB1Dg3DE060.png

        經過查看操做字段Opcode的值,其實能夠發現,無償ARP其實也是一個ARP響應包(不過普通的ARP響應包是以單播的形式發送的,而無償ARP是以廣播的形式發送的),只不過這個ARP響應包比較特別,它是主動發送的,即它是gratuitous,無償的。

        另外須要注意的是,發送端IP地址和目的IP地址是同樣,這正是無償ARP有別於普通ARP響應包的地方,當這個數據包被網絡中的其餘主機(顯然咱們這裏的網絡環境比較簡單,因此只有R1)接收到以後,它會讓這些主機使用新的IP和MAC地址關係更新它們的ARP緩存表。由於這個ARP數據包是未經請求的,即致使客戶端更新ARP緩存,因此會稱爲無償ARP。

        在分析了無償ARP以後,給出下面的幾種狀況,都會有無償ARP過程的發生:

a.更改了設備的IP地址

b.某些操做系統在啓動完成以後就會發送無償ARP(Windows和Linux都會)        


(3)IP地址衝突檢測

        再分析一下,無償ARP有什麼好處呢?以下:

a.可讓以太網中的主機及時地更新其ARP緩存表,這樣能夠確保在數據發送時能夠準確地封閉正確的地址信息

b.檢測IP地址是否有衝突

        關於這一點,能夠給R2從新配置一個IP地址,而且與R1的相同:

R2>en
R2#conf t
R2(config)#int f0/0
R2(config-if)#ip add 192.168.1.1 255.255.255.0

        幾乎立刻就能夠在R1和R2的控制檯上看到錯誤日誌的輸出:

R1>
*Mar  1 00:54:39.007: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:55:09.043: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:55:39.739: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:56:10.011: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:56:40.715: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:57:10.947: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000

R2(config-if)#
*Mar  1 00:45:48.135: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:46:18.623: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:46:48.927: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:47:19.651: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:47:49.959: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:48:21.623: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:48:51.919: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000

        這裏由於在修改了R2的IP地址時,它發送了無償ARP包,R1經過檢查發現其IP地址跟本身的同樣,因而就會在控制檯上報錯,可是R2爲何又會報錯呢?由於在R1發現地址有衝突時,也發送了表示IP地址衝突的無償ARP包,以下:

wKiom1cIDHXA6ONRAAAiRKTdoDQ454.png        注意這是一個廣播包,因此R2必然也能收到,查看它的包結構:

wKioL1cIDbfy14eCAACn4FWd_YA806.png

        根據數據包的內容,R2也知道發生了IP地址衝突,因此也就會在控制檯上輸出錯誤日誌了。




4.在實踐中分析ARP的實現過程:ARP代理


        若是ARP請求是從一個網絡的主機發往另外一個網絡上的主機,那麼鏈接這兩個網絡的路由器就能夠回答這個請求,這個過程就稱爲ARP代理。這是很是精簡和通俗易懂的解釋,咱們能夠經過下面的實踐來進行體會。


(1)網絡環境搭建

        以下:

wKiom1cID2miLu1zAAA2DvoUiiU886.png

        在前面的基礎上,R1增長以下配置:

R1>en
R1#conf t
R1(config)#ip route 0.0.0.0 0.0.0.0 f0/0

        R2增長以下配置:

R2>en
R2#conf t
R2(config)#int f1/0
R2(config-if)#no shu
R2(config-if)#ip add 192.168.2.2 255.255.255.0
R2(config-if)#do wr

        R3則配置以下:

R3>en
R3#conf t
R3(config)#int f0/0
R3(config-if)#no shu
R3(config-if)#ip add 192.168.2.3 255.255.255.0
R3(config-if)#ip route 0.0.0.0 0.0.0.0 f0/0
R3(config-if)#do wr


(2)抓取ARP包並分析ARP代理過程

        在R1和R2的鏈路上啓動Wireshark,而後在R1上執行以下命令:

R1#ping 192.168.2.3

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.2.3, timeout is 2 seconds:
...!!
Success rate is 40 percent (2/5), round-trip min/avg/max = 36/50/64 ms

        即R1給R3發送數據,咱們查看抓到的包:

wKioL1cIFBqD1BVYAAAsVzmbz4c606.png        再分別查看詳細的包結構:

  • ARP請求包

wKiom1cIE7KhNZgoAABfyXIa4cY502.png

        能夠看到ARP請求包跟日常同樣,並無什麼區別,即R1但願知道192.168.2.3的MAC地址。

  • ARP響應包

wKioL1cIFLjAqjNgAABfrw-cHVk558.png

        看起來普通的ARP響應包也沒有什麼區別,其實真的是沒有什麼區別,但不妨在R2上執行下面的命令,查看一下ARP緩存表:

R2#sh arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.1.1             3   cc01.127f.0000  ARPA   FastEthernet0/0
Internet  192.168.2.2             -   cc02.1a18.0010  ARPA   FastEthernet1/0
Internet  192.168.2.3             3   cc03.2327.0000  ARPA   FastEthernet1/0
Internet  192.168.1.2             -   cc02.1a18.0000  ARPA   FastEthernet0/0

        在這個ARP緩存表中,192.168.2.3對應的MAC地址是cc03.2327.0000,並非上面看到的數據包結構中的cc02.1a18.0000!!!cc02.1a18.0000是192.168.1.2對應的MAC地址!!!能夠分析以下:

拓展1:

R1想要知道192.168.2.3的MAC地址,因而發送ARP請求包,但很顯然,192.168.2.3跟192.168.1.1並不在同一個網絡中;當192.168.1.2接口接收到這個ARP請求包時,R2發現雖然192.168.2.3並非本身,可是它能夠到達192.168.2.3所在的網絡,即192.168.2.0/24這個網絡,因而它就向R1發回了一個ARP響應包,告訴R1,192.168.2.3的MAC地址是本身(即配置了192.168.1.2的接口的MAC地址)。雖然這是一種「謊話」,但因爲這樣作確實是能夠幫R1把數據發送到R3,因此有時候咱們也把ARP代理稱做「善意的謊話」。

拓展2:

這也意味着,即便R1知道192.168.2.3跟本身在不一樣的網絡,它也不會直接就說去請求網關的MAC地址(雖然最終數據確定是先發往網關的),而是還會像日常請求同網段IP地址的MAC地址同樣,去發送一個普通的ARP請求,這點尤爲須要注意。

拓展3:

咱們說,若是數據是發往不一樣的網絡的,那麼應該先把數據發給網關,那麼上面爲何不是這樣的呢?那是由於,我在配置R1的默認路由時,是以出接口的方式進行配置的,那也就意味着,並無所謂的網關,即不知道網關是誰,既然若是,R1又怎麼可以直接去請求網關的MAC地址呢?對它來講,根本就沒有網關!可是又由於配置了默認路由,去往未知網絡的數據都直接從1.1的接口發送出去,因此它是直接去請求目的IP地址的MAC地址,而後纔有了後來的ARP代理過程的發生。固然,若是配置的是網關(在思科路由器上的配置是:ip route 0.0.0.0 0.0.0.0 下一跳即網關地址),則會按照正常的流程走,即沒有代理ARP過程的發生。

這一點對於數據轉發的深刻理解是很是重要的,固然,若是以爲難以理解的,也不用太擔憂,這個須要必定時間的積累,同時本身也要注重思考,在實際的學習過程中不能囫圇吞棗,要想有深刻的理解,就必需要作深刻的分析。

        那麼經過上面的實踐過程和分析以後也就很是清楚什麼是ARP代理了。即若是ARP請求是從一個網絡的主機發往另外一個網絡上的主機,那麼鏈接這兩個網絡的路由器就能夠回答這個請求,這個過程就稱爲ARP代理。

        上面這個過程須要體會一下,這樣一來的話,相信對計算機網絡通訊又會有了更深刻的瞭解。




5.下一步要作什麼


        首先有時間固然是本身也嘗試把上面的實踐完成一遍,好好分析一下ARP協議,其實ARP協議所涉及到的重要的內容,上面的實踐過程基本上都已經所有給出,真的不能錯過。

        若是以爲本身已經掌握了的話,能夠嘗試去了解一下ARP欺騙的原理,看看實際上是不是很簡單。

        請繼續關注香飄葉子51cto博客的博客專題《在實踐中深刻理解常見網絡協議》的系列文章,有問題能夠留言提問,謝謝你們!

相關文章
相關標籤/搜索