上次介绍了在模拟器上的实验,今天我使用真机做客户端,来重复上述实验,比较下得到的实验结果<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

我的实验环境和拓扑如下
 

 

PC未设置网关,路由器默认开启代理ARP ,在R2上添加一条到达192.168.1.0/24网段的静态路由,此时在PCping 192.168.2.2 ,查看实验结果
 

 

 

R1上开启debug ,没有捕获到任何信息 ,在PC上使用arp –a显示PCARP缓存表为空。
 

 

 

ping 所返回的信息,并结合上面的结果,我的结论是PC 没有发送ARP请求去请求192.168.2.2MAC地址,而是由PC自己返回了目的主机不可达的信息。不知大家发现没有,此ICMP报文信息返回非常迅速,比路由器返回的目的主机不可达的信息的延迟要小的多。

 

由此我认为PC在没有设置默认网关的情况下,去ping一外网地址,首先是查看自己有没有路由,如果有路由的话,就相当于设置了默认网关的情况。如果没有路由,则直接丢弃数据包,并返回一个目的主机不可达的信息。

 

大家可以在windows的命令行界面使用netstat –r查看主机的路由表,对比未设置网关和设置网关时路由表的情况,就会发现其中的变化。

未设置网关时PC的路由表

 
 
设置网关后PC的路由表
 

 

通过对比可以发现设置网关后,PC的路由表中多出了一条默认路由,也就是我们设置的默认网关。

 

同样我们可以在未设置默认网关的情况下试着去手工添加一条 route add 192.168.3.0  mask 255.255.255.0 192.168.1.4  metric 1

 
 
此时我尝试着去ping 192.168.3.0网段的任意一个IP地址,会得到什么回应呢?如果大家没有猜错的话,是请求超时的信息,看看结果吧。
 

 

我们来分析下为什么会产生这个结果呢?PCping 192.168.3.3的过程中,通过查找路由表发现有到该网段的路由,于是会将数据包发送给192.168.1.4 ,而PCARP缓存中是没有192.168.1.4MAC地址的,于是就会ARP广播请求192.168.1.4MAC地址,这一点可以通过R1上的debug信息看到
 

 

由于PC得不到192.168.1.4的回应信息,所以请求不到192.168.1.4MAC地址,数据封装不成功,得到的结果自然就是请求超时了。

 

现在我们来看看另外一种情况,先删除先前添加的路由条目,重新添加一条route add 192.168.3.0 mask 255.255.255.0 192.168.1.2 metric 1 ,注意此时指定的网关地址是正确的,再来看看结果如何。

 
 
R1返回给PC一个目的主机不可达的信息,跟上个实验不同的是,这次能够请求到192.168.1.2MAC地址,数据包从PC发送到路由器R1 ,而R1没有到达192.168.3.0的路由,所以数据包被路由器丢弃,并返回一个目的主机不可达的信息。

 

从这个实验可以看出,PC和路由器有许多相同之处 ,在发送数据包到不同网段的时候,都会去查找自己的路由表,如果没有路由的话,PC丢弃数据包并返回目的主机不可达的信息。

同时也可以看出,PCping 外网IP时,不会发送ARP请求外网IPMAC地址,而是先查找路由表,然后通过路由表来查找网关的MAC地址。

 

代理ARP是针对PC未设置网关的情况下,对PC请求外网IPMAC地址做出的回应。那么这里就有一个问题,PC在何时会请求外网IPMAC地址,在上面的实验当中,我们知道PC在发到外网的数据包时,查找路由表,根据路由表查找网关,而没有设置网关就意味着数据包不能发送出去,就会被PC直接丢弃。看似十分矛盾,那么代理ARP又用在什么环境中呢?

欲知后事如何,请听下回分解。