好的,我们来用一个生活中的例子更详细地解释 MTU、MSS,以及 IP 和 TCP 分片。

MTU 和 MSS 的概念

  1. MTU(Maximum Transmission Unit,最大传输单元)
  • 假设你搬家,需要用卡车搬运家具。

  • 卡车的最大承载重量是 1500 公斤(MTU)。

  • 任何超过这个重量的家具都需要拆分成多个部分运送。

  1. 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 分片)。

  • 如果某辆卡车丢失,只需要重新发送那部分家具,而不是整个家具。

  • 大大提高了运输(数据传输)的效率,减少了重传的次数。

实际的传输过程

  1. 协商阶段
  • 你和搬家公司(TCP 握手阶段)协商好每件家具的最大重量(MSS)。
  1. 打包和运输
  • 你把家具拆成不超过 1460 公斤的部分分别装车。

  • 每辆卡车加上包装和保护材料,总重量不超过 1500 公斤(MTU)。

  • 搬家公司按卡车运输,每辆卡车都在规定重量内,不需要再分片(IP 不用再分片)。

  1. 丢失和重传
  • 如果某辆卡车在运输过程中丢失,只需要重新打包那部分家具重发一辆卡车。

  • 而不是整个家具重新拆分装车再运输。

具体案例

假设你需要传输一个 3000 字节的消息,MTU 是 1500 字节,MSS 是 1460 字节:

  1. 分段
  • 数据被分成两个 TCP 分段:第一个分段 1460 字节,第二个分段 1540 字节(1460 + 80 字节的头部)。
  1. 封装
  • 第一个 TCP 分段封装后总长 1500 字节,包括 IP 头部和 TCP 头部。

  • 第二个 TCP 分段也封装后总长 1500 字节。

  1. 传输
  • 每个分段作为一个独立的 IP 包进行传输,不需要进行 IP 层分片。
  1. 重传机制
  • 如果某个 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 为单位,而不用重传所有的分片,大大增加了重传的效率。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部