36 張圖詳解 ARP :網(wǎng)絡(luò)世界沒有我,你哪也別想去

初識 ARP
從網(wǎng)絡(luò)分層上看,我們知道二層網(wǎng)絡(luò)中,使用 MAC 地址進(jìn)行傳輸,MAC 地址做為數(shù)據(jù)鏈路層的設(shè)備標(biāo)識符。

三層網(wǎng)絡(luò)中,使用 IP 地址進(jìn)行傳輸,IP 地址做為網(wǎng)絡(luò)層的設(shè)備標(biāo)識符。

我們還知道,容易記憶的域名,通過 DNS 解析成 IP 地址,有了 IP 地址就可以在網(wǎng)絡(luò)上找到目的地。

IP 地址通過 ARP ,獲得 MAC 地址,有了 MAC 地址才能在物理網(wǎng)絡(luò)上傳輸數(shù)據(jù)。

ARP 是什么呢?
ARP ,是地址解析協(xié)議。根據(jù)設(shè)備的 IP 地址來查詢對應(yīng) MAC 地址的協(xié)議。主機(jī)通過 ARP 查詢到 MAC 地址后,將在 ARP 緩存表中增加映射表項(xiàng),即 IP 地址和 MAC 地址的映射表項(xiàng)。

舉個(gè)栗子:我想去騰訊總部( IP 地址),但不知道具體位置( MAC 地址),這時(shí)我就可以通過導(dǎo)航軟件( ARP )找到騰訊大廈。

ARP 原理
ARP 是如何知道 MAC 地址的呢?簡單說,ARP 是通過 ARP 請求和 ARP 響應(yīng)報(bào)文確定 MAC 地址的。

假如主機(jī) A 向同一網(wǎng)段上的主機(jī) B 發(fā)送數(shù)據(jù)。主機(jī) A 的 IP 地址為 10.0.0.1 ,主機(jī) B 的 IP 地址為 10.0.0.2 ,主機(jī) C 的 IP 地址為 10.0.0.3 。它們都不知道對方的 MAC 地址。ARP 地址解析過程如下:

主機(jī) A 首先查看自己的 ARP 表(即 ARP 緩存表),確定是否有主機(jī) B 的 IP 地址對應(yīng)表項(xiàng)。如果有,則直接使用表項(xiàng)中的 MAC 地址進(jìn)行封裝,封裝成幀后發(fā)送給主機(jī) B 。

如果主機(jī) A 的 ARP 表沒有對應(yīng)的表項(xiàng),就發(fā)送一個(gè)廣播幀,源 IP 和源 MAC 地址是主機(jī) A ,目的 IP 地址是主機(jī) B ,目的 MAC 地址是廣播 MAC 地址,即
FFFF-FFFF-FFFF。這就是 ARP 請求報(bào)文。

ARP 請求是廣播報(bào)文,同一個(gè)網(wǎng)段的所有主機(jī)都能收到。只有主機(jī) B 發(fā)現(xiàn)報(bào)文中的目的 IP 地址是自己,于是主機(jī) B 發(fā)送響應(yīng)報(bào)文給主機(jī) A ,源 MAC 地址和源 IP 地址是主機(jī) B ,目的 MAC 地址和目的 IP 地址是主機(jī) A ,這個(gè)報(bào)文就叫 ARP 響應(yīng)報(bào)文。同時(shí),主機(jī) B 的 ARP 表記錄主機(jī) A 的映射關(guān)系,即主機(jī) A 的 IP 地址和 MAC 地址的對應(yīng)關(guān)系。

主機(jī) C 也收到了 ARP 請求報(bào)文,但目的 IP 地址不是自己,所以不會進(jìn)行響應(yīng)。于是主機(jī) C 添加主機(jī) A 的映射關(guān)系到 ARP 表,并丟棄 ARP 請求報(bào)文。

主機(jī) A 收到 ARP 響應(yīng)報(bào)文后,添加主機(jī) B 的映射關(guān)系,同時(shí)用主機(jī) B 的 MAC 地址做為目的地址封裝成幀,并發(fā)送給主機(jī) B 。

