什么是ARP?它是如何進行地址解析的?
前言
ARP(Address Resolution Protocol,地址解析協議)是用來將IP地址解析為MAC地址的協議。主機或三層網絡設備上會維護一張ARP表,用于存儲IP地址和MAC地址的映射關系,一般ARP表項包括動態ARP表項和靜態ARP表項。
01 為什么需要ARP?
在局域網中,當主機或其它三層網絡設備有數據要發送給另一臺主機或三層網絡設備時,需要知道對方的網絡層地址(即IP地址)。但是僅有IP地址是不夠的,因為IP報文必須封裝成幀才能通過物理網絡發送,因此發送方還需要知道接收方的物理地址(即MAC地址),這就需要一個通過IP地址獲取物理地址的協議,以完成從IP地址到MAC地址的映射。地址解析協議ARP即可實現將IP地址解析為MAC地址。
02 ARP有哪些類型?
2.1 動態ARP
動態ARP表項由ARP協議通過ARP報文自動生成和維護,可以被老化,可以被新的ARP報文更新,也可以被靜態ARP表項覆蓋。
動態ARP適用于拓撲結構復雜、通信實時性要求高的網絡。
2.2 靜態ARP
靜態ARP表項是由網絡管理員手工建立的IP地址和MAC地址之間固定的映射關系。靜態ARP表項不會被老化,不會被動態ARP表項覆蓋。
正常情況下網絡中設備可以通過ARP協議進行ARP表項的動態學習,生成的動態ARP表項可以被老化,可以被更新。但是當網絡中存在ARP攻擊時,設備中動態ARP表項可能會被更新成錯誤的ARP表項,或者被老化,造成合法用戶通信異常。
靜態ARP表項不會被老化,也不會被動態ARP表項覆蓋,可以保證網絡通信的安全性。靜態ARP表項可以限制本端設備和指定IP地址的對端設備通信時只使用指定的MAC地址,此時攻擊報文無法修改本端設備的ARP表中IP地址和MAC地址的映射關系,從而保護了本端設備和對端設備間的正常通信。一般在網關設備上配置靜態ARP表項。
靜態ARP表項分為短靜態ARP表項和長靜態ARP表項。
- 短靜態ARP表項:手工建立IP地址和MAC地址之間固定的映射關系,未同時指定VLAN和出接口。
- 如果出接口是處于二層模式的以太網接口,短靜態ARP表項不能直接用于報文轉發。當需要發送報文時,設備會先發送ARP請求報文,如果收到的ARP應答報文中的源IP地址和源MAC地址與所配置的IP地址和MAC地址相同,則將收到ARP應答報文的VLAN和接口加入該靜態ARP表項中,后續設備可直接用該靜態ARP表項轉發報文。
- 長靜態ARP表項:手工建立IP地址和MAC地址之間固定的映射關系,并同時指定該ARP表項所在VLAN和出接口。
- 長靜態ARP表項可以直接用于報文轉發。建議用戶采用長靜態ARP表項。
2.3 免費ARP
設備主動使用自己的IP地址作為目的IP地址發送ARP請求,此種方式稱免費ARP。
免費ARP有如下作用:
- IP地址沖突檢測:當設備接口的協議狀態變為Up時,設備主動對外發送免費ARP報文。正常情況下不會收到ARP應答,如果收到,則表明本網絡中存在與自身IP地址重復的地址。如果檢測到IP地址沖突,設備會周期性的廣播發送免費ARP應答報文,直到沖突解除。
- 用于通告一個新的MAC地址:發送方更換了網卡,MAC地址變化了,為了能夠在動態ARP表項老化前通告網絡中其他設備,發送方可以發送一個免費ARP。
- 在VRRP備份組中用來通告主備發生變換:發生主備變換后,MASTER設備會廣播發送一個免費ARP報文來通告發生了主備變換。
2.4 Proxy ARP
如果ARP請求是從一個網絡的主機發往同一網段但不在同一物理網絡上的另一臺主機,那么連接這兩個網絡的設備就可以回答該ARP請求,這個過程稱作ARP代理(Proxy ARP)。
Proxy ARP有以下特點:
- Proxy ARP部署在網關上,網絡中的主機不必做任何改動。
- Proxy ARP可以隱藏物理網絡細節,使兩個物理網絡可以使用同一個網絡號。
- Proxy ARP只影響主機的ARP表,對網關的ARP表和路由表沒有影響。
Proxy ARP分為路由式Proxy ARP、VLAN內Proxy ARP和VLAN間Proxy ARP。
路由式Proxy ARP
路由式Proxy ARP就是使那些在同一網段卻不在同一物理網絡上的網絡設備能夠相互通信的一種功能。
在實際應用中,如果連接設備的主機上沒有配置缺省網關地址(即不知道如何到達本網絡的中介系統),此時將無法進行數據轉發。
如下圖所示,Host_1的IP地址為172.16.1.10/16,Host_2的IP地址為172.16.2.20/16,Host_1與Host_2處于同一網段。Switch通過VLAN10和VLAN20連接兩個網絡,VLANIF10和VLANIF20的IP地址不在同一個網段。

