且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)

更新时间:2022-06-10 06:27:14

本节书摘来自异步社区《TCP/IP路由技术(第一卷)(第二版)》一书中的第1章,第1.4节,作者【美】Jeff Doyle,CCIE #1919,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.4 地址解析协议(ARP)

第1章解释了通过读取和操作数据包的网络地址,路由器可以沿逻辑路径传送数据包,其中逻辑路径包括多个数据链路。沿独立的数据链路传送数据包时,需要把数据包封装在帧中,并且使用数据链路标识(如MAC地址)让帧可以从链路的源点到达目的地。本书的主题之一是为了进行路由选择,路由器利用何种机制发现并共享地址信息。类似的,数据链路上的设备也需要一种方法发现邻居的数据链路标识,以便将数据帧传送到正确的目的地。

有几种机制可以提供这些信息;[15] IPv4使用地址解析协议(ARP),详见RFC826。图1-13给出了ARP的工作机制。当一台设备需要发现另一台设备的数据链路标识符时,它将建立一个ARP请求数据包。这个请求数据包中包括目标设备的IPv4地址以及请求设备(发送者)的源点IPv4地址和数据链路标识符(MAC地址)。然后ARP请求数据包被封装在数据帧中,其中带有作为源的发送者的MAC地址和作为目标的广播地址(参见示例1-6)。[16]


《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)

示例1-6 协议分析器捕捉到图1-13所描述的ARP请求数据包及封装帧


《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)

广播地址意味着数据链路上的所有设备都将收到该帧,并且要检查帧内封装的数据包。除了目标机可以识别此数据包外,其他所有设备都会丢弃此数据包。目标机将向源地址发送ARP响应数据包,提供它的MAC地址(参见示例1-7)。

示例1-7 协议分析器捕捉的图1-13所描述的ARP响应数据包


《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)

当调用调试功能debug arp时,Cisco路由器可以显示ARP的活动情况,参见示例1-8。

示例1-8 路由器Aretha(172.21.5.1)响应来自主机172.19.35.2的ARP请求


《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)

图1-14给出了ARP数据包的格式。这里可以把图中描述的各字段同示例1-6和示例1-7的ARP数据包相对照。


《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)
  • 硬件类型(Hardware Type)——指定了硬件的类型,详见IETF的规范说明。[17] 一些常用的类型编号如表1-5所示。


《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)
  • 协议类型(Protocol Type)——指定了发送者映射到数据链路标识符的网络层协议的类型;IP对应0x0800。
  • 硬件地址长度(Hardware Adress Length)——指定了数据链路标识符的长度,单位是八位组。MAC地址的长度为6。
  • 协议地址长度(Protocol Address Length)——指定了网络层地址的长度,单位是八位组。IPv4地址的长度为4。
  • 操作(Operation)——指明了一个数据包是ARP请求(1)还是ARP响应(2)。这里还可以发现有其他的值表明ARP数据包的其他用途。如反向ARP请求(3)、反向ARP响应(4)、反转ARP请求(8)、反转ARP响应(9)。

最后20个八位组是发送者和目标机的数据链路标识符和IPv4地址。

在示例1-9所示屏幕的最上面,命令show arp用于检查Cisco路由器内的ARP表。

示例1-9 连接到相同网络上的3台设备的ARP表:Cisco路由器,Windows主机和Linux主机


《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)

请注意年龄一栏,这一栏表明为了防止陈旧信息充满ARP表,每经过一个特定的实际间隔,ARP信息将会被刷新。Cisco路由器保存ARP表项的时间为4个小时(14 400s);这个缺省值可以修改。下面的例子就是将ARP的超时值修改为30min(1 800s):

Martha(config)# interface Ethernet 0
Martha(config-if)# arp timeout 1800

示例1-9所示屏幕的中间给出了Windows PC的ARP表,屏幕底部给出了Linux机器的ARP表。虽然它们的格式不同于Cisco路由器的ARP表,但是3个表中的实质性信息是相同的。

