无偿ARP
而所谓无偿ARP,指的就是,我不需要发送一个ARP请求包,对方就会“无偿”地把一个ARP响应包发给我(其实也主是主动发送过来),以此来告诉我它的MAC地址。
(1)网络环境搭建
但是在总结什么时候对方会主动把一个ARP响应包发送过来之前,我们先实践一下,网络环境还是用上面的那个:
不过我们需要修改一下R2的IP地址,修改为192.168.1.252(在这个过程中抓包软件Wireshark要打开),如下:
R2>en
R2#conft
R2(config)#intf0/0
R2(config-if)#ipadd192.168.1.252255.255.255.0
(2)抓取并分析ARP请求包和ARP响应包
这样做之后打开Wireshark软件,会发现抓到下面这样一个包:
可以看到Info一列,有个Gratutous的标识,中文意思就是“无偿,免费”的意思,我们可以查看一下数据包的结构:
通过查看操作字段Opcode的值,其实可以发现,无偿ARP其实也是一个ARP响应包(不过普通的ARP响应包是以单播的形式发送的,而无偿ARP是以广播的形式发送的),只不过这个ARP响应包比较特别,它是主动发送的,即它是gratuitous,无偿的。
另外需要注意的是,发送端IP地址和目的IP地址是一样,这正是无偿ARP有别于普通ARP响应包的地方,当这个数据包被网络中的其他主机(显然我们这里的网络环境比较简单,所以只有R1)接收到之后,它会让这些主机使用新的IP和MAC地址关系更新它们的ARP缓存表。因为这个ARP数据包是未经请求的,即导致客户端更新ARP缓存,所以会称为无偿ARP。
在分析了无偿ARP之后,给出下面的几种情况,都会有无偿ARP过程的发生:
a.更改了设备的IP地址
b.某些操作系统在启动完成之后就会发送无偿ARP(Windows和Linux都会)
(3)IP地址冲突检测
再分析一下,无偿ARP有什么好处呢?如下:
a.可以让以太网中的主机及时地更新其ARP缓存表,这样可以确保在数据发送时可以准确地封闭正确的地址信息
b.检测IP地址是否有冲突
关于这一点,可以给R2重新配置一个IP地址,并且与R1的相同:
R2>en
R2#conft
R2(config)#intf0/0
R2(config-if)#ipadd192.168.1.1255.255.255.0
几乎马上就可以在R1和R2的控制台上看到错误日志的输出:
R1>
*Mar100:54:39.007:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
*Mar100:55:09.043:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
*Mar100:55:39.739:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
*Mar100:56:10.011:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
*Mar100:56:40.715:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
*Mar100:57:10.947:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
R2(config-if)#
*Mar100:45:48.135:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
*Mar100:46:18.623:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
*Mar100:46:48.927:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
*Mar100:47:19.651:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
*Mar100:47:49.959:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
*Mar100:48:21.623:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
*Mar100:48:51.919:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
这里因为在修改了R2的IP地址时,它发送了无偿ARP包,R1通过检查发现其IP地址跟自己的一样,于是就会在控制台上报错,但是R2为什么又会报错呢?因为在R1发现地址有冲突时,也发送了表示IP地址冲突的无偿ARP包,如下:
注意这是一个广播包,所以R2必然也能收到,查看它的包结构:
根据数据包的内容,R2也知道发生了IP地址冲突,所以也就会在控制台上输出错误日志了。
4.在实践中分析ARP的实现过程:ARP代理
如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答这个请求,这个过程就称为ARP代理。这是非常精简和通俗易懂的解释,我们可以通过下面的实践来进行体会。
(1)网络环境搭建
如下:
在前面的基础上,R1增加如下配置:
R1>en
R1#conft
R1(config)#iproute0.0.0.00.0.0.0f0/0
R2增加如下配置:
R2>en
R2#conft
R2(config)#intf1/0
R2(config-if)#noshu
R2(config-if)#ipadd192.168.2.2255.255.255.0
R2(config-if)#dowr
R3则配置如下:
R3>en
R3#conft
R3(config)#intf0/0
R3(config-if)#noshu
R3(config-if)#ipadd192.168.2.3255.255.255.0
R3(config-if)#iproute0.0.0.00.0.0.0f0/0
R3(config-if)#dowr
(2)抓取ARP包并分析ARP代理过程
在R1和R2的链路上启动Wireshark,然后在R1上执行如下命令:
R1#ping192.168.2.3
Typeescapesequencetoabort.
Sending5,100-byteICMPEchosto192.168.2.3,timeoutis2seconds:
...!!
Successrateis40percent(2/5),round-tripmin/avg/max=36/50/64ms
即R1给R3发送数据,我们查看抓到的包:
再分别查看详细的包结构: