免费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报文都是主机A以广播的形式发出去的,其中前三条是ARP探针,第四条是ARP公告
首先分析ARP探针
- 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
如果主机A配置和主机B相同的IP地址呢?
上面两条是发送一条ARP Probe后收到了ARP响应,说明地址冲突,然后主机A的windows系统自动把IP地址配成了之前成功配置的IP地址,所以就有了后面的四条
我们再单独分析下收到的那条ARP响应
其他字段都好理解,但是为什么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响应也是需要回复的,回复的也是免费ARP响应,与其说是给地址冲突的主机回复,不如说是告诉整个广播域,我的IP才是xxx,然后源主机收到后又会广播免费ARP响应,两台地址冲突的主机轮流发
总结
-
免费ARP本质上是ARP报文
-
免费ARP数据链路层destinationMAC为广播地址
-
免费ARP的senderIP和targetIP一致,都是自己的IP地址
-
免费ARP响应也是可能有回复的
-
ARP Probe可以看成免费ARP,虽然senderIP全0