ARP表项还可以永久地保存在表中。为了实现地址172.21.5.131到硬件地址0000.00a4.b74c的静态映射,并且采用SNAP(Subnetwork Access Protocol)封装类型,可以使用以下命令完成:

Martha(config)# arp 172.21.5.131 0000.00a4.b74c snap

命令clear arp-cache可以从ARP表中强制删除所有动态表项。并且此命令也可以清除快速交换高速缓冲区和IP路由高速缓冲区中的内容。

ARP还有几种变形,其中至少有一种对路由选择十分重要,它就是代理ARP。

1.4.1 代理ARP

代理ARP有时也被叫做混杂ARP,详见RFC925和RFC1027,代理ARP被路由器作为向主机表明自身可用的一种手段。例如,主机192.168.12.5/24需要向主机192.168.20.101/24发送数据包,但是它没有配置缺省网关信息,因而也就不知道如何到达路由器。这时它可以向192.168.20.101发送一个ARP请求;本地路由器收到这一请求,并且路由器知道如何到达网络192.168.20.0,因此路由器将回复以上请求,其中把自己的数据链路标识符作为ARP回复数据包中的硬件地址。事实上,路由器欺骗了本地的主机,让它认为路由器的接口就是192.168.20.101的接口。最终所有发向192.168.20.101的数据包都被送往路由器。

图1-15给出了代理ARP的另一种用途。这里特别关注的是地址掩码。路由器配置的掩码是28位掩码(4个子网位的C类地址),而主机配置的是标准的C类地址掩码(24位)。


《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)

其结果是主机并不知道子网的存在。当主机192.168.20.66想发送数据包到192.168.20.25时,它首先将发送ARP请求。这时路由器识别出数据包的目标地址属于另一个子网,因而向请求主机回复自己的硬件地址。这种代理ARP使得子网化网络拓扑结构对主机来说是透明的。

示例1-10所示的ARP高速缓冲暗示了代理ARP的又一用途。注意,有多个IPv4地址映射到单一的MAC标识符;其中IP地址对应着主机,而硬件MAC标识符属于路由器接口。

示例1-10 图1-15中主机192.168.20.66的ARP表显示出多个IPv4地址映射到单一MAC标识符,这说明正在使用代理ARP


《TCP/IP路由技术(第一卷)(第二版)》一1.4 地址解析协议(ARP)

在IOS系统中,缺省情况下代理ARP功能是打开的,当然也可以在每个接口上使用命令no ip proxy-arp关闭此功能。

1.4.2 无故ARP

主机偶尔也会使用自己的IPv4地址作为目标地址发送ARP请求。这种ARP请求称为无故ARP,主要有两个用途:

无故ARP可以用于检查重复地址。一台设备可以向自己的IPv4地址发送ARP请求,如果收到ARP响应则表明存在重复地址。
无故ARP还可以用于通告一个新的数据链路标识符。当一台设备收到一个ARP请求,如果ARP高速缓冲中已有发送者的IPv4地址,那么与此IPv4地址相对应的硬件地址将会被发送者新的硬件地址所更新。这种无故ARP用途正是基于此事实。
某个子网内运行热备份路由器协议(HSRP协议)的路由器如果从其他路由器变成了主路由器,它就会发出一个无故ARP来更新该子网上主机的ARP缓存。
许多IP实现中都没有实现无故ARP功能,但是读者应该知道它的存在。在IOS系统中缺省情况下是关闭的,但可以通过命令ip gratuitous-arps激活它。

1.4.3 反向ARP

代替映射硬件地址到已知IPv4地址,反向ARP(RARP)可以实现IPv4地址到已知硬件地址的映射。某些设备,如无盘工作站在启动时可能不知道自己启动时的IPv4地址。嵌入这些设备固件中的RARP程序可以允许它们发送ARP请求,其中硬件地址为设备的硬件编入地址。RARP服务器将会向这些设备回复相应的IPv4地址。

RARP在很大程度上正在被动态主机配置协议(DHCP)和自举协议(BOOTP)的扩展协议所替代,不同于RARP,这两种协议都可以提供IPv4地址以外的更多信息,而且还可以跨越本地数据链路。