地址解析協議

地址解析協議（Address Resolution Protocol，縮寫：ARP）是一個透過解析網路層地址來找尋資料鏈路層地址的網路傳輸協議，它在 IPv4 中極其重要。ARP 最初在 1982 年的（徵求意見稿）中提出並納入網際網路標準 STD 37。ARP 也可能指是在多數作業系統中管理其相關地址的一個程序。

ARP 是透過網路位址來定位 MAC 地址。 ARP 已經在很多網路層和資料鏈接層之間得以實現，包括 IPv4、、和 Xerox （PUP）使用 IEEE 802 標準， 光纖分散式資料介面， X.25，幀中繼和非同步傳輸模式（ATM），IEEE 802.3 和 IEEE 802.11 標準上 IPv4 佔了多數流量。

在 IPv6 中鄰居發現協議（NDP）用於代替地址解析協議（ARP）。

基本功能

在 TCP/IP 協議中，傳輸層只關心目標主機的 IP 地址和埠，因為它們唯一確定一個傳輸層的包要互動的目的地，即目標主機上的目標應用程式。網路層會對傳輸層的包進行封裝，形成 IP 包。網路層只關心目標機器的 IP 地址，並根據這個 IP 地址定址到網路上的目標機器。在乙太網中，IP 資料包又被封裝在乙太網幀中，經過物理層 (也就是網絡卡) 傳送到網路上，乙太網幀又是根據 MAC 地址來定址到目的機器的網絡卡的。區域網中的所有機器的網絡卡都會接收到這個幀，而只有該幀頭部中的目的 MAC 地址與自己網絡卡的 MAC 地址匹配時，才會向網路協議棧交付該幀中的資料包，否則網絡卡就會丟棄該幀。因此，當同一區域網中的一臺主機要和另一臺主機或者交換機，路由器等進行網路通訊時，必須要知道與本機用網線連線上的，目標裝置那邊的那個網路介面的 MAC 地址 (也就是網絡卡的地址)。這就導致在乙太網中使用 IP 協議向下傳遞 IP 包時，IP 包被包含在乙太網幀中。乙太網幀是有自己的格式的，在幀頭部就需要填充目的機器 MAC 地址，而此時從 ARP 表裡面沒有查詢到目的 IP 地址對應的 MAC 地址，因此主機會暫存這個 IP 資料包，由於主機剛連線到這個區域網時或者重啟之後，是不知道目的方的 MAC 地址的，如果要向目的機器傳送一個 IP 包，就需要先知道目的機器的 MAC 地址，於是需要一種方法，根據目的主機的 IP 地址，獲得其 MAC 地址，這個方法就是透過傳送一個叫做 ARP 請求的資料包。ARP 資料包也是被包含在乙太網幀中的，傳送時，幀頭部中的目的 MAC 地址填寫為廣播地址 FF:FF:FF:FF:FF:FF，這樣屬於該區域網的所有機器接收到一個廣播幀的時候都會向協議棧遞交這個幀中的資料包：這裡是 ARP 資料包，廣播到該區域網中。而僅當某臺機器的 IP 地址與該 ARP 請求中的要詢問的 IP 地址相同時，那臺機器就才會返回一個 ARP 回應資料包。這個回應包中就包含了先前要詢問的機器的 IP 地址和 MAC 地址，本地主機接收到這個回應的 ARP 資料包後，會提取 IP 地址和 MAC 地址，記錄到一個叫做 ARP 的表的表項中，這樣就把目的主機的 IP 地址和 MAC 地址對應關係記錄下來了，隨即找到先前由於缺少目的 MAC 地址而暫存的資料包，並用乙太網幀封裝它，用該 ARP 表項中的 MAC 地址來填充幀頭部中的 MAC 地址域，當這個幀被髮送到區域網中之後，目標機器網絡卡接收到這個幀之後，判斷該 MAC 地址和自己的 MAC 地址相同，就會向上層協議棧遞交這個幀中的資料包，從而資料得以交付，而其他主機檢測到 MAC 地址與本機不同，會把這個幀丟棄。這就是 ARP 協議要做的事情。

另外，當傳送主機和目的主機不在同一個區域網中時，即便知道對方的 MAC 地址，兩者也不能直接通訊，必須經過路由器進行 IP 層的轉發才可以，因為路由器把這個區域網進行了鏈路層上的隔離 (除非進行網路層次的顯示轉發，否則路由器不會把一個區域網中的乙太網幀自動的轉發到另一個區域網或者外網中去，如果可以自動轉發，可以想象有多可怕，無效的廣播幀可能像洪水一樣淹沒整個網路，使得網路癱瘓，這也就是路由器的基本功能之一，隔離網路)，所以此時，傳送主機會把一個閘道器 IP 地址作為目的 IP 地址 (這個是 IP 層決定的)，那麼透過 ARP 協議獲得的將不是目的主機的真實 MAC 地址，而是一臺可以通往區域網外的路由器的 MAC 地址。於是此後傳送主機發往目的主機的所有幀，都將發往該路由器，透過它向外傳送。這種情況稱為委託 ARP 或 ARP 代理（ARP Proxy）。

