地址解析協議

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

ARP允許主機通過提供協議來取得與IP位址關聯的MAC地址，從而將IPv4封包傳送到本地網路中的另一個節點。主機利用廣播包含目標節點IP位址的請求，而具有該IP位址的節點以其MAC地址回應請求。

ARP通過網路地址來定位MAC地址。ARP已在多種網路層和數據鏈路層之間得以實現，包括IPv4、和Xerox （PUP）。使用IEEE 802標準、光纖分布式數據接口、X.25、幀中繼和異步傳輸模式（ATM）時，IEEE 802.3和IEEE 802.11標準上IPv4占用了多數流量。

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

## 基本功能

在TCP/IP協議中，傳輸層只關心目標主機的IP位址和埠，因為只需確認傳輸層的數據包所要交互的目的地，即目標主機上的目標應用程式。網路層會對傳輸層的包進行封裝，形成IP包。網路層只關心目標機器的IP位址，並根據此地址尋址到網路上的目標機器。

在乙太網中，IP數據包又被封裝在乙太網幀中，經物理層（即網卡）發送到網路上。乙太網幀根據MAC地址來尋址到目的機器的網卡。區域網中的所有機器的網卡都會接收到這個幀，只有幀頭部中的目的MAC地址與自己網卡的MAC地址匹配時，才會向網路協議棧交付該幀中的數據包；否則網卡會丟棄該幀。因此，當同一區域網中的一台主機要與另一台主機、交換機或路由器等進行網路通信時，必須知道與本機用網線連接的目標設備網路接口的MAC地址（即網卡地址）。這就導致在乙太網中使用IP協議向下傳遞IP包時，IP包被包含在乙太網幀中。

乙太網幀有自身的格式，在幀頭部需要填充目的機器MAC地址。此時若從ARP表中未能查詢到目的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地址不匹配而丟棄該幀。這就是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協議的參數由網際網路號碼分配局（IANA）負責標準化和維護。

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

### 報文格式

長度（位）｜48｜48｜16｜16｜16｜8｜8｜16｜48｜32｜48｜32

數據類型｜目標乙太網地址｜源乙太網地址｜幀類型｜硬體類型｜協議類型｜硬體地址長度｜協議地址長度｜操作碼｜源硬體地址｜源協議地址｜目標硬體地址｜目標協議地址

組成｜14位元組 乙太網首部｜28位元組 ARP請求/應答

## 原理

<image>

每台安裝TCP/IP協議的電腦或路由器中都有一個ARP緩存表，表內的IP位址與MAC地址一一對應，如下表所示。

主機名稱｜IP位址｜MAC地址

A｜192.168.38.10｜00-AA-00-62-D2-02

B｜192.168.38.11｜00-BB-00-62-C2-02

C｜192.168.38.12｜00-CC-00-62-C2-02

D｜192.168.38.13｜00-DD-00-62-C2-02

E｜192.168.38.14｜00-EE-00-62-C2-02

...｜...｜...

以主機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發送資訊。同時主機A更新自己的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的數據鏈路層，而較新的版本則將其與網路層聯繫起來。

## 外部連結

- RFC 826：ARP協議
- RFC 1122
- RFC 826：乙太網地址轉換協議或轉換網路協議地址（中文）