本文转载自wilson《 ARP协议概述 》
1 ARP协议概述
ARP 协议和ICMP 协议是常用的TCP/IP底层协议。在对网络故障进行诊断的时候,它们也是最常用的协议。
ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的底层协议,负责将某个IP地址解析成对应的MAC地址。
2 ARP工作原理
2.1 ARP工作过程
当一个基于TCP/IP的应用程序需要从一台主机发送数据给另一台主机时,它把信息分割并封装成包,附上目的主机的IP地址。然后,寻找IP地址到实际 MAC地址的映射,这需要发送ARP广播消息。当ARP找到了目的主机MAC地址后,就可以形成待发送帧的完整以太网帧头。最后,协议栈将IP包封装到以太网帧中进行传送。
如图1所示,描述了ARP广播过程。
图1 ARP广播
在图1中,当主机A要和主机B通信(如主机A Ping主机B)时。主机A会先检查其ARP缓存内是否有主机B的MAC地址。如果没有,主机A会发送一个ARP请求广播包,此包内包含着其欲与之通信的主机的IP地址,也就是主机B的IP地址。当主机B收到此广播后,会将自己的MAC地址利用ARP响应包传给主机A,并更新自己的ARP缓存,也就是同时将主机A的IP地址/MAC地址对保存起来,以供后面使用。主机A在得到主机B的MAC地址后,就可以与主机B通信了。同时,主机A也将主机B的IP地址 /MAC地址对保存在自己的ARP缓存内。
2.2 ARP报文格式
ARP报文被封装在以太网帧头部中传输,如图2所示,是ARP请求协议报文头部格式。
图2 ARP请求协议报文头部格式
图2中黄色的部分是以太网(这里是Ethernet II类型)的帧头部。其中,第一个字段是广播类型的MAC地址:0XFF-FF-FF-FF-FF-FF,其目标是网络上的所有主机。第二个字段是源 MAC地址,即请求地址解析的主机MAC地址。第三个字段是协议类型,这里用0X0806代表封装的上层协议是ARP协议。
接下来是ARP协议报文部分。其中各个字段的含义如下:
硬件类型:表明ARP实现在何种类型的网络上。
协议类型:代表解析协议(上层协议)。这里,一般是0800,即IP。
硬件地址长度:MAC地址长度,此处为6个字节。
协议地址长度:IP地址长度,此处为4个字节。
操作类型:代表ARP数据包类型。0表示ARP请求数据包,1表示ARP应答数据包。
源MAC地址:发送端MAC地址。
源IP地址:代表发送端协议地址(IP地址)。
目标MAC地址:目的端MAC地址(待填充)。
目标IP地址:代表目的端协议地址(IP地址)。
ARP应答协议报文和ARP请求协议报文类似。不同的是,此时,以太网帧头部的目标MAC地址为发送ARP地址解析请求的主机的MAC地址,而源MAC 地址为被解析的主机的MAC地址。同时,操作类型字段为1,表示ARP应答数据包,目标MAC地址字段被填充以目标MAC地址。
2.3 ARP缓冲区
为了节省ARP缓冲区内存,被解析过的ARP条目的寿命都是有限的。如果一段时间内该条目没有被参考过,则条目被自动删除。在工作站PC的 Windows环境中,ARP条目的寿命是2分钟,在大部分 Cisco 交换机中,该值是5分钟。
在工作站PC的 Windows环境中,可以使用命令arp -a查看当前的ARP缓存,如图3所示。而在 路由器和 交换机中可以命令show arp完成相同的功能,如图4所示。
图3 Windows环境下,命令arp -a的输出
图4 路由器中show arp命令的输出
注意:ARP不能通过IP路由器发送广播,所以不能用来确定远程 网络设备的硬件地址。对于目标主机位于远程网络的情况,IP利用ARP确定默认网关(路由器)的硬件地址,并将数据包发到默认网关,由路由器按它自己的方式转发数据包。
3 反向ARP
反向ARP(Reverse ARP,RARP)用于把物理地址(MAC地址)转换到对应的 IP 地址。例如,在无盘工作站启动的时候,因为无法从自身的操作系统获得自己的IP地址配置信息。这时,无盘工作站可发送广播请求获得自己的IP地址信息,而RARP 服务器则响应IP请求消息-为无盘工作站分配1个未用的IP地址(通过发送RARP应答包)。
反向ARP(RARP)在很大程度上已被BOOTP、DHCP所替代,后面这两种协议对RARP的改进是可以提供除了IP地址外的其它更多的信息,如默认网关、DNS 服务器的IP地址等信息。
4 代理ARP
代理ARP(PROXY ARP)也被称作混杂ARP(Promiscuous ARP)(RFC 925、1027)一般被像路由器这样的设备使用--用来代替处于另一个网段的主机回答本网段主机的ARP请求。
下面是代理ARP的应用之一,如图5所示,主机PC1(192.168.20.66/24)需要向主机PC2(192.168.20.20/24)发送报文,因为主机PC1不知道子网的存在且和目标主机PC2在同一主网络网段,所以主机PC1将发送ARP请求广播报文请求192.168.20.20的 MAC地址。这时,路由器将识别出报文的目标地址属于另一个子网(注意,路由器的接口IP地址配置的是28位的掩码),因此向请求主机回复自己的硬件地址(0004.dd9e.cca0)。之后,PC1将发往PC2的数据包都发往MAC地址0004.dd9e.cca0(路由器的接口E0/0),由路由器将数据包转发到目标主机PC2。(接下来路由器将为PC2做同样的代理发送数据包的工作)。这种ARP使得子网化网络拓扑对于主机来说时透明的(或者可以说是路由器以一个不真实的PC2的MAC地址欺骗了源主机PC1)。
图5 代理ARP
5 无故ARP
无故(Gratuitous ARP,GARP)ARP也称为无为ARP。(也称作免费arp --by shixingwanglinux)主机有时会使用自己的IP地址作为目标地址发送ARP请求。这种ARP请求称为无故ARP,GARP,主要有两个用途:
(1)检查重复地址(如果收到ARP响应表明存在重复地址)。
(2)用于通告一个新的数据链路标识。当一个设备收到一个arp请求时,发现arp缓冲区中已有发送者的IP地址,则更新此IP地址的MAC地址条目。
如图6所示,显示了一台 Cisco路由器在其加电启动后、引导过程中向网络宣布自己的一个以太网接口(Ethernet 0)的MAC地址以及IP地址的包。
图6 无故ARP
ARP 协议和ICMP 协议是常用的TCP/IP底层协议。在对网络故障进行诊断的时候,它们也是最常用的协议。
ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的底层协议,负责将某个IP地址解析成对应的MAC地址。
2 ARP工作原理
2.1 ARP工作过程
当一个基于TCP/IP的应用程序需要从一台主机发送数据给另一台主机时,它把信息分割并封装成包,附上目的主机的IP地址。然后,寻找IP地址到实际 MAC地址的映射,这需要发送ARP广播消息。当ARP找到了目的主机MAC地址后,就可以形成待发送帧的完整以太网帧头。最后,协议栈将IP包封装到以太网帧中进行传送。
如图1所示,描述了ARP广播过程。
![ARP协议概述 - wilson - Wilsons blog](http://cisco.chinaitlab.com/imgfiles/2005.11.22.13.55.42.2.1.jpg)
图1 ARP广播
在图1中,当主机A要和主机B通信(如主机A Ping主机B)时。主机A会先检查其ARP缓存内是否有主机B的MAC地址。如果没有,主机A会发送一个ARP请求广播包,此包内包含着其欲与之通信的主机的IP地址,也就是主机B的IP地址。当主机B收到此广播后,会将自己的MAC地址利用ARP响应包传给主机A,并更新自己的ARP缓存,也就是同时将主机A的IP地址/MAC地址对保存起来,以供后面使用。主机A在得到主机B的MAC地址后,就可以与主机B通信了。同时,主机A也将主机B的IP地址 /MAC地址对保存在自己的ARP缓存内。
2.2 ARP报文格式
ARP报文被封装在以太网帧头部中传输,如图2所示,是ARP请求协议报文头部格式。
![ARP协议概述 - wilson - Wilsons blog](http://cisco.chinaitlab.com/imgfiles/2005.11.22.13.55.51.2.2.jpg)
图2 ARP请求协议报文头部格式
图2中黄色的部分是以太网(这里是Ethernet II类型)的帧头部。其中,第一个字段是广播类型的MAC地址:0XFF-FF-FF-FF-FF-FF,其目标是网络上的所有主机。第二个字段是源 MAC地址,即请求地址解析的主机MAC地址。第三个字段是协议类型,这里用0X0806代表封装的上层协议是ARP协议。
接下来是ARP协议报文部分。其中各个字段的含义如下:
硬件类型:表明ARP实现在何种类型的网络上。
协议类型:代表解析协议(上层协议)。这里,一般是0800,即IP。
硬件地址长度:MAC地址长度,此处为6个字节。
协议地址长度:IP地址长度,此处为4个字节。
操作类型:代表ARP数据包类型。0表示ARP请求数据包,1表示ARP应答数据包。
源MAC地址:发送端MAC地址。
源IP地址:代表发送端协议地址(IP地址)。
目标MAC地址:目的端MAC地址(待填充)。
目标IP地址:代表目的端协议地址(IP地址)。
ARP应答协议报文和ARP请求协议报文类似。不同的是,此时,以太网帧头部的目标MAC地址为发送ARP地址解析请求的主机的MAC地址,而源MAC 地址为被解析的主机的MAC地址。同时,操作类型字段为1,表示ARP应答数据包,目标MAC地址字段被填充以目标MAC地址。
2.3 ARP缓冲区
为了节省ARP缓冲区内存,被解析过的ARP条目的寿命都是有限的。如果一段时间内该条目没有被参考过,则条目被自动删除。在工作站PC的 Windows环境中,ARP条目的寿命是2分钟,在大部分 Cisco 交换机中,该值是5分钟。
在工作站PC的 Windows环境中,可以使用命令arp -a查看当前的ARP缓存,如图3所示。而在 路由器和 交换机中可以命令show arp完成相同的功能,如图4所示。
![ARP协议概述 - wilson - Wilsons blog](http://cisco.chinaitlab.com/imgfiles/2005.11.22.13.56.0.2.3.jpg)
图3 Windows环境下,命令arp -a的输出
![ARP协议概述 - wilson - Wilsons blog](http://cisco.chinaitlab.com/imgfiles/2005.11.22.13.57.12.2.4.jpg)
图4 路由器中show arp命令的输出
注意:ARP不能通过IP路由器发送广播,所以不能用来确定远程 网络设备的硬件地址。对于目标主机位于远程网络的情况,IP利用ARP确定默认网关(路由器)的硬件地址,并将数据包发到默认网关,由路由器按它自己的方式转发数据包。
3 反向ARP
反向ARP(Reverse ARP,RARP)用于把物理地址(MAC地址)转换到对应的 IP 地址。例如,在无盘工作站启动的时候,因为无法从自身的操作系统获得自己的IP地址配置信息。这时,无盘工作站可发送广播请求获得自己的IP地址信息,而RARP 服务器则响应IP请求消息-为无盘工作站分配1个未用的IP地址(通过发送RARP应答包)。
反向ARP(RARP)在很大程度上已被BOOTP、DHCP所替代,后面这两种协议对RARP的改进是可以提供除了IP地址外的其它更多的信息,如默认网关、DNS 服务器的IP地址等信息。
4 代理ARP
代理ARP(PROXY ARP)也被称作混杂ARP(Promiscuous ARP)(RFC 925、1027)一般被像路由器这样的设备使用--用来代替处于另一个网段的主机回答本网段主机的ARP请求。
下面是代理ARP的应用之一,如图5所示,主机PC1(192.168.20.66/24)需要向主机PC2(192.168.20.20/24)发送报文,因为主机PC1不知道子网的存在且和目标主机PC2在同一主网络网段,所以主机PC1将发送ARP请求广播报文请求192.168.20.20的 MAC地址。这时,路由器将识别出报文的目标地址属于另一个子网(注意,路由器的接口IP地址配置的是28位的掩码),因此向请求主机回复自己的硬件地址(0004.dd9e.cca0)。之后,PC1将发往PC2的数据包都发往MAC地址0004.dd9e.cca0(路由器的接口E0/0),由路由器将数据包转发到目标主机PC2。(接下来路由器将为PC2做同样的代理发送数据包的工作)。这种ARP使得子网化网络拓扑对于主机来说时透明的(或者可以说是路由器以一个不真实的PC2的MAC地址欺骗了源主机PC1)。
![ARP协议概述 - wilson - Wilsons blog](http://cisco.chinaitlab.com/imgfiles/2005.11.22.13.57.22.2.5.jpg)
图5 代理ARP
5 无故ARP
无故(Gratuitous ARP,GARP)ARP也称为无为ARP。(也称作免费arp --by shixingwanglinux)主机有时会使用自己的IP地址作为目标地址发送ARP请求。这种ARP请求称为无故ARP,GARP,主要有两个用途:
(1)检查重复地址(如果收到ARP响应表明存在重复地址)。
(2)用于通告一个新的数据链路标识。当一个设备收到一个arp请求时,发现arp缓冲区中已有发送者的IP地址,则更新此IP地址的MAC地址条目。
如图6所示,显示了一台 Cisco路由器在其加电启动后、引导过程中向网络宣布自己的一个以太网接口(Ethernet 0)的MAC地址以及IP地址的包。
![ARP协议概述 - wilson - Wilsons blog](http://cisco.chinaitlab.com/imgfiles/2005.11.22.13.57.33.2.6.jpg)
图6 无故ARP
从图中可以看出,这个ARP包的类型编码是2,(无为arp应该是arp request,即类型编码应该是1,#define ARPOP_REQUEST 1 /* ARP request */ #define ARPOP_REPLY 2 /* ARP reply */----by shixingwanglinux)代表一个ARP应答消息(但是之前并没有对此IP的ARP请求消息)。这个ARP包的源硬件地址(MAC 地址)是路由器的这个接口的MAC地址,目标硬件地址(MAC地址)使用的是广播地址(FF-FF-FF-FF-FF-FF);而源和目标协议地址(IP 地址)都是此接口自身的IP地址。此ARP包用于设备(路由器)向网络宣告自身的IP地址和MAC地址映射,也用于检查是否有重复(冲突)的IP地址。