如果每發(fā)送一個(gè) IP 報(bào)文就要進(jìn)行一次 ARP 請求,來確定 MAC 地址,那將會造成不必要的網(wǎng)絡(luò)流量,通常的做法是用 ARP 表記錄 IP 地址和 MAC 地址的映射關(guān)系。主機(jī)發(fā)送報(bào)文時(shí),首先會查看它的 ARP 表,目的是為了確定是否是已知的設(shè)備 MAC 地址。如果有,就直接使用;如果沒有,就發(fā)起 ARP 請求獲取。不過,緩存是有一定期限的。ARP 表項(xiàng)在老化時(shí)間( aging time )內(nèi)是有效的,如果老化時(shí)間內(nèi)未被使用,表項(xiàng)就會被刪除。

ARP 表項(xiàng)分為動態(tài) ARP 表項(xiàng)和靜態(tài) ARP 表項(xiàng):
動態(tài) ARP 表項(xiàng)由 ARP 動態(tài)獲取,因此在網(wǎng)絡(luò)通信中,無需事先知道 MAC 地址,只要有 IP 地址即可。如果老化時(shí)間內(nèi)未被使用,表項(xiàng)就會被自動刪除。
靜態(tài) ARP 表項(xiàng)是手工配置,不會老化。靜態(tài) ARP 表項(xiàng)的優(yōu)先級高于動態(tài) ARP 表項(xiàng),可以將相應(yīng)的動態(tài) ARP 表項(xiàng)覆蓋。

代理 ARP
ARP 廣播報(bào)文會被路由器隔離,沒有默認(rèn)網(wǎng)關(guān)、網(wǎng)段不同的主機(jī)相互通信時(shí),連接這兩個(gè)網(wǎng)絡(luò)的路由器可以響應(yīng)這個(gè) ARP 請求,這個(gè)過程叫做代理 ARP( Proxy ARP )。

主機(jī) A 與另一個(gè)網(wǎng)段的主機(jī) B 通信,主機(jī) A 直接發(fā)送 ARP 請求,解析主機(jī) B 的 MAC 地址。運(yùn)行了代理 ARP 的路由器收到 ARP 請求后,代替主機(jī) A 在 20.0.0.0 網(wǎng)段發(fā)出 ARP 請求,解析主機(jī) B 的地址。

主機(jī) B 收到路由器發(fā)出的 ARP 請求,發(fā)出 ARP 響應(yīng)報(bào)文,告知自己的 MAC 地址是 2222-2222-2222 。路由器收到 ARP 響應(yīng)后,也向主機(jī) A 發(fā)送 ARP 響應(yīng),但目的 MAC 地址是與 10.0.0.0 網(wǎng)段連接的端口 MAC 地址是 1010-1010-1010 。主機(jī) A 收到報(bào)文后,在 ARP 表中添加 IP 地址是 20.0.0.1 和 MAC 地址是 1010-1010-1010 的映射表項(xiàng)。

因此主機(jī) A 會將所有要發(fā)送給主機(jī) B 的數(shù)據(jù)發(fā)送給路由器,路由器再將其轉(zhuǎn)發(fā)給主機(jī) B 。反之亦然。
代理 ARP 功能屏蔽了分離的網(wǎng)絡(luò),主機(jī)不用修改 IP地址和子網(wǎng)掩碼就可以和現(xiàn)有的網(wǎng)絡(luò)互通。讓用戶使用起來,跟在同一個(gè)網(wǎng)絡(luò)上一樣。代理 ARP 使用在主機(jī)沒有默認(rèn)網(wǎng)絡(luò),或沒有任何路由的網(wǎng)絡(luò)上,通常是那些不支持設(shè)定子網(wǎng)掩碼的老設(shè)備。但代理 ARP 會轉(zhuǎn)發(fā) ARP 廣播報(bào)文,造成網(wǎng)絡(luò)效率低,不適合用于大規(guī)模網(wǎng)絡(luò)。

RARP
RARP 是將 ARP 反過來,從設(shè)備 MAC 地址獲取 IP 地址的一種協(xié)議。通常是打印機(jī)等小型嵌入式設(shè)備接入網(wǎng)絡(luò)時(shí)會用得到。

