概述
網絡層以上的協議用IP地址來標識網絡接口,但以太數據幀傳輸時,以物理地址來標識網絡接口。因此我們需要進行IP地址與物理地址之間的轉化。
對於IPv4來說,我們使用ARP地址解析協議來完成IP地址與物理地址的轉化(IPv6使用鄰居發現協議進行IP地址與物理地址的轉化,它包含在ICMPv6中)。
ARP協議提供了網絡層地址(IP地址)到物理地址(mac地址)之間的動態映射。ARP協議 是地址解析的通用協議
請求的例子:
MAC 地址 與 IP地址
Mac地址由設備制造商定義/分配,每一個硬件設備都有一個鏈路層主地址(MAC地址),保存在設備的永久內存中。設備的mac地址不會改變(現在可以進行mac地址偽裝)
IP地址由用戶配置給網絡接口, 網絡接口的IP地址是可以發生變化的(通過DHCP獲取IP,變化速度比較快)
獲取目的端的MAC地址(在一個以太網中)步驟如下:
1.發送ARP請求的以太網數據幀給以太網上的每個主機,即廣播(以太網源地址填全1)。ARP請求幀中包含了目的主機的IP地址。
2.目的主機收到了該ARP請求之后,會發送一個ARP應答,里面包含了目的主機的MAC地址。
ARP協議工作原理
- 每個主機都會在自己的 ARP 緩沖區中建立一個 ARP 列表,以表示 IP 地址和 MAC 地址之間的對應關系。
- 主機(網絡接口)新加入網絡時(也可能只是mac地址發生變化,接口重啟等), 會發送免費ARP報文把自己IP地址與Mac地址的映射關系廣播給其他主機。
- 網絡上的主機接收到免費ARP報文時,會更新自己的ARP緩沖區。將新的映射關系更新到自己的ARP表中。
- 某個主機需要發送報文時,首先檢查 ARP 列表中是否有對應 IP 地址的目的主機的 MAC 地址,如果有,則直接發送數據,如果沒有,就向本網段的所有主機發送 ARP 數據包,該數據包包括的內容有:源主機 IP 地址,源主機 MAC 地址,目的主機的 IP 地址等。
- 當本網絡的所有主機收到該 ARP 數據包時:
(A)首先檢查數據包中的 IP 地址是否是自己的 IP 地址,如果不是,則忽略該數據包。
(B)如果是,則首先從數據包中取出源主機的 IP 和 MAC 地址寫入到 ARP 列表中,如果已經存在,則覆蓋。
(C) 然后將自己的 MAC 地址寫入 ARP 響應包中,告訴源主機自己是它想要找的 MAC 地址。
6.源主機收到 ARP 響應包后。將目的主機的 IP 和 MAC 地址寫入 ARP 列表,並利用此信息發送數據。如果源主機一直沒有收到 ARP 響應數據包,表示 ARP 查詢失敗。
ARP工作實例
下面我們就來談一談ARP地址解析協議是如何把目的地址的IP地址轉化成MAC地址的。
1. 首先,主機A想要向主機B發送消息,但它不知道主機B的MAC地址,只知道主機B的IP地址。這時,主機A會在當前局域網下以廣播的形式發送ARP請求數據報,表示主機A想知道主機B的MAC地址(注:廣播時,以太網首部的目的地址為全f)。
2. 由於是廣播,所以在本局域網上的所有主機都會受到主機A發送的ARP數據報,然后所有主機會把以太網首部這個報頭給去掉,向上面的網絡層發送ARP數據報。在這里我們便可以回答上面的問題了,以太網首部和ARP數據報內的MAC地址都不能少,一個是在數據鏈路層使用的,一個是在網絡層使用的,因為兩個層都不能看到互相的數據。
3. 網絡層首先會檢查op字段,發現這時個ARP請求數據報,然后又會檢查目的IP地址字段,檢查完畢后,這時除了主機B外,在這個局域網內的其他主機都會把數據報丟棄,因為只有主機B的IP地址和目的IP地址是相同的。
ARP緩存
ARP高速緩存(即ARP表)是 ARP地址解析協議能夠高效運行的關鍵, (如果有多次ARP響應時,以最后一次響應為准)
ARP給IP地址和MAC地址中間做了動態映射,也就是說緩存了一個ARP表,將得到的IP地址和MAC地址對應起來,如果在表中沒有查到IP地址對應的MAC地址,就會發廣播去找。隨着用戶的使用,ARP表如果不做任何措施,就會變得越來越臃腫緩慢,就降低了網絡傳輸數據的效率,所以ARP緩存中每一項被設置了生存時間,一般是20分鍾,從被創建時開始計算,到時則清除,如果在計時期間又被使用了,計時會重置。
我們可以通過arp
命令查看arp表:
ARP表中記錄了一些IP地址與物理地址的映射,在arp表中,我們可以看到一個Flags字段,該字段有C、M、P三種取值:
C: 表明arp條目為通過ARP請求動態獲取,(一般存活時間為20min)
M:表明arp條目為手動設置。
P: 表示Publish,表示該ARP條目可以用於恢復其他主機的ARP請求。(用於ARP proxy)
報文格式(ARP 幀)
ARP幀以以太幀的形式存在,即ARP消息包含在以太幀中 ,因此包含以太幀的首部和尾部。(這里不考慮802.1p/q等特殊以太幀)。
* 幀類型*:用來向收到數據報的主機表示該數據報的類型,常見類型如下:
0800:IP數據報;
0806:ARP請求/應答數據報;
8035:RAPP請求/應答;
ARP Request or Reply Message 是ARP幀的核心部分。
前14字節是以太網首部幀格式 ,然后后面四個字段描述了本ARP幀涉及的硬件類型和協議類型。
Hard Type:該字段占2個字節,指定硬件地址類型, 如值為1表示為以太網地址。
Prot Type :該字段占2個字節,指定協議地址類型,如0x0800 表示協議地址類型為IPv4地址。該值與以太幀首部的類型字段相同。
Hard Size: 表示硬件地址的大小(單位:字節),如以太網地址為6。
Prot Size : 表示協議地址的大小(單位:字節), 如IPv4地址大小為4。(硬件地址長度和協議地址長度,分別占1個字節,指出硬件地址和協議地址的長度,以字節為單位。)
OP : 表示ARP的消息類型。
1:ARP Request;
2:ARP Reply
3:RARP Request
4:RARP Reply
后面四個字段寫入的是一些物理地址和協議地址。不一定全部有值。
對於ARP Request 而言,我們不知道目的MAC地址是什么,因此 Target’s Hardware Address 全部填充為0.
ARP幀的交互
當主機接收到一個針對其協議地址的ARP Request時,它會回應ARP Reply. 該Reply消息內容為:對調sender 和 Target 地址字段,然后將Sender’s Hardware Address(即原來的Target’s Hardware Address )修改為本機的Hardware Address。另外OP字段有1變為2.
局域網中一台主機獲取已知一台IP地址的主機的硬件地址過程:


