IP分片的隐患,以及TCP分片

好的,我们来用一个生活中的例子更详细地解释 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 为单位,而不用重传所有的分片,大大增加了重传的效率。

相关推荐
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
wuyk5551 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
XUEYUAN52121 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
QYRdata2 天前
年均增速24.2%!机器人数据湖未来六年增长动能强劲
网络·机器人·服务发现
CHENKONG_CK2 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
chshang19922 天前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
萧瑟余晖2 天前
Netty 核心组件与 Reactor 模型详解
网络·架构
ITxiaobing20232 天前
IP 定位服务选型指南:从准确率到工程落地的技术考察
linux·服务器·网络
wuyk5552 天前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
z落落2 天前
C#UDP+串口服务端+UDP 客户端(含 CRC16 校验)
网络·网络协议·udp