查看原文
其他

MSS为什么和三次握手时协商的不一致?

车小胖谈网络 车小胖谈网络 2022-07-27
后续传输使用的MSS为什么和三次握手时协商的不一致?


三次握手时协商的MSS是1460和1424,但是发送数据时,最大的TCP数据包只要超过1412就会被拆分,不知道是什么问题, 求大神指导。




这个问题非常棒,燃起回答的热情。这个问题曾经也困扰过我,让我茶饭不思,苦思冥想。其实很简单,因为双方协商的MSS取双方的最小值Min(1460,1424)= 1424


但是想过没有,这个MSS= 1424包含哪些内容?


仅仅包含来自上层的用户数据(Data)吗?


很显然不是,还包括TCP报文头的Option选项扩展。换句话说,如果你的TCP报文Option需要12字节运输,TCP集装箱的大小一共1424字节,那么留给用户数据的空间= 1424-12=1412字节,不是吗?


是的。


接下来检查一下是不是这样呢?让我们看抓包图片中第四行,清清楚楚地包含TCP Timestamp Option,这个选项一共10个字节。如下图加亮部分所示:


读者可能会说,Timestamp Option一共才10个字节,并没有12个字节啊,多出来的2个字节又是怎么回事?


也很简单,由于10个字节不是4字节(32bit位)的整数倍,加亮图片中TCP又添加两个NOP Option,分别=1字节。NOP = No Operation,仅仅起到字节长度填充Padding的意图。



至于为何要填充为4字节的整数倍,可以参考这篇权威的RFC文档:


还是那副加亮的图片,Window Scale Option 长度为3字节,也不满足4字节的整数倍,所以也为其添加一个字节的NOP。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存