RARP 原理
使用 RARP 需要搭建一臺 RARP 服務(wù)器,在服務(wù)器上注冊設(shè)備的 MAC 地址及 IP 地址。
設(shè)備插電啟動后,廣播發(fā)送一個(gè)請求報(bào)文,希望獲得 IP 地址應(yīng)答。目的 MAC 地址是廣播地址,源 MAC 地址是自己的物理地址。

RARP 服務(wù)器收到 IP 地址請求后,給設(shè)備分配一個(gè) IP 地址,并通過響應(yīng)報(bào)文發(fā)送給設(shè)備。設(shè)備收到響應(yīng)報(bào)文后,把 RARP 服務(wù)器分配的 IP 地址設(shè)置成自己的 IP 地址。

免費(fèi) ARP
免費(fèi) ARP 是一種特殊的 ARP 請求,它并非通過 IP 找到對應(yīng)的 MAC 地址,而是當(dāng)主機(jī)啟動的時(shí)候,發(fā)送一個(gè)免費(fèi) ARP 請求,即請求自己的 IP 地址的 MAC 地址。

與普通 ARP 請求報(bào)文的區(qū)別在于報(bào)文中的目標(biāo) IP 地址。普通 ARP 報(bào)文中的目標(biāo) IP 地址是其它主機(jī)的 IP 地址;而免費(fèi) ARP 的請求報(bào)文中,目標(biāo) IP 地址是自己的 IP 地址。

免費(fèi) ARP 的作用:
起到一個(gè)宣告作用。它以廣播的形式將數(shù)據(jù)包發(fā)送出去,不需要得到回應(yīng),只為了告訴其它主機(jī)自己的 IP 地址和 MAC 地址。
可用于檢測 IP 地址沖突。當(dāng)一臺主機(jī)發(fā)送了免費(fèi) ARP 請求報(bào)文后,如果收到了 ARP 響應(yīng)報(bào)文,則說明網(wǎng)絡(luò)內(nèi)已經(jīng)存在使用該 IP 地址的主機(jī)。
可用于更新其它主機(jī)的 ARP 緩存表。如果該主機(jī)更換了網(wǎng)卡,而其它主機(jī)的 ARP 緩存表仍然保留著原來的 MAC 地址。這時(shí),通過免費(fèi)的 ARP 數(shù)據(jù)包,更新其它主機(jī)的 ARP 緩存表。
ARP 報(bào)文
ARP 報(bào)文分為 ARP 請求報(bào)文和 ARP 應(yīng)答報(bào)文,它們的報(bào)文格式相同,但是各個(gè)字段的取值不同。

ARP 報(bào)文中各個(gè)字段的含義如下。

網(wǎng)絡(luò)實(shí)戰(zhàn)
ARP 可以動態(tài)地進(jìn)行地址解析,因此網(wǎng)絡(luò)中的設(shè)備無需配置,只要有 IP 地址就可以自動獲得 MAC 地址。但是靜態(tài) ARP 和代理 ARP 等是需要單獨(dú)配置。下面我們代理 ARP 的實(shí)驗(yàn)。
代理 ARP
網(wǎng)絡(luò)拓?fù)?/span>
網(wǎng)絡(luò)拓?fù)?/figcaption>實(shí)驗(yàn)要求
PC1 和 PC2 只配置 IP 地址和子網(wǎng)掩碼;
RT(路由器)配置代理 ARP 功能,PC1 可以 ping 通 PC2 。
操作步驟
PC1 、PC2 分別配置 IP 地址。

RT 配置 IP 地址和代理 ARP 功能。

功能驗(yàn)證
配置完成后,下面就要進(jìn)行驗(yàn)證,檢查功能是否生效、配置是否正確。在 PC1 上 ping PC2 的 IP 地址,進(jìn)行連通性測試。

還可以抓包查看完整的報(bào)文交互過程,同時(shí)驗(yàn)證下理論知識是否正確。

飲水思源:
圖解TCP/IP - 竹下隆史
網(wǎng)絡(luò)基礎(chǔ) - 田果
路由交換技術(shù) - 杭州華三通信技術(shù)有限公司
HCNA網(wǎng)絡(luò)技術(shù)學(xué)習(xí)指南 - 華為技術(shù)有限公司
TCP/IP詳解 卷1:協(xié)議 - Kevin R.Fall
end
