0%

博客前几天刚通过备案审核,写一个博客未完成事项,免得自己忘了.

  1. 博客实现全站HTTPS
  2. 博客工信部备案
  3. 博客实现伪静态
  4. 代码高亮插件
  5. 图片插件
  6. 实现又拍云或七牛云缓存
  7. footer修改

按照教材上对应用最广泛的以太网V2的定义,以太网封装IP数据包的最大长度是1500字节,也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步码+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的CRC校验.如图:

2380356210

按照上述,物理层的最大帧应该是1526字节,但是实际上我用wireshark捕捉到的最大帧却是1514字节,原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧.如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理.这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、CRC校验之外的数据,其最大值是6+6+2+1500=1514

3177431725

而真正的传输数据也就是 Payload在TCP报文中还要减去IP首部的20字节和以太网帧多余的14字节.ICMP报文还要额外减去ICMP首部的8字节.所以当实验中我使用ping -l 3807(3500+学号后三位) 指定发送3807字节的payload后 wireshark收到的总共字节为3807+20×3+14×3+8=3917


部分内容转自

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

题目如下

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

2977533294

实验准备

  • 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,得到分组如下:

1742977777

可以ping通,说明可以正常通信.和书上的解释相同,服务器B通过子网掩码判断出服务器A与自身不在一个子网,所以分组1 ICMP报文的以太网帧请求的目的MAC地址是路由器,而不是服务器A,请求通过路由器转发ICMP报文.而分组2 路由器转发ICMP报文给服务器A后,服务器A根据子网掩码判断服务器B与自己在一个子网,所以直接发送ARP广播查询服务器B的MAC地址,当获得服务器B的MAC地址后,分组5中 A回复B的ICMP报文则不需要路由器转发.分组2如图:

648835784

原问题还有一问,就是如果把A和B子网掩码互换,是否还能ping通.先说下这个问题的官方答案,原因是主机B根据子网掩码认为主机A与自己在一个子网,所以直接发送ARP请求A的MAC地址.在获得MAC地址后,发出ICMP报文.而A收到ICMP报文后无法发报文出去,因为它发现自己的默认网关在其它网段,是无效的,但是服务器A根据子网掩码认为B与自身不在同一网段,需要网关转发ICMP回复报文.但是,我这次用虚拟机里的Linux系统没有实现上述效果,设置子网掩码后,A还是直接去ARP请求按理说不在同一子网的B的硬件地址,丝毫不受子网掩码约束,原因不明汗!

后来我又找了台Windows物理机,终于实现了书上所说的那种情况.在设置子网掩码的时候直接提示与网关不在同一网段,结果也理所当然的不能ping通.wireshark截图如下.

2736107889

但更诡异的事出现了,当我把子网掩码设置还原,想用服务器A反过来ping B的时候,竟然ping不通,但服务器B却能ping通A.这个现象感觉用上面的解释感觉完全说不通啊,我决定改天再用思科的交换机模拟器试验一下,毕竟家用的路由器跟网络概念中的路由器可能不太一样.

总结

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

知识点

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

最终更新 (2019-01-06)

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

参考

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