Post

TCP分段与IP分片

【网络协议 8】TCP分段与IP分片✅

我们在学习 TCP/IP 协议时都知道,TCP 报文段如果很长的话,会在发送时发生分段,在接受时进行重组,同样 IP 数据报在长度超过一定值时也会发生分片,在接收端再将分片重组。

我们先来看两个与 TCP 报文段分段和IP数据报分片密切相关的概念。

MYU(最大传输单元)

MTU前面已经说过了,是链路层中的网络对数据帧的一个限制,依然以以太网为例,MTU 为1500个字节。一个 IP 数据报在以太网中 传输,如果它的长度大于该 MTU 值,就要进行分片传输,使得每片数据报的长度小于 MTU。分片传输的IP数据报不一定按序到达,但IP首部中的信息能让这些数据报片按序组装。IP数据报的分片与重组是在网络层进完成的。

MSS(最大分段大小)

MSS 是 TCP 里的一个概念(首部的选项字段中)。MSS 是 TCP 数据包每次能够传输的最大数据分段,TCP 报文段的长度大于 MSS 时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的 MSS 值,每一方都有用于通告它期望接收的 MSS 选项(MSS 选项只出现在 SYN 报文段中,即 TCP 三次握手的前两次)。MSS 的值一般为 MTU 值减去两个首部大小(需要减去IP数据包包头的大小 20Bytes 和TCP数据段的包头 20Bytes)所以如果用链路层以太网,MSS 的值往往为 1460。而 Internet 上标准的 MTU(最小的 MTU,链路层网络为 x2.5 时)为 576,那么如果不设置,则 MSS 的默认值就为 536 个字节。很多时候,MSS 的值最好取 512 的倍数。TCP 报文段的分段与重组是在运输层完成的。

到了这里有一个问题自然就明了了,TCP分段的原因是MSS,IP分片的原因是MTU,由于一直有MSS<=MTU,很明显,分段后的每一段TCP报文段再加上IP首部后的长度不可能超过MTU,因此也就不需要在网络层进行IP分片了。因此TCP报文段很少会发生IP分片的情况。

再来看UDP数据报,由于UDP数据报不会自己进行分段,因此当长度超过了MTU时,会在网络层进行IP分片。同样,ICMP(在网络层中)同样会出现IP分片情况。

总结:

UDP 不会分段,就由 IP 来分。TCP 会分段,当然就不用 IP 来分了!

另外,IP 数据报分片后,只有第一片带有 UDP 首部或 ICMP 首部,其余的分片只有 IP 头部,到了端点后根据IP头部中的信息再网络层进行重组。而 TCP 报文段的每个分段中都有 TCP 首部,到了端点后根据TCP首部的信息在传输层进行重组。IP数据报分片后,只有到达目的地后才进行重组,而不是向其他网络协议,在下一站就要进行重组。

最后一点,对IP分片的数据报来说,即使只丢失一片数据也要重新传整个数据报(既然有重传,说明运输层使用的是具有重传功能的协议,如TCP协议)。这是因为IP层本身没有超时重传机制——由更高层(比如TCP)来负责超时和重传。当来自TCP报文段的某一段(在IP数据报的某一片中)丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(可能有多个IP分片),没有办法只重传数据报中的一个数据分片。

This post is licensed under CC BY 4.0 by the author.