路由式Proxy ARP典型組網應用
當Host_1需要與Host_2通信時,由于目的IP地址與本機的IP地址為同一網段,因此Host_1以廣播形式發送ARP請求報文,請求Host_2的MAC地址。但是,由于兩臺主機處于不同的物理網絡(不同廣播域)中,Host_2無法收到Host_1的ARP請求報文,因此也就無法應答。
通過在Switch上啟用路由式Proxy ARP功能,可以解決此問題。啟用路由式Proxy ARP后,Switch收到ARP請求報文后,Switch會查找路由表。由于Host_2與Switch直連,因此Switch上存在到Host_2的路由表項。Switch使用自己的MAC地址給Host_1發送ARP應答報文。Host_1將以Switch的MAC地址進行數據轉發。此時,Switch相當于Host_2的代理。如上圖所示,Host_1上的ARP表項中到目的地址Host_2的IP地址對應的MAC地址為Switch的VLANIF10接口的MAC地址。
VLAN內Proxy ARP
如果兩個用戶屬于相同的VLAN,但VLAN內配置了端口隔離。此時用戶間需要三層互通,可以在關聯了VLAN的接口上啟動VLAN內Proxy ARP功能。
如下圖所示,Host_1和Host_2是Switch設備下的兩個用戶。連接Host_1和Host_2的兩個接口在Switch屬于同一個VLAN10。

VLAN內Proxy ARP典型組網應用
由于在Switch上配置了VLAN內不同接口彼此隔離,因此Host_1和Host_2不能直接在二層互通。
若Switch的接口使能了VLAN內Proxy ARP功能,可以使Host_1和Host_2實現三層互通。Switch的接口在接收到目的地址不是自己的ARP請求報文后,Switch并不立即丟棄該報文,而是查找該接口的ARP表項。如果存在Host_2的ARP表項,則將自己的MAC地址發送給Host_1,并將Host_1發送給Host_2的報文代為轉發。實際上此時Switch相當于Host_2的代理。
VLAN間Proxy ARP
如果兩臺主機處于相同網段但屬于不同的VLAN,用戶間要進行三層互通,可以在關聯了這些VLAN的接口(例如VLANIF接口或者子接口)上使能VLAN間Proxy ARP功能。
如下圖所示,Host_1和Host_2是Switch設備下的兩個用戶,Host_1和Host_2處于相同網段,但Host_1屬于VLAN10,Host_2屬于VLAN20。

VLAN間Proxy ARP典型組網應用
由于Host_1和Host_2屬于不同的Sub-VLAN,Host_1和Host_2不能直接實現二層互通。
如果Switch上使能了VLAN間Proxy ARP功能,可以使Host_1和Host_2實現三層互通。Switch的接口在接收到目的地址不是自己的ARP請求報文后,并不立即丟棄該報文,而是查找ARP表項(包括動態學習的ARP表項和靜態配置的ARP表項)。如果存在Host_2的ARP表項,則將自己的MAC地址發送給Host_1,并將Host_1發送給Host_2的報文代為轉發。實際上此時Switch相當于Host_2的代理。
03 ARP是如何進行地址解析的?
動態ARP通過廣播ARP請求和單播ARP應答這兩個過程完成地址解析。

