引言
当一台主机把以太网数据帧发送到位于局域网内的另一台主机时,设备驱动程序是根据链路层的以太网MAC地址来确定以太网帧的出口的。
值得注意的是,所有的TCP/IP数据报最后都是封装成以太网帧来发送,也就是说设备驱动程序真正发送帧的时并不会查看所谓的IP互联网地址,而是只检查MAC地址,并根据MAC地址来找到出口。这边理解很容易跟路由查表找出口混淆,认为是根据路由表查找出口,其实路由表查找的是下一跳的网络接口IP地址,真正以太网帧发送的时候,是需要先根据下一跳的IP地址,先找到其对应的MAC地址,然后根据MAC地址找到真正的出口。
而如何根据IP地址查找其对应的MAC地址呢?实际上就是通过这个arp协议来查找对应的MAC地址。ARP协议为32位的IP地址和48位的MAC地址转换提供服务。
例子先举个例子,给个直观的印象,初步认识一下ARP协议是如何工作的。
当我们在系统中键入命令FTP hostname时,系统中会完成一系列的操作,如图4-1.
4-1
在ARP背后有一个基本概念,那就是网络接口有一个硬件地址(一个48 bit的值)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但是,TCP/IP有自己的地址:32 bit的IP地址。知道主机的IP地址并不能让内核发送一帧数据给主机。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。ARP的功能是在32 bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。
ARP高速缓存一般情况下,主机或路由器中会存有ARP缓存,当存在目的IP的arp高速缓存时,可以不用ARP协议重复去寻找MAC地址,可以节省带宽。
在主机上的arp高速缓存可以使用命令arp -a来查看。图4-2是在一个linux系统上执行该命令的结果。
4-2
可以发现,ARP高速缓存IP地址都是本地直连网络的IP(印证了在一个主机或路由器上,ARP总是打通本地网络邻接的路由器或主机,而不是远端)。
ARP报文格式以太网上的ARP报文格式如图4-3
4-3
以太网首部前文已经阐述过,这边不再介绍。需要了解一下的是,当以太网帧承载的是ARP报文是,其帧类型值为0x0806.
重点了解一下ARP报文各个字段的意义。
硬件类型:顾名思义,也就是映射的硬件地址的类型,之所以有这个字段,是因为ARP协议不仅仅可以用来映射以太网地址与IP地址,也可以用来映射其他协议。当硬件地址类型为1时,代表以太网地址。长度为2字节。
协议类型:即映射的网络层时什么协议,IP地址的协议类型为0x0800。长度为2字节。
硬件地址长度:数值单位为字节,对应以太网地址,6字节。长度为1字节。
协议地址长度:数值单位为字节,对应IP地址,即4字节。长度为1字节。
op:操作字段,操作字段指出四种操作类型,它们是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4)。这个字段必需的,因为ARP请求和ARP应答的帧类型字段值是相同的。RARP即IP与MAC转换的逆过程。
发送端以太网地址:即发送该报文的主机或路由器的以太网地址。
发送端IP地址:即发送该报文的主机或路由器的IP地址
目的以太网地址:即目的主机或路由器的以太网地址(ARP请求报文中,该字段以全F填充,因为还不知道该目的MAC)
目的IP地址:即目的主机或路由器的IP地址
发送ARP请求报文时,除以太网目的地址与目的以太网地址两个字段用全f的广播MAC地址填充外,其他字段都有具体值。当一个主机负责应答该ARP请求报文时,需要将以太网的源目地址对换,发送端以太网地址与目的以太网地址对换,发送端IP地址与目的IP地址对换;对换后将以太网源地址与发送端以太网地址用网络接口的MAC地址填充。
ARP报文抓包做一个小实验,验证无ARP高速缓存下,主机是否会发出ARP请求报文,并且收到ARP应答报文,然后保存到ARP高速缓存。
首先,我在我的主机下用命令arp -a查看我的ARP高速缓存。如图4-4.
4-4
发现存在192.168.193.113IP地址的ARP高速缓存,接着我利用arp -d命令删除该地址的高速缓存,并再次查看ARP高速缓存,发现已经成功删除。如图4-5.
4-5
在本终端执行telnet 192.168.193.113命令,迫使主机发出ARP请求报文。如图4-6.
4-6
同时我另开一个终端,利用tcpdump -n的命令来监控本机的发出和接收到的报文。图4-7是从监控的报文中截取的片段数据,发现确实监控到ARP请求与应答报文,其中arp request报文的目的MAC为ffff.ffff.ffff,而arp reply的MAC地址是0800.277d.2e00,为本机地址。可以用tcpdump -e命令观察。
4-7.1
4-7.2
接着查看ARP高速缓存,发现存在IP 192.168.193.113的高速缓存,说明被正常缓存。如图4-8.
4-8
若请求的IP地址在网络中不存在,会怎么样呢?这种情况下,会看到多次请求,而请求的次数以及请求之间的间隔时间与TCP相关。
ARP代理如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或ARP代理(Proxy ARP)。这样可以欺骗发起A R P请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。
图4-9是一个简单的路由ARP代理的例子:
4-9
假设所有的接口都加入OSPF(路由IGP协议一种,先无需理会,先只要知道部署该协议后路由器能知道到达任意接口的路径即可)且互通。PC1想要ping(ICMP报文的一种,主要用来验证网络是否可达) PC2通信,PC1的IP地址为192.168.1.6/16,PC2的IP地址为192.168.2.6/16,此时PC1不具有PC2的MAC地址,因此PC1会发出ARP请求报文去寻找PC2的MAC地址。由于PC1认为PC2与自己属于同一网段,因此PC1的ARP请求报文直接将ARP的目的端IP地址填为192.168.2.6,路由器R1收到后,发现目的IP不是自己,就丢弃该ARP请求包,那么PC1就无法收到PC2的MAC地址,无法封装ping报文发出,也就无法通信。
此时若想成功通信,则需要再R1的192.168.1.1/24的接口上配置路由ARP proxy。配置了路由ARP代理,R1收到PC1发送的ARP请求报文后,首先检查ARP请求报文目的IP是不是本机IP,发现不是本机,但是配了代理后,R1会去查找自己的路由表,发现自己知道到底目的IP的路径,此时R1就会用自己的MAC去回应,在ARP应答报文内填充自己的MAC,应答给PC1。此时PC1得到MAC后就可以封装ping报文发给R1,R1收到ping报文后,有报文的目的MAC是本机,因此去查找路由表,发现命中,所以不会丢弃,继续转发给R2,一直转发给PC2。但是由于ping包还有回应包,因此需要再接口192.168.2.1/24上配上arp proxy.
ARP代理不只有路由代理这种,还有vlan内的代理以及vlan间的代理,涉及端口隔离,这边不再描述。
免费ARP免费ARP指主机发送ARP查找自己的IP地址。通常,它发生在系统引导期间进行接口配置的时候。
免费ARP可以有两个方面的作用:
ARP是一个非常基础且重要的协议,在网络中非常透明,用户一般没有感知。
本章主要了解了ARP的作用、ARP的具体报文格式、ARP高速缓存,并且操作观察了网络中ARP报文,另外介绍了代理ARP和免费ARP两种ARP的应用。