2003/08/15

arp与ping

ping与arp配合有一个很妙的用处,就是通过ping广播地址,然后反查arp表来获取局域网一个网段内的所有主机ip,但是这种用法有个缺陷,就是当你在第一次用的时候它很有效,但当将arp表清空后,立刻再ping广播地址就看不到arp表的内容了,我曾经在Win2000,Linux, VxWorks试过,效果相同,比如在Win2000下:
1) ping 192.168.0.255
2) 此时用arp -a查看arp表,应该可以看到网段内的主机ip
3) 用arp -d删除所有arp表项
4) 再用ping 192.168.0.255
5) 再看arp -a, 此时看到arp表中已经没有上次看到的那些主机了。

分析arp协议之后,终于明白原因,整个arp的交互过程如下:
1) 首先,源主机ping广播包,因为是广播包,无需知道MAC地址,所以不会发送arp请求,直接发送ping广播包
2) 网内主机收到ping广播包后,需要应答。但应答是单播方式,所以先要发送arp广播请求源主机的MAC地址。
3) arp广播请求在被源主机收到后,源主机更新自己arp表,并回送arp应答。网内主机受到arp应答后,也各自更新自己的arp表。
4) 等ping回送结束后,源主机的arp缓存中就会有所有回送ping包的主机ip
5) 清空源主机的arp表后,再ping广播地址,仍然不会发送arp请求,直接发送ping广播包
6) 网内主机收到ping包后,需要回送ping应答,但此时这些主机的arp缓存中应该已经有了源主机的MAC地址,所以无需发送arp请求,直接回送ping应答
7) 源主机仍然可以接收到所有的ping应答,但由于没有收到arp请求,所以arp不会被更新!这就是第二次ping广播包不会刷新arp的原因!

所以,使用此方法查询网内主机不一定可靠。但VxWorks和Linux下有更简单的方法,直接使用ping即可,因为VxWorks和Linux的 ping在收到应答时会显示发送应答的ip地址。可惜Windows的ping不是这样,真是不知Windows为什么去掉如此有用的功能。 :(

没有评论: