理解ARP協議

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

wKioL1cHdYrzdFoQAABCVOaI8VA489.png

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

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

這裏會使用的環境如下:

網絡設備模擬器:GNS3

抓包軟件:Wireshark


1.網絡環境搭建

爲了簡潔起見,這裏不設置一個較大的網絡環境來滿足前面四種情況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#conft
      R1(config)#intf0/0
      R1(config-if)#noshu
      R1(config-if)#ipadd192.168.1.1255.255.255.0
      R1(config-if)#dowr

      在R2路由器上做如下配置:

      R2#conft
      R2(config)#intf0/0
      R2(config-if)#noshu
      R2(config-if)#ipadd192.168.1.2255.255.255.0
      R2(config-if)#dowr

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

      R1#showarp
      ProtocolAddressAge(min)HardwareAddrTypeInterface
      Internet192.168.1.1-cc01.127f.0000ARPAFastEthernet0/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#ping192.168.1.2
      
      Typeescapesequencetoabort.
      Sending5,100-byteICMPEchosto192.168.1.2,timeoutis2seconds:
      .!!!!
      Successrateis80percent(4/5),round-tripmin/avg/max=44/62/76ms

      !表示數據發送成功,可以看到第一個是".",則表示數據發送失敗,這是因爲,第一個包在發送時,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#showarp
        ProtocolAddressAge(min)HardwareAddrTypeInterface
        Internet192.168.1.1-cc01.127f.0000ARPAFastEthernet0/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#conft
              R2(config)#intf0/0
              R2(config-if)#ipadd192.168.1.252255.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#conft
              R2(config)#intf0/0
              R2(config-if)#ipadd192.168.1.1255.255.255.0

              幾乎馬上就可以在R1和R2的控制檯上看到錯誤日誌的輸出:

              R1>
              *Mar100:54:39.007:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
              *Mar100:55:09.043:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
              *Mar100:55:39.739:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
              *Mar100:56:10.011:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
              *Mar100:56:40.715:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
              *Mar100:57:10.947:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
              
              R2(config-if)#
              *Mar100:45:48.135:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
              *Mar100:46:18.623:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
              *Mar100:46:48.927:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
              *Mar100:47:19.651:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
              *Mar100:47:49.959:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
              *Mar100:48:21.623:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
              *Mar100:48:51.919:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.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#conft
              R1(config)#iproute0.0.0.00.0.0.0f0/0

              R2增加如下配置:

              R2>en
              R2#conft
              R2(config)#intf1/0
              R2(config-if)#noshu
              R2(config-if)#ipadd192.168.2.2255.255.255.0
              R2(config-if)#dowr

              R3則配置如下:

              R3>en
              R3#conft
              R3(config)#intf0/0
              R3(config-if)#noshu
              R3(config-if)#ipadd192.168.2.3255.255.255.0
              R3(config-if)#iproute0.0.0.00.0.0.0f0/0
              R3(config-if)#dowr

               

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

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

              R1#ping192.168.2.3
              
              Typeescapesequencetoabort.
              Sending5,100-byteICMPEchosto192.168.2.3,timeoutis2seconds:
              ...!!
              Successrateis40percent(2/5),round-tripmin/avg/max=36/50/64ms

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

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

              • ARP請求包

                wKiom1cIE7KhNZgoAABfyXIa4cY502.png

                可以看到ARP請求包跟平常一樣,並沒有什麼區別,即R1希望知道192.168.2.3的MAC地址。

                • ARP響應包

                  wKioL1cIFLjAqjNgAABfrw-cHVk558.png

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

                  R2#sharp
                  ProtocolAddressAge(min)HardwareAddrTypeInterface
                  Internet192.168.1.13cc01.127f.0000ARPAFastEthernet0/0
                  Internet192.168.2.2-cc02.1a18.0010ARPAFastEthernet1/0
                  Internet192.168.2.33cc03.2327.0000ARPAFastEthernet1/0
                  Internet192.168.1.2-cc02.1a18.0000ARPAFastEthernet0/0

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

                  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代理稱作“善意的謊言”。

                  那麼通過上面的實踐過程和分析之後也就非常清楚什麼是ARP代理了。即如果ARP請求是從一個網絡的主機發往另一個網絡上的主機,那麼連接這兩個網絡的路由器就可以回答這個請求,這個過程就稱爲ARP代理。

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


                  5.下一步要做什麼

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

                  如果覺得自己已經掌握了的話,可以嘗試去了解一下ARP欺騙的原理,看看其實是不是很簡單。





原文鏈接:https://www.2cto.com/net/201604/498575.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章