TCP中报⽂段⼤⼩(MSS)、MTU
⼀、MSS的含义
我们知道TCP传输可靠性的保证中有⼀点是:TCP会将应⽤层交付下来的数据分为TCP认为最适合发送的数据块。这⾥的数据块⼤⼩就是MSS(maximum segment size最⼤分段长度)。MSS字段位于TCP⾸部中的选项字段。
⼀句话,MSS就是TCP报⽂段所允许传送的最⼤数据部分的长度,如果上层交付下来的数据太⼤,就对其进⾏数据分块。这个分块过程是在运输层完成的,在接收端的运输层对分块的TCP报⽂段的数据部分进⾏重组。
注意:这个MSS指的是TCP报⽂段中数据部分的最⼤长度,并不是整个TCP报⽂段长度。整个TCP报⽂段长度 = TCP⾸部长度 + TCP数据部分长度。
⼆、通信双⽅如何协商MSS
MSS的值是在TCP三次握⼿建⽴连接的过程中,经通信双⽅协商确定的。我们都知道链路层使⽤以太⽹的话,IP层的MTU是1500 byte,这样去掉IP数据报⾸部(20 byte),在去掉TCP⾸部(20 byte)后为1460 byte,此时在默认情况下TCP“选项”字段的MSS值为1460 byte = 1500 - 20 - 20。在 Internet 标准中,IP层
的MTU是576 byte,那么此时TCP“选项”字段的MSS值为536 byte = 576 - 20 - 20。
以上是默认情况下⼀个TCP报⽂段中的MSS值,下⾯我们详细说明MSS值的确定过程。
MSS值只会出现在SYN报⽂中(不要问我为什么,我也不知道为什么只出现SYN报⽂中),即SYN=1时,才会有MSS字段值。当客户端想要以TCP⽅式从服务器端下载数据时,
(1)⾸先客户端会发送⼀个SYN请求报⽂,这个SYN报⽂的“选项”字段中会有MSS值(MSS = MUT - IP⾸部长度 - TCP⾸部长度)。该MSS值是为了告知对⽅最⼤的发送数据⼤⼩。
(2)当服务器端收到SYN报⽂后,会向请求端返回SYN+ACK(同步确认报⽂)报⽂,其中的“选项”字段也会有MSS值。
(3)通信双⽅选择SYN和SYN+ACK报⽂中最⼩的MSS最为此次TCP连接的MSS,从⽽达到通信双发协商MSS的效果。
综上,可以回答开始时的问题。在第⼆次握⼿后就可以确定TCP中最⼤传输报⽂(MSS)⼤⼩。
三、MTU
MTU是最⼤传输单元,这个根据由具体的⽹络决定的,如以太⽹MTU=1500,Internet的MTU=576。
如果IP层所要传输的数据长度>MTU的话,要对这个数据进⾏分⽚处理,每个⽚长度都⼩于MTU,每个⽚构成⼀个IP数据报进⾏传输。
在服务端的IP层使⽤IP数据报的⾸部信息对这些分⽚的IP数据报进⾏重组。这样使得IP层的分⽚对传输层看起来是透明的(传输层不知道IP 层进⾏了分⽚操作)。
四、MTU分⽚的⼀个问题
(1)如果IP层每个分⽚都正确到达⽬的端,那⾃然是很好的。但是如果IP层在发送端对要发送的数据(TCP报⽂段)进⾏分⽚操作,但是在传输过程中某个分⽚发⽣了错误,这样会使整个TCP报⽂段重传。因为IP层不负责可靠性(超时和重传),可靠性有传输层提供。tcp三次握手图解
这也是TCP对数据分段的⼀个原因,分段后的数据在往下交付后肯定不会超过MTU,这样避免了因为分⽚⽽带来的的⿇烦。
(2)如果UDP进⾏数据传输的话,UDP将应⽤层交付下来的整个数据封装为UDP数据报(没有像TCP分块的操作)。这样IP层的数据很容易超过MTU,造成数据分⽚。⽽TCP的数据分块,不会导致IP层的分⽚。
总的来说UDP不会分段,就由IP来分⽚。TCP分段,也就不⽤IP来分⽚了!
总结:
1、IP分⽚是由于传输的数据超过了MTU,TCP分块是由于数据超过了MSS。
2、IP分⽚是在发送端的⽹络层中进⾏的,IP重组是在接收端的⽹络层中,根据IP⾸部完成的。TCP数据分块是在发送端的传输层进⾏
的,TCP重组是在接收端的传输层完成的。IP层的分⽚与重组对传输层是透明的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。