TCP应用之TCP-MSS(Kind: Maximu segment size)可选字段的实际应用之触发TCP分片代替IP分片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010672206/article/details/82814492

前面讲解过了TCP报文头的各个字段的含义,有兴趣的童鞋可以查看之前的博客文档:

https://blog.csdn.net/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.csdn.net/matt_mao/article/details/12710873

由于种种原因吧,为了更好进行通信,减少不必要的报文丢失,以及IP重组问题,一般建议使用TCP分片而不建议使用IP分片。

怎么减少IP分片,换用TCP分片?

在网络模型上看传输层协议TCP是在网络层协议IP之上的,不论上层的TCP报文是否进行分片,IP报文都会根据自己的分片原则进行报文分片,即:IP数据包的长度不能超过接口的MTU, 也就要求IP头+TCP头+TCP数据部分的总长度不能超过接口的MTU。假设IP头、TCP头里没有可选数据仅有固定的数据长度分别是20字节,那么TCP的数据长度就不能超过(MTU减40个字节的数据)长度。以太网一般的MTU值为1500即TCP一般协商的TCP-MSS的值为1460,这样避免IP分片的产生。

现实网络拓扑环境是复杂的,即使IP报文一开始在源出口成功的不经分片发送出去,在通信的中间链路路由交换设备上,如果接口的MTU值小于传输的IP数据包的长度还是会触发IP分片,造成IP分片的种种问题。此时就要要求TCP链接在建立之初协商TCP-MSS时,通信双方发送SYN报文中携带的TCP-MSS值足够的小。对于TCP层来说TCP协议的规范是通过SYN报文里面的TCP-MSS字段的值进行通信双方通信最大长度的协商。但是通信双方的行为是不可控的,我们无法控制双发协商TCP-MSS的大小。

此时我们该怎样处理?

提供处理问题的一种思路:可以在TCP捂手协商的过程之中,在SYN报文到达对端的TCP层之前,手动改变报文头MSS可选字段的大小 ,换成我们自己设定的值,通过改变源报文头的方法控制TCP-MSS值的大小,以此来控制TCP报文最大的传输长度,迫使报文过长时进行TCP分片,而不进行IP分片,此时MSS的值是自己控制的,就可以根据网络情况,灵活更改。

具体怎么样实现更改MSS值的办法,大家可以根据自身的情况进行设计。

续上度娘对MTU的讲解:

通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。

因为协议数据单元的包头和包尾的长度是固定的,MTU越大,则一个协议数据单元的承载的有效数据就越长,通信效率也越高。MTU越大,传送相同的用户数据所需的数据包个数也越低。

MTU也不是越大越好,因为MTU越大, 传送一个数据包的延迟也越大;并且MTU越大,数据包中 bit位发生错误的概率也越大。

MTU越大,通信效率越高而传输延迟增大,所以要权衡通信效率和传输延迟选择合适的MTU。

以以太网传送IPv4报文为例。MTU表示的长度包含IP包头的长度,如果IP层以上的协议层发送的数据报文的长度超过了MTU,则在发送者的IP层将对数据报文进行分片,在接收者的IP层对接收到的分片进行重组。

在网络通讯中,需要尽量避免发生分片和重组,因为分片重组对网络性能影响较大。数据包发送时选择合适的MTU大小对提高通讯性能很有必要。MTU大小的选择有协议协商方式,通过全路径的MTU发现机制,找到整条路径的最小MTU(也就是路径MTU),然后报文发送式小于等于路径MTU,这就避免了数据传输过程中产生分片,从而提高数据转发性能。MTU的协议发现机制由于安全等方面的原因,并不能总是生效,这时候就需要根据网络的特性选择合理的MTU。如果在报文传送过程中分片是不可避免的,那么要想办法让重组尽量在终端进行,避免在转发路径中进行(尽可能使用上层应用分片重组机制)。

路径最大传输单元

因特网协议中,一条因特网传输路径的“路径最大传输单元”被定义为从源地址到目的地址所经过“路径”上的所有IP跳的最大传输单元的最小值。或者从另外一个角度来看,就是无需进一步分片就能穿过这条“路径”的传输单元的最大值。

RFC 1191描述了“路径最大传输单元发现方法”,这是一种确定两个IP主机之间路径最大传输单元的技术,其目的是为了避免IP分片。在这项技术中,源地址将数据报的DF(Don't Fragment,不要分片)位置位,再逐渐增大发送的数据报的大小——路径上任何需要将分组进行分片的设备都会将这种数据报丢弃并返回一个“数据报过大”的ICMP响应到源地址——这样,源主机就“学习”到了不用进行分片就能通过这条路径的最大的最大传输单元了。

不幸的是,越来越多的网络封杀了ICMP的传输(譬如说为了防范DDOS攻击)——这使得路径最大传输单元发现方法不能正常工作,其常见表现就是一个连接在低数据流量的情况下可以正常工作,但一旦有大量数据同时发送,就会立即挂起(例如在使用IRC的时候,客户会发现在发送了一个禁止IP欺骗的ping之后就得不到任何响应了,这是因为该连接被大量的欢迎消息堵塞了)。而且,在一个使用因特网协议的网络中,从源地址到目的地址的“路径”常常会为了响应各种各样的事件(负载均衡、拥塞、断电等等)而被动态地修改——这可能导致路径最大传输单元在传输过程中发生改变——有时甚至是反复的改变。其结果是,在主机寻找新的可以安全工作的最大传输单元的同时,更多的分组被丢失掉了。

对于时下大多数使用以太网的局域网来说,最大传输单元的值是1500字节。但是像PPPoE这样的系统会减小这个数值,这就使得在使用最大传输单元发现方法时可能会产生这样的结果:一些处于配置不当的防火墙之后的站点变得不可达了。对于这种情况,还是可能找到变通的方法的,但这取决于你控制的是网络的哪一部分。这些方法包括改变用来在防火墙一端建立TCP连接的第一个分组的MSS(Maximum Segment Size,最大分段大小)。

网络中一些常见链路层协议MTU的缺省数值如下:

FDDI协议4352字节

以太网(Ethernet)协议:1500字节

PPPoE(ADSL)协议:1492字节

X.25协议(Dial Up/Modem):576字节

Point-to-Point:4470字节

如果在IP层要传输一个数据报比链路层的MTU还大,那么IP层就会对这个数据报进行分片。一个数据报会被分为若干片,每个分片的大小都小于或者等于链路层的MTU值。当同一网络上的主机互相进行通信时,该网络的MTU对通信双方非常重要。但当主机间要通过很多网络才能通信时,对通信双方最重要的是通信路径中最小的MTU,因为在通信路径上不同网络的链路层MTU不同。通信路径中最小的MTU被称为路径MTU。

猜你喜欢

转载自blog.csdn.net/u010672206/article/details/82814492