免費ARP 和 地址沖突檢測
* 免費ARP* 指的是 主機發送一個ARP請求,求尋找自己的IP地址 。常用在系統引導時,對網絡接口進行配置的時候。
免費ARP有兩個重要作用
1. 檢測網絡上是否有其他主機的IP地址與本機相同,即地址沖突檢測。
2. 當主機向網絡廣播免費ARP時,其實她也將自己的IP地址與物理地址的映射關系廣播給其他主機了。因此,如果本機的硬件地址發生了變化,其他主機也應該做出相應的更新。
ARP請求發送到了目的端之后,目的端填上了自己的硬件地址,然后把兩個目的端地址和兩個發送端地址交換,把op的值置為2,再把該ARP數據報發回去。
前面提到的獲取目的端的MAC地址的步驟是在一個特殊的條件下完成了,即發送端和目的端都在同一個以太網中,那么當發送端和目的端不在同一個網絡中呢。
這種情況下有一個術語叫ARP代理。連接發送端和目的端網絡的路由器就充當這樣一個代理。舉個簡單的例子,當主機A發送ARP請求給主機B時,它們處於不同的網絡,但是由路由器C相連,當C識別出主機B的IP地址屬於它連接的一個主機,這時C就會欺騙主機A,讓A誤認C就是目的主機,然后C就將ARP數據報發給B,最后B再將ARP應答發回來。
還有最后一個ARP特性:免費ARP
它是指主機發送ARP查找自己的IP地址。
作用有兩個:
1.主機可以通過它來確定另一個主機有沒有設置同樣的IP地址。
2.如果發送免費ARP的主機改變了硬件地址(換了網卡),那么這個分組就會更新其它主機高速緩存表中舊的硬件地址。
ARP報頭定義如下:
- #!/bin/bash
- net='192.168.199.'
- i=1
- count=0
- while [ $i -le 254 ]
- do
- if [ $count -eq 20 ];then
- count=0
- sleep 1
- fi
- ping -c1 $net$i &
- let i++
- let count++
- done
- wait
- echo '############################################'
- arp -a | grep -v 'incomplete'
- echo '############################################'
