前面讲解过了TCP报文头的各个字段的含义,有兴趣的童鞋可以查看之前的博客文档:
https://blog.youkuaiyun.com/u010672206/article/details/82812256
今天说一下TCP可选字段中TCP-MSS(Kind: Maximu segment size)字段的作用以及小编实际应用的场景:
当OPT的kind标记为2代表此OPT字段是设置TCP最大报文段长度选项。一般在TCP连接初始化时(链接的双方发SYN握手报文时),通信双方使用该选项来协商最大报文段长度(Max Segment Size,MSS)。
如上图所示,此opt选项字段总共占四个字节,第一个字节是此OPT字段的含义,第二个字节代表此OPT字段总共所占的长度(就此字段来说为4)最后两个字节代表此OPT选项含义的值:即TCP-MSS的值。
TCP模块通常将MSS设置为MTU(当前IP网络最大传输单元)-40字节,减掉的这40字节包括20字节的TCP固定头部长度和20字节的IP固定头部长度。这样传输的TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免超过IP报文的MTU造成IP分片发生。对以太网而言,MSS值是1460(1500-40)字节。
同样的,当发送的TCP报文大于TCP链接建立时通信双发协商好的MSS值时,会触发TCP协议层面的分片。
IP分片场景:
当待发送的IP数据包的长度大于当前网络中设置IP的MTU(IP报文最大传输单元)时,会有如下两个处理结果:
1:当IP头部的标志位(Flags)的DF字段为1(不允许IP分片)时,此报文会因长度过长而且不允许分片导致处理失败丢包。还有就是,网络拓扑环境是复杂的,报文到达通信的对端过程中,中间链路的情况不得而知,可能有更多的路由交换设备,如果报文在源头发出时,符合要求发了出去,也可能因为中间路由交换设备的MTU小于IP数据包的长度,又因为不能分片,而导致丢包的产生。
2:当IP头部的标志位(Flags)的DF字段为0(允许IP分片)时,此报文会因长度过长而且允许分片而进行IP分片的报文发送处理,允许IP分片是一种报文长度过大的解决方案,但是IP分片也有自身的问题,一般不建议使用IP分片。
为什么要减少IP分片,以下博文做了简单简介,大家可以参考以下:
https://blog.youkuaiyun.com/matt_mao/article/details/12710873
由于种种原因吧,为了更好进行通信,减少不必要的报文丢失,以及IP重组问题,一般建议使用TCP分片而不建议使用IP分片。
怎么减少IP分片,换用TCP分片?
在网络模型上看传输层协议TCP是在网络层协议