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

2024-06-11 07:20
文章标签 ip tcp 分片 隐患

本文主要是介绍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 为单位,而不用重传所有的分片,大大增加了重传的效率。

这篇关于IP分片的隐患,以及TCP分片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050515

相关文章

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.