这学期新学了计算机网络,有时候会用到wireshark。让我想起来以前看的一本讲wireshark的小书,书上刚开始讲了一道很有意思的面试题。今天打算用虚拟机和wireshark模拟环境亲自试验一下。
PS:以下内容我尽量以计算机网络专业术语描述,如有错误,请予以指正,谢谢!

题目如下

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

实验准备

  • Windows10物理机一台,清除ARP缓存,子网掩码配置255.255.255.224 IP地址配置192.168.1.2,模拟服务器B MAC地址 1C:1B:0D:9F:10:EA
  • Deepin Linux虚拟机一台,清除ARP缓存,使用桥接模式直连物理网络 子网掩码配置255.255.255.0 IP地址配置192.168.1.169,模拟服务器A MAC地址 00:0C:29:FE:0C:57
  • 家用路由器一台 与虚拟机和物理机直连,充当网关 IP地址 192.168.1.1 MAC地址 8C:AB:8E:68:86:49

实验过程

首先用服务器B ping服务器A,得到分组如下:图二

可以ping通,说明可以正常通信。和书上的解释相同,服务器B通过子网掩码判断出服务器A与自身不在一个子网,所以分组1 ICMP报文的以太网帧请求的目的MAC地址是路由器,而不是服务器A,请求通过路由器转发ICMP报文。而分组2 路由器转发ICMP报文给服务器A后,服务器A根据子网掩码判断服务器B与自己在一个子网,所以直接发送ARP广播查询服务器B的MAC地址,当获得服务器B的MAC地址后,分组5中 A回复B的ICMP报文则不需要路由器转发。分组2如图:
图三
原问题还有一问,就是如果把A和B子网掩码互换,是否还能ping通。先说下这个问题的官方答案,原因是主机B根据子网掩码认为主机A与自己在一个子网,所以直接发送ARP请求A的MAC地址。在获得MAC地址后,发出ICMP报文。而A收到ICMP报文后无法发报文出去,因为它发现自己的默认网关在其它网段,是无效的,但是服务器A根据子网掩码认为B与自身不在同一网段,需要网关转发ICMP回复报文。但是,我这次用虚拟机里的Linux系统没有实现上述效果,设置子网掩码后,A还是直接去ARP请求按理说不在同一子网的B的硬件地址,丝毫不受子网掩码约束,原因不明汗!

后来我又找了台Windows物理机,终于实现了书上所说的那种情况。在设置子网掩码的时候直接提示与网关不在同一网段,结果也理所当然的不能ping通。wireshark截图如下。
图四
但更诡异的事出现了,当我把子网掩码设置还原,想用服务器A反过来ping B的时候,竟然ping不通,但服务器B却能ping通A。这个现象感觉用上面的解释感觉完全说不通啊,我决定改天再用思科的交换机模拟器试验一下,毕竟家用的路由器跟网络概念中的路由器可能不太一样。

总结

这次小小的实践真的让我学到了很多东西,一个简单的问题涉及到了ICMP,ARP,子网掩码等这么多网络知识。而且让我用wireshark更直观清晰的认识和分析这些协议。我更加意识到,只要有心,只要肯去实践,就能学到比书本上更多的东西。

知识点

  • ARP请求不能跨子网,但是ARP回复并不考虑子网
  • 子网掩码用于划分子网,计算机用子网掩码和目标IP判断是否在同一个子网
  • 跨子网通信需要默认网关的转发
  • wireshark的过滤规则

最终更新 (2019-01-06)

关于这个问题的第一问,知乎上有比较详细的回答:<Wireshark网络分析就这么简单>第一章带来的困惑?。这个问题我在不同的平台复现,最终结果不同。所以我也不再纠结,重要的是理解其中的网络规则,因此仅将网络上类似的讨论和解答与大家分享,真伪自辨。

参考

《wireshark网络分析就这么简单》 作者 林沛满 以及林沛满的新浪博客