理解ARP協議

卡巴拉的樹發表於2017-12-29

我們知道在網路中通訊,都是知道對方的IP地址後,才能發起連線,IP地址所在的層是網路層,而在網路層下面是資料鏈路層,這裡IP資料包繼續被封裝成乙太網資料幀,當然還有別的資料鏈路層格式,但是資料鏈路層也需要定址機制,常常就是48bit的硬體地址,又叫MAC地址。

ARP
ARP協議就是起到在IP地址到對應的硬體地址之間提供對映作用的,所以ARP協議又叫地址解析協議

基本工作流

任何時候,當我們發起一個網路接連時,無非有以下的過程:

  1. 知道目標主機名,通過gethostname函式將主機名轉換為IP地址,這個函式在DNS(域名系統)中稱為解析器,這裡推薦看一下阮一峰老師的博文:DNS原理入門

  2. 應用程式通過TCP或者UDP使用得到的IP建立連線。

  3. 如果目標主機在本地網路上,知道IP地址,我們就可以找到對應的主機,如果目標主機在遠端網路中,系統就會找位於本地網路的下一站路由地址,通過IP選路讓路由器轉發IP資料包,這些操作屬於IP協議的核心,在此略過。

  4. 當主機知道IP地址,並把資料包發過去的過程之前,主機在鏈路層實際上是要知道目標主機的實體地址的,每臺主機的實體地址又稱MAC地址是全球唯一的。在這一步,就需要我們的ARP協議。

  5. ARP協議傳送一個ARP請求,這個ARP請求是一個廣播資料幀,意味著區域網內,每一臺機器都能收到,ARP資料幀中包含著目的主機的IP地址,因為是廣播傳送,如果哪臺主機擁有這個IP,則會反饋訊息,發回自己的硬體地址。

  6. 得到了目的主機的硬體地址後,就包含著IP資料包的乙太網資料幀就可以正常傳送了。

ARP的分組格式

在乙太網中,ARP請求和應答都有著下面的分組格式。

分組格式
乙太網的目的地址和源地址:目的乙太網地址全為1,即FF:FF:FF:FF:FF:FF則為廣播地址,在本地區域網內,所有的乙太網介面都要接收這個資料幀。

幀型別:2個位元組長的幀型別,告訴我們這個乙太網資料幀攜帶的是什麼資料。對於ARP來說這兩個位元組是0x0806,對於IP資料包是0x0800,還有RARP(逆地址解析協議)是0x8035

硬體型別和協議型別:這兩個欄位就是用來描述ARP分組的,硬體型別用來指代需要什麼樣的實體地址,協議型別則是需要對映的協議地址型別。用來描述ARP時,表達的就是我有協議型別IP,我需要的硬體型別是乙太網的實體地址。那麼硬體地址就為1,表示乙太網地址,協議型別是0x0800,看這邊與前面的幀型別中提到的IP資料包的幀型別是一樣的,這是有意設計的。

硬體地址長度和協議地址長度:這裡的值分別為6位元組和4位元組。代表48bit的乙太網地址,32bit的IP地址。

操作碼:1=>ARP請求, 2=>ARP應答,3=>RARP請求,4=>RARP應答。這些值用於區分具體操作型別,因為欄位都相同,所以必須指明操作碼,不然連請求還是應答都分不清。

最後四個欄位

  • 源硬體地址
  • 源協議地址
  • 目標硬體地址
  • 目標協議地址。 注意到這裡有兩個欄位是與分組首端重複的。我們在傳送ARP請求時,只有目標硬體地址是空著的,因為我們請求的就是它的值,當對應機器收到後,就會把自己的硬體地址寫到這個欄位,並把操作碼改成2,再發回去。於是就知道彼此的硬體地址,開始真正的通訊。

ARP快取記憶體

知道了ARP傳送的原理後,我們不禁疑惑,如果每次發之前都要傳送ARP請求硬體地址會不會太慢,但是實際上ARP的執行是非常高效的。那是因為每一個主機上都有一個ARP快取記憶體,我們可以在命令列鍵入arp -a獲取本機ARP快取記憶體的所有內容:

arp -a
快取記憶體中的每一項的生存時間一般為20分鐘,有了這些快取,我們經常直接使用硬體地址,加快速度了。

以上說的都是在一個本地網路內完成的,如果ARP請求是從一個網路主機傳送到另一個網路主機呢?下面介紹ARP代理的概念

ARP代理

如果ARP請求是從一個網路主機傳送到另一個網路主機,那麼連線這兩個主機的路由器就可以回答該請求,這個過程稱為委託ARP或者ARP代理。我們知道IP路由選擇,如果主機不相連,我們就把資料包傳送到一預設路由上,由路由器來轉發該資料包。在ARP協議中,我們發往網路的請求主機實體地址也會由路由器回答,得到的就是路由器的實體地址,傳送方就根據這個實體地址把資料包傳送到路由器,由路由器轉發,再下面的事情由路由器完成,那是屬於IP協議的事了,當然在那個過程中,也不斷使用ARP協議獲取每一步的實體地址。

總結

目標IP與自己在同一網段

  • arp快取記憶體有目標IP的MAC地址:直接傳送到該實體地址
  • arp快取記憶體沒有目標IP的MAC地址:傳送ARP廣播請求目標IP的MAC地址,快取該MAC地址,然後發資料包到該MAC地址。

目標IP與自己不在同一個網段

這種情況需要將包發給預設閘道器,所以主要獲取閘道器的MAC地址

  • arp快取記憶體有預設閘道器的MAC地址:直接傳送IP資料包道預設閘道器,再由閘道器轉發到外網。
  • arp快取記憶體沒有預設閘道器的MAC地址 :還是傳送ARP廣播請求預設閘道器的MAC地址,快取該地址,並且傳送資料包到閘道器。

另外一個話題:ARP欺騙

ARP欺騙又叫ARP毒化,英文ARP spoofing,是一種針對ARP的攻擊方式,這裡簡略介紹一下。 執行機制 ARP欺騙主要是攻擊者傳送大量假的ARP資料包到網路上,尤其是閘道器上。假設你的閘道器的IP地址是192.168.0.2,MAC地址為00-11-22-33-44-55,你傳送的資料都會從這個MAC地址經過,這時候我傳送大量ARP資料包,然而我的包是構造出來的,IP是你的IP,但是MAC地址我替換成了我的MAC地址,這時候你更新你的ARP快取時,就會把我機器的MAC地址當成192.168.0.2的MAC地址,於是你的流量都到我這來了,我可以把你的資料改改再發給閘道器,或者什麼都不做,你都上不了網了。 防治方法 最理想的用靜態ARP,不過在大型網路不行,因為ARP經常需要更新,另外一種方法,例如DHCP snooping,網路裝置可藉由DHCP保留網路上各電腦的MAC地址,在偽造的ARP資料包發出時即可偵測到。此方式已在一些廠牌的網路裝置產品所支援。

參考資料:

相關文章