免费ARP本质是ARP协议的实现,所以只要有支持TCP/IP的网卡,支持ARP协议,就有免费ARP。免费ARP报文就是ARP请求或ARP响应,只是它的目的并不是为了获取或告知MAC地址(虽然是通过获取或告知完成的),它的触发方式也不同(虽然是由ARP协议触发的)


免费ARP

免费ARP


Gratuitous ARP,也称为“无故ARP”,在没有人问自己的情况下,无缘无故自问自答


功能


检测局域网内IP地址冲突


什么情况下触发ARP协议发送免费ARP


局域网IP地址冲突时,地址修改或变更时,DHCP分发地址时,ARP缓存表清理时,网关冗余协议HSRP交互时,TFTP协议传输数据前


免费ARP请求

配置IP地址

准备两台windows10的电脑,用网线直连,其中主机B配置IP地址为192.168.0.200/24

用wireshark抓取主机A的本地网卡流量

主机A配置IP地址为192.168.0.10/24,在wireshark抓取ARP报文

免费ARP_网络

这四条ARP报文都是主机A以广播的形式发出去的,其中前三条是ARP探针,第四条是ARP公告

首先分析ARP探针

免费ARP_字段_02

  • destinationMAC == ff:ff:ff:ff:ff:ff

说明这是一个广播报文

  • sourceMAC

填充的是主机A的MAC

  • Type == 0x0806

说明这是一个ARP协议报文

  • Opcode == 1

说明这是一个ARP请求报文

  • senderMAC

填充的是主机A的MAC

  • senderIP

填充0.0.0.0

  • targetMAC

填充全0

  • targetIP

填充的是主机A的IP

分析


这是一条ARP请求广播报文,与正常的ARP请求报文不同的是,它的senderIP字段填充的是0.0.0.0,targetIP填充的是源主机IP


为什么senderIP不填充源主机IP,而是全0?targetIP填充的却是源主机IP?

再回到前面,想一想,是做了什么让ARP协议发送这三条ARP探针的?

是配置主机A的IP地址192.168.0.10,然后在wireshark上看到主机A发送三条ARP请求广播报文

而且wireshark标明了这三条ARP请求报文是ARP Probe(刺探),刺探什么?


当然是主机A在配置IP地址时,为了防止配置的IP地址和局域网内的其他主机冲突,而主动发送的ARP探针,刺探其他主机的IP地址是否相同


所以,主机A在配置IP地址时,会自动触发ARP协议发送三条ARP请求报文广播给局域网内所有主机,targetIP填充自己的IP地址,这样如果其他主机接收到ARP请求且自己的IP地址和targetIP相同,就会回复ARP响应

主机A收到ARP响应,就说明有主机的IP地址和自己相同,地址冲突了,那么配置无法成功

由于主机B的IP地址是192.168.0.200,并没有冲突,所以没有收到ARP响应,windows连续发送三次ARP Probe后没有收到ARP响应,说明局域网内没有主机IP地址和自己冲突,IP地址配置成功

但是为什么senderIP不是源主机的IP地址,而是全0呢?


因为这三条是为了刺探有没有冲突,还不代表这个IP地址可以正式使用



只有发送三条ARP Probe后没有收到ARP响应,说明没有冲突,配置成功,此时ARP协议层还会再发送一条ARP Announcement,senderIP和targetIP都是192.68.0.10


免费ARP_请求报文_03

如果主机A配置和主机B相同的IP地址呢?

免费ARP_ip地址_04

上面两条是发送一条ARP Probe后收到了ARP响应,说明地址冲突,然后主机A的windows系统自动把IP地址配成了之前成功配置的IP地址,所以就有了后面的四条

我们再单独分析下收到的那条ARP响应

免费ARP_ip地址_05

其他字段都好理解,但是为什么targetIP不是主机A的地址呢?


因为主机B发现收到的ARP请求是ARP Probe,且和自己的IP冲突,那主机A就不能用这个IP地址了,所以主机B把targetIP填充全0


主机B如何辨别收到的ARP请求是正常的ARP请求还是ARP Probe呢?


可以比较下正常的ARP请求和ARP Probe的不同,发现senderIP不同,正常的ARP请求senderIP是源主机的IP,ARP Probe的senderIP是全0


从wireshark抓包来看,ARP Probe和ARP Announcement都是wireshark命名的,并没有标记“Gratuitous”关键字,那它们能算是免费ARP吗?

这是有争议的


如果从自己问自己的角度,它们都是免费ARP,因为它们都是在问自己配置的IP地址192.168.0.10,而且目的都是为了检测地址是否冲突。


当然,更严谨的免费ARP,senderIP和targetIP是一致的

免费ARP响应

windows系统是用免费ARP请求检测地址冲突,有些设备使用免费ARP响应检测地址冲突

免费ARP响应其实就是ARP响应报文,只是它需要广播,且senderIP和targetIP也要相同

免费ARP_字段_06

地址冲突的主机对于免费ARP响应也是需要回复的,回复的也是免费ARP响应,与其说是给地址冲突的主机回复,不如说是告诉整个广播域,我的IP才是xxx,然后源主机收到后又会广播免费ARP响应,两台地址冲突的主机轮流发

免费ARP_字段_07

总结


  • 免费ARP本质上是ARP报文
  • 免费ARP数据链路层destinationMAC为广播地址
  • 免费ARP的senderIP和targetIP一致,都是自己的IP地址
  • 免费ARP响应也是可能有回复的
  • ARP Probe可以看成免费ARP,虽然senderIP全0