从一道面试题说起

问题:两台服务器A和B的网络配置如下,B的子网掩码本应该是255.255.255.0,被不小心配成了255.255.255.224,它们还能正常通信吗?

用Wireshark就可以从具体的网络包发现问题,到底通信到了哪一层、阶段产生了问题,问题是什么。

在这个问题的场景下,书上给出的服务器B ping 服务器A时,服务器B的网络包范例:

1号包:

服务器B通过ARP广播查询默认网关192.168.26.2的MAC地址。

为什么ping的服务器A的IP,B却去查询网关的MAC地址呢?

因为B根据自己的子网掩码,计算出A属于不同的子网,跨子网通信需要默认网关的转发。所以需要知道默认网关的MAC地址。

2号包:

默认网关192.168.26.2向B回复了自己的MAc地址。

然而Wireshark上的Source和Destination显示的开头却是“Vmware”呢?因为MAC地址的前三个字节表示厂商,而“00:50:56”和“00:0c:29”都被分配给了Vmware公司。这是全球统一的标准,所以Wireshark干脆显示出厂商名了。

3号包:

B发出ping包,指定Destination IP是A,但是Destination MAC却是网关的。

这表明B希望网关把包转发给A。

至于网关有没有转发就无从得知了,除非在网关上也抓个包。

4号包:

B收到了A发出的ARP官博,这个广播查询的是B的MAC地址。这是因为在A看来,B属于相同子网,同子网的通信无需默认网关的参与,只要通过ARP获得对方的MAC地址就行了。

这个包也表明默认网关成功把B发出的ping请求转发给A了。

5号包:

B回复了A的ARP请求,把自己的MAC地址告诉A。

这说明B在执行ARPP回复时并不考虑子网。虽然ARP请求来自其它子网的IP,但也照样回复。