ARP地址解析過程
當需要通信的兩臺主機處于同一網段時,如上圖中的Host_1和Host_3,Host_1要向Host_3發送數據。
- 首先,Host_1會查找自己本地緩存的ARP表,確定是否包含Host_3對應的ARP表項。
- 如果Host_1在ARP表中找到了Host_3對應的MAC地址,則Host_1直接利用ARP表中的MAC地址,對數據報文進行幀封裝,并將數據報文發送給Host_3。
- 如果Host_1在ARP表中找不到Host_3對應的MAC地址,則先緩存該數據報文,并以廣播方式發送一個ARP請求報文。
- 如上圖中所示,OP字段為1表示該報文為ARP請求報文,ARP請求報文中的源MAC地址和源IP地址為Host_1的MAC地址和IP地址,目的MAC地址為全0的MAC地址,目的IP地址為Host_3的IP地址。
- Switch_1收到ARP請求報文后,將該ARP請求報文在同一廣播域內轉發。
- 同一廣播域內的主機Host_2和Host_3都能接收到該ARP請求報文,但只有被請求的主機(即Host_3)會對該ARP請求報文進行處理。Host_3比較自己的IP地址和ARP請求報文中的目的IP地址,當兩者相同時進行如下處理:將ARP請求報文中的源IP地址和源MAC地址(即Host_1的IP地址和MAC地址)存入自己的ARP表中。之后以單播方式發送ARP應答報文給Host_1,ARP應答報文內容如上圖中所示,OP字段為2表示該報文為ARP應答報文,源MAC地址和源IP地址為Host_3的MAC地址和IP地址,目的MAC地址和目的IP地址為Host_1的MAC地址和IP地址。
- Switch_1收到ARP應答報文后,將該ARP應答報文轉發給Host_1。Host_1收到ARP應答報文后,將Host_3的MAC地址加入到自己的ARP表中以用于后續報文的轉發,同時將數據報文進行幀封裝,并將數據報文發送給Host_3。
當需要通信的兩臺主機處于不同網段時,如上圖中的Host_1和Host_4,Host_1上已經配置缺省網關,Host_1首先會發送ARP請求報文,請求網關Router的IP地址對應的MAC地址。
Host_1收到ARP應答報文后,將數據報文封裝并發給網關,再由網關將數據報文發送給目的主機Host_4。
Host_1學習網關IP地址對應的ARP表項的過程,以及網關設備學習Host_4的IP地址對應的ARP表項的過程與上述同網段主機Host_1和Host_3之間進行ARP地址解析的過程類似,不再贅述。
04 ARP老化機制
如上圖中所示,如果每次Host_1和Host_3通信前都要發送一個廣播的ARP請求報文,會極大的增加網絡負擔。而且同廣播域的所有設備都需要接收和處理這個廣播的ARP請求報文,也極大的影響了網絡中設備的運行效率。
為了解決以上問題,每臺主機或設備上都維護著一個高速緩存,這是ARP高效運行的一個關鍵。在這個高速緩存中,存放主機或設備最近學習到的IP地址到MAC地址的映射關系,即動態ARP表項。
主機或設備每次發送報文時,會先在本地高速緩存中查找目的IP地址所對應的MAC地址。如果高速緩存中有對應的MAC地址,主機或設備不會再發送ARP請求報文,而是直接將報文發至這個MAC地址;如果高速緩存中沒有對應的MAC地址,主機或設備才會廣播發送ARP請求報文,進行ARP地址解析。
一方面由于高速緩存的容量限制,另一方面為了保證高速緩存中ARP表項的準確性,設備會對動態ARP表項進行老化和更新。
動態ARP表項的老化參數有:老化超時時間、老化探測次數和老化探測模式。設備上動態ARP表項到達老化超時時間后,設備會發送老化探測報文(即ARP請求報文),如果能收到ARP應答報文,則更新該動態ARP表項,本次老化探測結束;如果超過設置的老化探測次數后仍沒有收到ARP應答報文,則刪除該動態ARP表項,本次老化探測結束。
設備發送的老化探測報文可以是單播報文,也可以是廣播報文。缺省情況下,設備只在最后一次發送ARP老化探測報文是廣播模式,其余均為單播模式發送。當對端設備MAC地址不變時,可以配置接口以單播模式發送ARP老化探測報文。
當接口Down時設備會立即刪除相應的動態ARP表項。
05 ARP報文格式
ARP請求和應答的報文格式如下圖所示。

ARP請求和應答報文格式
報文的長度是42字節。前14字節的內容表示以太網首部,后28字節的內容表示ARP請求或應答報文的內容。報文中相關字段的解釋如下圖所示。

ARP報文各字段的含義