好的,我们来用一个生活中的例子更详细地解释 MTU、MSS,以及 IP 和 TCP 分片。
MTU 和 MSS 的概念
- MTU(Maximum Transmission Unit,最大传输单元):
-
假设你搬家,需要用卡车搬运家具。
-
卡车的最大承载重量是 1500 公斤(MTU)。
-
任何超过这个重量的家具都需要拆分成多个部分运送。
- MSS(Maximum Segment Size,最大分段大小):
-
每件家具在装上卡车之前,需要包装和保护。
-
包装和保护材料(相当于 IP 和 TCP 头部)总共占用 40 公斤。
-
所以,每辆卡车实际能装载家具的最大重量是 1460 公斤(MSS)。
IP 层分片的隐患
假设你有一个非常大的家具,重量是 3000 公斤(大于 MTU 的大小)。按照卡车的规定,你必须将其拆分成两个部分,每部分不超过 1500 公斤。这个过程就像 IP 层进行分片:
-
你需要把家具拆成两个部分,分别装上两辆卡车(分片)。
-
如果在运输过程中,任何一辆卡车(分片)丢失或损坏,整个家具都无法完整到达目的地。
-
因为只有当所有卡车(分片)都到达时,家具才能重新组装(IP 层的重组)。
-
如果一辆卡车丢失,你必须重新发送整个家具的所有部分,这非常耗时且低效。
TCP 协商 MSS 的好处
为了避免这种低效,搬家公司(TCP 协议)在你搬家前会和你协商:每件家具的最大重量不能超过 1460 公斤(MSS),这样每辆卡车加上包装和保护材料的总重量不会超过 1500 公斤(MTU)。这样:
-
你会提前把每件家具都拆成不超过 1460 公斤的部分(TCP 分段)。
-
每个部分单独装车,每辆卡车的总重量不超过 1500 公斤(MTU),不需要再进行分片(IP 分片)。
-
如果某辆卡车丢失,只需要重新发送那部分家具,而不是整个家具。
-
大大提高了运输(数据传输)的效率,减少了重传的次数。
实际的传输过程
- 协商阶段:
- 你和搬家公司(TCP 握手阶段)协商好每件家具的最大重量(MSS)。
- 打包和运输:
-
你把家具拆成不超过 1460 公斤的部分分别装车。
-
每辆卡车加上包装和保护材料,总重量不超过 1500 公斤(MTU)。
-
搬家公司按卡车运输,每辆卡车都在规定重量内,不需要再分片(IP 不用再分片)。
- 丢失和重传:
-
如果某辆卡车在运输过程中丢失,只需要重新打包那部分家具重发一辆卡车。
-
而不是整个家具重新拆分装车再运输。
具体案例
假设你需要传输一个 3000 字节的消息,MTU 是 1500 字节,MSS 是 1460 字节:
- 分段:
- 数据被分成两个 TCP 分段:第一个分段 1460 字节,第二个分段 1540 字节(1460 + 80 字节的头部)。
- 封装:
-
第一个 TCP 分段封装后总长 1500 字节,包括 IP 头部和 TCP 头部。
-
第二个 TCP 分段也封装后总长 1500 字节。
- 传输:
- 每个分段作为一个独立的 IP 包进行传输,不需要进行 IP 层分片。
- 重传机制:
-
如果某个 IP 包丢失,例如第二个 IP 包,接收方不会发送 ACK 确认。
-
发送方会触发重传机制,只重新发送丢失的分段,而不是整个数据流。
通过这种方式,搬家公司(TCP 协议)确保了家具搬运(数据传输)的高效性和可靠性。这样避免了 IP 层分片带来的低效和潜在问题,提高了整体的传输效率和可靠性。
-
MTU
:一个网络包的最大长度,以太网中一般为1500
字节; -
MSS
:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度;
如果在 TCP 的整个报文(头部 + 数据)交给 IP 层进行分片,会有什么异常呢?
当 IP 层有一个超过 MTU
大小的数据(TCP 头部 + TCP 数据)要发送,那么 IP 层就要进行分片,把数据分片成若干片,保证每一个分片都小于 MTU。把一份 IP 数据报进行分片以后,由目标主机的 IP 层来进行重新组装后,再交给上一层 TCP 传输层。
这看起来井然有序,但这存在隐患的,那么当如果一个 IP 分片丢失,整个 IP 报文的所有分片都得重传。
因为 IP 层本身没有超时重传机制,它由传输层的 TCP 来负责超时和重传。
当某一个 IP 分片丢失后,接收方的 IP 层就无法组装成一个完整的 TCP 报文(头部 + 数据),也就无法将数据报文送到 TCP 层,所以接收方不会响应 ACK 给发送方,因为发送方迟迟收不到 ACK 确认报文,所以会触发超时重传,就会重发「整个 TCP 报文(头部 + 数据)」。
因此,可以得知由 IP 层进行分片传输,是非常没有效率的。
所以,为了达到最佳的传输效能 TCP 协议在建立连接的时候通常要协商双方的 MSS 值,当 TCP 层发现数据超过 MSS 时,则就先会进行分片,当然由它形成的 IP 包的长度也就不会大于 MTU ,自然也就不用 IP 分片了。
经过 TCP 层分片后,如果一个 TCP 分片丢失后,进行重发时也是以 MSS 为单位,而不用重传所有的分片,大大增加了重传的效率。