日期:
来源:车小胖谈网络收集编辑:车小胖谈网络
后续传输使用的MSS为什么和三次握手时协商的不一致?
三次握手时协商的MSS是1460和1424,但是发送数据时,最大的TCP数据包只要超过1412就会被拆分,不知道是什么问题, 求大神指导。
这个问题非常棒,燃起回答的热情。这个问题曾经也困扰过我,让我茶饭不思,苦思冥想。其实很简单,因为双方协商的MSS取双方的最小值Min(1460,1424)= 1424。
但是想过没有,这个MSS= 1424包含哪些内容?
很显然不是,还包括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。