地址解析协议

地址解析协议（Address Resolution Protocol，缩写：ARP）是一个通过解析网络层地址来找寻数据链路层地址的网络传输协议，它在IPv4中极其重要。ARP最初在1982年的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地址和端口，因为它们唯一确定一个传输层的包要交互的目的地，即目标主机上的目标应用程序。网络层会对传输层的包进行封装，形成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位以太网地址用于传输，需要一个体现地址转换协议的包格式。

**以太网帧**
目标以太网地址：目标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）。

**报文格式**

**原理**
在Windows命令行查看ARP缓存表
在每台安装有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模型的位置可能会造成混乱和争议。在 1122 仅仅在数据链路层提及ARP协议当并未说明将此协议置于该层。一些较旧的文档将ARP置于OSI的数据链路层，但是一些新的版本却将其与网络层联系起来。

**参考资料**

**另见**
ARP欺骗（ARP spoofing）
*NetCut

**外部链接**
 RFC 826：ARP协议- RFC 1122-  RFC 826：以太网地址转换协议或转换网络协议地址（中文）