在點對點鏈路中不使用 ARP，實際上在點對點網路中也不使用 MAC 地址，因為在此類網路中分別已經獲取了對端的 IP 地址。

資料包結構

地址解析協議的訊息格式很簡單，僅包含單一的地址解析請求或響應。ARP 訊息的長度取決於上下兩層地址的大小，上層地址由所使用的網路協議型別（通常是 IPv4）決定，下層地址則由上層協議所使用的硬體或虛擬鏈路層的型別決定。訊息的報頭中包含了這些型別以及對應的地址長度資訊，此外還包含了表示請求（1）和應答（2）的操作碼。資料包的有效負載為收發雙方的硬體地址、協議地址，總計四個地址。

為了把 IP 地址對映到 48 位乙太網地址用於傳輸，需要一個體現地址轉換協議的包格式。

2.1 乙太網幀

目標乙太網地址：目標 MAC 地址。FF:FF:FF:FF:FF:FF （二進位制全 1）為廣播地址。
源乙太網地址：傳送方 MAC 地址。
幀型別：以太型別，ARP 為 0x0806。

2.2 ARP 報文

硬體型別（HTYPE）：如乙太網（0x0001）、分組無線網。
協議型別（PTYPE）：如網際協議 (IP)（0x0800）、IPv6（0x86DD）。
硬體地址長度（HLEN）：每種硬體地址的位元組長度，一般為 6（乙太網）。
協議地址長度（PLEN）：每種協議地址的位元組長度，一般為 4（IPv4）。
操作碼：1 為 ARP 請求，2 為 ARP 應答，3 為 RARP 請求，4 為 RARP 應答。
源硬體地址（Sender Hardware Address，簡稱 SHA）：n 個位元組，n 由硬體地址長度得到，一般為傳送方 MAC 地址。
源協議地址（Sender Protocol Address，簡稱 SPA）：m 個位元組，m 由協議地址長度得到，一般為傳送方 IP 地址。
目標硬體地址（Target Hardware Address，簡稱 THA）：n 個位元組，n 由硬體地址長度得到，一般為目標 MAC 地址。
目標協議地址（Target Protocol Address，簡稱 TPA）：m 個位元組，m 由協議地址長度得到，一般為目標 IP 地址。

ARP 協議的引數由網際網路號碼分配局（Internet Assigned Numbers Authority, 簡稱 IANA）負責標準化和維護。

ARP 協議的以太型別為 0x0806。該型別出現於乙太網幀格式中的以太型別欄位。請注意區別此型別和 ARP 協議型別（PTYPE）。

2.3 報文格式

原理

在每臺安裝有 TCP/IP 協議的電腦或路由器裡都有一個 ARP 快取表，表裡的 IP 地址與 MAC 地址是一一對應的，如下表所示。

以主機 A（192.168.38.10）向主機 B（192.168.38.11）傳送資料為例。

當傳送資料時，主機 A 會在自己的 ARP 快取表中尋找是否有目標 IP 地址。如果找到就知道目標 MAC 地址為（00-BB-00-62-C2-02），直接把目標 MAC 地址寫入幀裡面傳送就可。
如果在 ARP 快取表中沒有找到相對應的 IP 地址，主機 A 就會在網路上傳送一個廣播（ARP request），目標 MAC 地址是 “FF.FF.FF.FF.FF.FF”，這表示向同一網段內的所有主機發出這樣的詢問：“192.168.38.11 的 MAC 地址是什麼？”
網路上其他主機並不響應 ARP 詢問，只有主機 B 接收到這個幀時，才向主機 A 做出這樣的回應（ARP response）：“192.168.38.11 的 MAC 地址是 00-BB-00-62-C2-02”，此回應以單播方式進行。這樣，主機 A 就知道主機 B 的 MAC 地址，它就可以向主機 B 傳送資訊。同時它還更新自己的 ARP 快取記憶體（ARP cache），下次再向主機 B 傳送資訊時，直接從 ARP 快取表裡查詢就可。

ARP 快取表採用老化機制，在一段時間內如果表中的某一行沒有使用，就會被刪除，這樣可減少快取表的長度，加快查詢速度。

無回報的 ARP（gratuitous ARP），它是指主機發送 ARP 查詢（廣播）自己的 IP 地址，當 ARP 功能被開啟或者是埠初始配置完成，主機向網路傳送無回報的 ARP 來查詢自己的 IP 地址確認地址唯一可用。作用：

確定網路中是否有其他主機使用了 IP 地址，如果有應答則產生錯誤訊息。
無回報的 ARP 可以做更新 ARP 快取用，網路中的其他主機收到該廣播則在快取中更新條目，收到該廣播的主機無論是否存在與 IP 地址相關的條目都會強制更新，如果存在舊條目則會將 MAC 更新為廣播包中的 MAC。

協議的分層

ARP 協議在網際網路協議套件和 OSI 模型的位置可能會造成混亂和爭議。在 僅僅在資料鏈路層提及 ARP 協議當並未說明將此協議置於該層。一些較舊的文件將 ARP 置於 OSI 的資料鏈路層，但是一些新的版本卻將其與網路層聯絡起來。