ARP

**位址解析協定**（英語：**A**ddress **R**esolution **P**rotocol，縮寫：**ARP**）是一個通過解析網路層位址來找尋資料鏈路層位址的網路傳輸協定，它在 IPv4 中極其重要。ARP 最初在 1982 年的 RFC 826（徵求意見稿）中提出並納入網際網路標準 STD 37。ARP 也可能指是在多數作業系統中管理其相關位址的一個行程。

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

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

## 基本功能

在 TCP/IP 協定中，傳輸層只關心目標主機的 IP 位址 + 埠位址 (因為這兩元素唯一的確定一個傳輸層的包要互動的目的地，也即目標主機上的哪個應用程式，比如 UDP 包或者 TCP 包)。網路層會對傳輸層的包進行封裝形成 ip 包，網路層只關心目標機器的 IP 位址，並根據這個 ip 位址定址到網路上的目的機器。在乙太網路中，IP 封包又是被封裝在乙太網路影格中，經過實體層 (也就是網卡) 傳送到網路上，乙太網路影格又是根據 MAC 位址來定址到目的機器的網卡的 (區域網路中的所有機器的網卡都會接收到這個影格，而只有該影格頭部中的目的 MAC 位址與自己網卡的 MAC 位址匹配時，才會向網路協定棧交付該影格中的封包，否則網卡就會丟棄該影格)。因此，同一區域網路中的一台主機要和另一台主機或者交換機，路由器等進行網路通信時，必須要知道與本機用網線連接上的，目標裝置那邊的那個網路介面的 MAC 位址 (也就是網卡的位址)。這就導致在乙太網路中使用 IP 協定向下傳遞 IP 包時，IP 包被包含在乙太網路影格中，乙太網路影格是有自己的格式的，在影格頭部就需要填充目的機器 MAC 位址，而此時從 ARP 表裡面沒有查詢到目的 ip 位址對應的 MAC 位址，因此主機會暫存這個 ip 封包，由於主機剛連接到這個區域網路時或者重新啟動之後，是不知道目的方的 MAC 位址的，如果要向目的機器傳送一個 ip 包，就需要先知道目的機器的 MAC 位址，於是需要一種方法，根據目的主機的 IP 位址，獲得其 MAC 位址，這個方法就是通過傳送一個叫做 arp 請求的封包 (arp 封包也是被包含在乙太網路影格中的，傳送時，影格頭部中的目的 mac 位址填寫為 0xffffffff，表示在本地區域網路上廣播，這樣屬於該區域網路的所有機器接收到一個廣播影格的時候都會向協定棧遞交這個影格中的封包，這裡是 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 位元乙太網路位址用於傳輸，需要一個體現位址轉換協定的包格式。

### 乙太網路影格

* 目標乙太網路位址：目標 MAC 位址。FF:FF:FF:FF:FF:FF （二進位全 1）為廣播位址。
* 源乙太網路位址：傳送方 MAC 位址。
* 影格類型：以太類型，ARP 為 0x0806。

### 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）。

### 報文格式

## 原理

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

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

1. 當傳送資料時，主機 A 會在自己的 ARP 快取表中尋找是否有目標 IP 位址。如果找到就知道目標 MAC 位址為（00-BB-00-62-C2-02），直接把目標 MAC 位址寫入影格裡面傳送就可。
2. 如果在 ARP 快取表中沒有找到相對應的 IP 位址，主機 A 就會在網路上傳送一個廣播（ARP request），目標 MAC 位址是「FF.FF.FF.FF.FF.FF」，這表示向同一網段內的所有主機發出這樣的詢問：「192.168.38.11 的 MAC 位址是什麼？」
3. 網路上其他主機並不回應 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 位址確認位址唯一可用。作用：

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

## 協定的分層

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

## 參考資料

## 另見

* ARP 欺騙（ARP spoofing）
* NetCut

## 外部連結

* RFC 826：ARP 協定
* RFC 1122
* RFC 826：乙太網路位址轉換協定或轉換網路協定位址（中文）