地址解析协议

地址解析协议（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：以太网地址转换协议或转换网络协议地址（中文）