龙空技术网

ARP——地址解析协议

自由呐喊君 537

前言:

现时小伙伴们对“linux arp查看”大体比较注意,我们都想要分析一些“linux arp查看”的相关知识。那么小编也在网上搜集了一些有关“linux arp查看””的相关资讯,希望同学们能喜欢,各位老铁们快快来学习一下吧!

引言

当一台主机把以太网数据帧发送到位于局域网内的另一台主机时,设备驱动程序是根据链路层的以太网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

应用程序FTP客户端会首先通过解析器,将主机名转换成32位的IP地址,这个过程中有可能使用DNS协议去查找,也可能本机存有该主机对应的IP地址。若本主机存有该主机名对应的IP地址(一般在系统文件/etc/hosts中记录),则直接读取;否则需要调用DNS系统来获取主机名对应的IP地址。FTP客户端请求TCP与得到的IP地址建立TCP连接TCP发送一个连接请求分段到远端主机,即用上述的IP地址发送一份数据报如果远端目的主机与本机直连,即属于直连网络,那么可以直接送到目的主机。如果目的主机IP不属于本地网络,而是在远端网络上,那么就需要查路由表,找到该报文的下一跳路由器,继而将报文送到下一跳路由器上,并让下一跳路由器负责转发该报文(此时ARP的目的主机IP为下一跳路由器的IP地址,ARP总是打通临接的路由器,不会直接打通远端的路由器)。这两种情况,都是将报文先传输到与本地主机相连的主机或路由器上。以太网的情况下,那么发送端主机必须先把IP地址转换为MAC地址,而将IP转为MAC就是ARP的功能。ARP会发送一份称为ARP请求的报文给局域网上的每个主机和路由器。这是一个广播的过程,局域网上的每个主机都会收到该ARP请求报文,ARP请求报文中会包含有目的主机的IP地址。当接收到ARP请求报文的主机或路由器发现报文中的目的IP是本机时,发送一个ARP应答报文给源主机。ARP应答报文中会填上本机的MAC地址(这就是我们ARP请求报文所寻找的MAC地址)。收到ARP应答报文后,使用该MAC作为IP数据报的目的MAC,开始发送以太网数据帧。若目的主机属于本地直连网络,那么直接到达。否则在下一跳的路由器上会继续4-8步骤,直到到达真正的目的主机。

在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可以有两个方面的作用:

一个主机可以通过它来确定另一个主机是否设置了相同的I P地址。如果发送免费ARP的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。一个比较著名的ARP协议事实[Plummer 1982]是,如果主机收到某个IP地址的ARP请求,而且它已经在接收者的高速缓存中,那么就要用ARP请求中的发送端硬件地址(如以太网地址)对高速缓存中相应的内容进行更新。主机接收到任何A R P请求都要完成这个操作(ARP请求是在网上广播的,因此每次发送ARP请求时网络上的所有主机都要这样做)。

小结

ARP是一个非常基础且重要的协议,在网络中非常透明,用户一般没有感知。

本章主要了解了ARP的作用、ARP的具体报文格式、ARP高速缓存,并且操作观察了网络中ARP报文,另外介绍了代理ARP和免费ARP两种ARP的应用。

标签: #linux arp查看 #arp协议代理机制 #linux删除arp