说到代理ARP,很多人会认为适用的场景是,没有配置缺省网关的计算机要和其他网络中的计算机实现通信,这个其实是一种误解,下面我将以一个例子来说明代理ARP适用的场景,以及代理的具体原理。我电脑上没有Visio,还是继续用PPT画图= =。。。
图1 PC2掩码为16
在这个拓扑图中,路由器Router左边虽然掩码不一样,但端口a和端口b处于同一个网段,右边是一样的情况。我们假设现在PC1要给PC2发送一个数据包,PC1会先用自己的掩码和PC2的IP做与运算,发现PC2和自己在同一个网段,就直接以PC2的IP地址为目的地址广播发送ARP报文,请求PC2的MAC地址。由于PC1和PC2虽然在一个网段,但是不在一个物理网络,导致PC2无法收到这个ARP报文,而即使配置了网关,网关收到了这条ARP报文,也会将其丢弃,因为请求的目的IP不是自己。所以,在这个场景下,即使配置了网关,也无法和PC2通信,和默认网关没有任何系。我们可以总结这种情况为“在一个网段,却不在同一个物理网络”,这种情况下需要代理ARP。
上文中有提到,网关收到了这条ARP报文,也会将其丢弃,因为请求的目的IP不是自己。而如果我们在路由器Router上设置了代理ARP,路由器在收到这条报文时,就不会将其丢弃,而是会发送一条应答ARP给PC1,把自己的MAC地址回复给PC1。PC1在收到这条应答ARP报文后,理所应当的以为,这是PC2发回来的,自己收到的是PC2的MAC的地址。就会把自己要发送的数据包,向着这个MAC地址发送出去。最终,路由器的b端口会收到这个数据包,并且会将其发送给PC2(因为路由器在收到PC1的ARP报文时知道,PC1的通信对象是PC2)。然后就是大家熟悉的正常流程了,c端口会广播发送ARP报文,请求PC2的MAC地址,PC2会发送应答ARP报文,把自己的MAC地址发回给c端口,c端口就将数据包发送给PC2,PC2就收到了PC1发送的数据包了,这个过程就走完了。
图2 PC2掩码为24
下面我们接着分析上图这种情况,注意,PC2的掩码变成了24,此时是另外一种情,“PC1以为自己和PC2是同一网段,其实并不在同一个网段也不在同一个物理网络”,这种情况也和PC1有没有缺省网关没有任何关系。在这种情况下,如果路由器b端口配置的掩码是16的话,会出现什么情况呢?就是即使配置了代理ARP,PC1和PC2也无法通信。因为,b端口会拿PC1和PC2的IP地址和自己的掩码做与运算,发现他们是同一个网段。即使b端口收到了PC1发来的ARP报文也不会行使代理,因为,此时b端口知道PC1和PC2处于同一个网段,PC2会收到PC1广播的ARP报文且会给PC1发送应答ARP报文,所以b端口自己就不会给PC1发送应答报文了,这种情况下,即使配置了代理ARP,PC1和PC2也无法完成通信。