问题
今天用wireshark抓包调试的时候遇到了一点小困扰,如下图
本来就是两条很普通的192.168.10.90发给195的fin包,195回应ack,但是这两个包的长度是挺诡异的,为什么一个是54,一个是60呢,而且查看60长度的包,发现在TCP协议的数据区有6个字节的00。
那么这6个字节的00又是哪里来的呢?
探(sou)寻(suo)答案
- 首先确定的是这数据区6个字节的00不是应用程序发送的,那么必定是应用层以下的某一层填充的。
- 为什么要填充呢?先上图
- 上图是以太网(IEEE 802.3)帧格式,其中以太网数据帧部分最小46字节,发现什么了吗?最小46字节去掉IP头和tcp头各20字节,还剩6个字节,也就是说你tcp什么数据都不发,为了满足最小46字节,你还需要填充6个字节,也就是之前看到的6个字节的00。最后我们算一下可以抓到包的最小长度6+6+2+46=60。正好跟上面抓到的60个字节的数据包吻合。
- 问题又来了,54字节长度的包是怎么整出来的呢?
正好看到wireshark官网也有人遇到跟我类似的疑惑Size of Frames(又一次验证了一句话,你遇到的问题99%别人都遇到过,还有接近1%根本不是问题,最后才是你遇到过而别人没遇到过)。不废话了,大体意思就是最小以太网帧是64字节(去掉前导码和帧其实定位符,为什么是64字节也有讲究,可以看文章结尾的参考),其中包括4个字节的帧校验序列(FCS),而wireshark通常开到的是加入FCS前的发送帧和剥离FCS的接收帧。因此wireshark能抓到包的最小长度为60字节,但是由于接收帧是发送方操作系统填充的所以最小为60字节,但发送帧wireshark抓到的是填充之前的数据包,所以最小为54字节。 - 不同网卡可能会有不同的结果
回家后因为笔记本用的是无线,对同样的数据包用wireshark发现,无线网卡对于没有数据的tcp抓包长度都是54字节,按上文理解可能就是wireshark抓到的包已经是剔除掉6个字节的填充位的数据了