IP协议分片重组问题

news2024/11/20 20:22:41

分片是什么&&为什么会有分片

IP数据报分片的主要目的是为了防止IP数据报文长度超过下一跳链路MTU(最大传输单元)。

数据链路层之MTU

  • 数据链路层中有一个东西叫做MTU(最大传输单元),它的作用主要是控制上层给的数据报不要太大,大的数据报文在网络内传输时会占用过多带宽资源,使其它报文的转发效率下降,通过MTU来限制数据报文,根据MTU将数据报文分片以减少数据碰撞的发生。

  • 每种数据链路的最大传输单元 MTU 都是不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是 1500 字节等。

  • 每种数据链路的 MTU 之所以不同,是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同。

  • 其中,我们最常见数据链路是以太网,它的 MTU 是 1500 字节。

  • 那么当 IP 数据包大小大于 MTU 时, IP 数据包就会被分片。

  • 经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。

  • 假设发送方发送一个 4000 字节的大数据报,若要传输在以太网链路,则需要把数据报分片成 3 个小数据报进行传输,再交由接收方重组成大数据报。即1500,1500,1000三个数据报

工作原理

得先了解报文结构

IP报文特性

IP 包全长由头部中的 总长度 字段决定,该字段共 16 位,因此一个 IP 包最大可达 65535 字节。除去头部 20 字节,IP 包最多可承载 65515 字节的数据:

在这里插入图片描述

如果IP 头部带有可选选项,长度就不止 20 字节了,但最大60字节。以上关于IP报文详细结构可以看这篇。,同理,数据的携带就会相应变少。

在观察IP数据报文的特性之后我们发现:

  • 一个 65535 字节的 IP 报文,显然不可能在运输能力只有 1500 字节的以太网帧或任意一个数据链路层协议帧中。

发送端分片简单原理

在这里插入图片描述
我们从上至下讲:

  • TCP报文询问IP,IP询问数据链路层MTU是多少,数据链路层返回1500。
  • IP得到MTU=1500,因为IP报头需要最少20字节,所以,给TCP的回复是1480。
  • TCP得到回复MTU=1280,由于TCP报头最少要20字节,故根据MTU,TCP留给数据的空间就是1460字节。
  • TCP再根据对端发来的接收端窗口大小,if 接收端窗口.size() < MTU.size() ,则最终TCP数据报文的大小 = 接收端窗口大小,else TCP数据报文的大小 = 1460。
  • 说到这里大致就明朗了,IP其实没有进行分片的机会!!!为什么呢?
    • 主要是因为分片降低网络性能
      • TCP在传输层通过滑动窗口以及和对端商量好了发送数据的大小,你IP又在网络层分一次,干嘛不直接在传输层做完呢,这就可以提高效率了。TCP两件事都给做了,这个过程叫做分段。

      • 另外,如果IP分片了,数据在传输过程中出现了丢包,可TCP是IP的上层,是不知道IP分片了,分了几片的,所以触发了超时重传等机制,TCP就不得不把整个丢失的包进行重发,但实际丢掉的是IP分片之后的一部分数据包。那么,网络设计者觉得与其让IP分片,不如TCP把这事做了,丢包了也只需要重传一小部分,而不是像上面那样重传整个数据包。

      • 同时,如果在IP分片,每一个分片又得带上相差无几的报头,浪费!

      • 所以,不如在传输层全部做好,IP只需要做一件事情——>添加自己的报头,转发报文给数据链路层就完成工作了!!!

      • 所以,TCP把分片的工作给抢了,这种机制叫做MSS(最大分段大小),防止IP分片

        故此,提出一个概念:

        • IP协议负责数据包的地址标注与传输,他是传输策略的执行者
        • TCP协议则建立连接,管理流量和错误校验,保证了数据传输的可靠性,他是传输策略的制定者

发送端分片详细原理

这里强烈建议去熟悉IP报文结构
IP 包头部中有 3 个与分片相关的字段,分别是:
在这里插入图片描述

  • 16位标识: IP 包的 ID ,全局自增,短时间内不会重复,主机发送的报文的唯一标识. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.
  • 3位标志位:
    • 第一位:DF - Don’t Fragment 位,为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文.
    • 第二位:MF - More Fragments 位,该位用于指示报文是否有后续分片。如果分片了的话, 最后一个分片置为0, 其他是1, 类似于一个结束标记。
    • 第三位:Fragment Offset 位,这些位标识分片在原始报文中的相对位置。它们与分片序号一起,用于重组时排序和定位分片。
  • 13位片偏移: 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
    • 这里解释一下为什么是13位片偏移:

      IP报头中的片偏移字段只有13位,如果以字节为单位,其能表示的偏移范围是:

      2^13 = 8191字节 = 8KB

      而IP数据报的总长度字段有16位,可以表示的总长度是:

      2^16 = 65535字节 = 64KB

      以字节为偏移单位,13位能表示的最大偏移量是8KB,如果数据报大于8KB,偏移字段会出现表示不足的情况。

      但偏移量以8字节为单位,13位就可以表示:

      8192 * 8 = 64KB

      正好与总长度字段的表示范围相同。

      所以出于表示范围的限制,偏移字段必须采用“以8字节为单位”的设计,即使最小分片也会多占用一点空间,这是对范围表示和分片处理的一个综合考量。

假设发送端通过以太网帧 MTU 是 1500 ,它准备发一个长度为 4000 字节的 IP包。TCP分片情况如下:

在这里插入图片描述

如上图,原包长达 4000 字节,其中头部 20 字节,数据部分为 3980 字节。分片包最大长度为 1500 ,除去头部的 20 字节,数据部分只剩 1480 。这意味着,原包 3980 字节至少需要分为 3 片。

由于偏移量字段以 8 字节为单位,因此每个分片的数据长度必须为 8 的倍数,最后一片除外。由于 1480 刚好可以被 8 整除,因此分片数据长度可以选择 1480 。

第一个分片,包含原包前 1480 字节数据,因此偏移量 offset=0 ;而 MF=1 表示后面还有其他分片。第二个分片,包含原包紧接着的 1480 字节数据,偏移量 1480/8=185 ;同样 MF=1 表示后面还有其他分片。最后一个分片,包含原包最后 1020 字节数据,偏移量 29608/8=370 ;而 MF=0 表示它是最后一片了。

接收端是如何重组IP报文的

这些分片被发出去后,由于是不同的数据包,可能出现丢包,阻塞等现象,到达时间和顺序是无法预测的,所以,无法按照分片到达顺序来确定。

因此,分片到达目标主机后,系统根据报头中字段,将它们重组。

实际上,系统会分配一块内存作为重组分片的缓冲区。一个分片包首个分片达到后,系统将其移入到该缓冲区,等待其他分片达到:
在这里插入图片描述

后续分片达到后,系统先根据源地址、目的地址和标识符确定它属于哪个包;再根据偏移量确定它属于原包的哪个部分;最后将分片数据拼接到原包中。当所有分片都到达后,原包也就成功重组出来了!

IP是否有可能分片

如果中间路由链路 MTU 变小,经过的 IP 包大小超出限制,路由便再次对 IP 包进行分片。就算 IP 包已分过片,只要有分片大小超出限制,都要进一步划分(注意按照现在的讲法IP此时是可以分片的):

在这里插入图片描述

如上图,路由专线的 MTU 很小。一个去往主机A的 IP 包,被主机A发出前已被分为两片。来到路由器1 时,由于第一个分片大小仍超过路由器的 MTU ,路由器1 进一步将其分为两片。

IP 包来到 路由2 后链路 MTU 变大,理论上可以对前两个分片进行组装,还原出原来的分片 1 。但出于效率考虑,中间路由不会这么做,分片只有到达目的地即主机B之后,才会开始重组。

但我们说过,IP分片会导致效率的下降 ,那么如何让IP分不了包呢?(以下PMTU内容参考小白debug)

  • 获取 PMTU(整个IP报文传输过程中设备数据链路层的最小MTU)!!!
  • 使用 IP 报头中的3位标志位
  • IP 包设置 DF 标志,中间路由便不能将它分片,只能向发送者报告 ICMP 目的不可达 错误。
  • ICMP中包含PMTU信息,TCP获取PMTU后,重新组织数据段发送,以此避免IP分片!
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/945529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法通关村第8关【白银】| 二叉树的深度和高度问题

1.最大深度问题 思路&#xff1a;递归三部曲 第一步&#xff1a;确定参数和返回值 题目要求求二叉树的深度&#xff0c;也就是有多少层&#xff0c;需要传递一个root从底层向上统计 int maxDepth(TreeNode root) 第二步&#xff1a;确定终止条件 当递归到null时就说明到底了…

实训笔记8.28

实训笔记8.28 8.28笔记一、大数据计算场景主要分为两种1.1 离线计算场景1.2 实时计算场景 二、一般情况下大数据项目的开发流程2.1 数据采集存储阶段2.2 数据清洗预处理阶段2.3 数据统计分析阶段2.4 数据挖掘预测阶段2.5 数据迁移阶段2.6 数据可视化阶段 三、纯大数据离线计算项…

最新企业网盘产品推荐榜发布

随着数字化发展&#xff0c;传统的文化存储方式已无法跟上企业发展的步伐。云存储的出现为企业提供了新的文件管理存储模式。企业网盘作为云存储的代表性工具&#xff0c;被越来越多的企业所青睐。那么在众多企业网盘产品中&#xff0c;企业该如何找到合适的企业网盘呢&#xf…

汽车类 ±0.25°C SPI 温度传感器,TMP126EDBVRQ1、TMP126EDCKRQ1、TMP127EDBVRQ1引脚配置图

一、概述 TMP126-Q1 是一款精度为 0.25C 的数字温度传感器 &#xff0c; 支持的环境温度范围为 -55C 至 175C 。TMP126-Q1 具 有 14 位 &#xff08; 有符号 &#xff09; 温度分辨率(0.03125C/LSB)&#xff0c;并且可在 1.62V 至 5.5V 的电源电压范围内工作。TMP126-Q1 具有转…

Python爬虫网络安全:优劣势和适用范围分析

各位Python程序猿大佬们&#xff01;在当今数字化时代&#xff0c;网络安全是至关重要的。保护你的网络通信安全对于个人和组织来说都是非常重要的任务。在本文中&#xff0c;我将与你一起探讨Python网络安全编程中的代理、虚拟专用网络和TLS这三个关键概念&#xff0c;分析它们…

「2024」预备研究生mem-分析推理强化: 分组型 (上)

一、分析推理强化: 分组型 (上) 二、课后题

助力乡村振兴 泰格智能AI英语携手中国善网在行动

近日&#xff0c;泰格智能AI英语与中国善网宣布达成战略合作&#xff0c;共同投身乡村教育事业。此次合作旨在通过中国善网的会员公益机构&#xff0c;向乡村英语老师和学生捐赠共12000个英语教育智能AI训练产品账号&#xff0c;其总价值超过350万人民币。这一举措是为了让乡村…

为何直线导轨要保持日常清洁?

随着时代的发展&#xff0c;已逐步从传统的工业发展模式发展到工业自动化&#xff0c;直线滑轨在工业生产中得到了广泛的应用&#xff0c;大大提高了生产效率&#xff0c;带动了经济效益的增长。 众所周知&#xff0c;想要直线导轨的使用达到预期的效果&#xff0c;日常的保养和…

Vue3 学习

基础 js:https://www.bilibili.com/video/BV15T411j7pJ/?spm_id_from333.337.search-card.all.click&vd_source9747207be61edfe4ec62226fc79b3589 官方文档&#xff1a; https://cn.vuejs.org/ 版本之间差异在关于---》版本发布 https://cn.vuejs.org/about/release…

[Unity]UI和美术出图效果不一致

问题描述&#xff1a;美术使用PS在Gamma空间下设计的UI图&#xff0c;导入到Unity&#xff0c;因为Unity使用的是线性空间&#xff0c;导致半透明的UI效果和美术设计的不一致。 解决方案&#xff1a; &#xff08;一&#xff09;让美术在线性空间下工作 &#xff08;二&…

【C++练习】C++中读取.txt文件中的数据(由简到难)

1 将数据写入.txt文本中&#xff0c;再从.txt中读取到string字符串里&#xff0c;输出到终端 #include <iostream> #include <fstream>//包头文件 using namespace std;int main() {//1. 创建流对象ofstream ofs;//2. 以写的方式打开文件&#xff08;若文件不存在…

领域驱动设计入门指南

​ 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;简称DDD&#xff09;是一种软件架构风格&#xff0c;它强调在软件开发过程中紧密关注业务需求和领域知识。本文将简要介绍领域驱动设计的核心概念&#xff0c;帮助人开始学习和实践领域驱动设计。 什么是领域驱动设…

uniapp 项目实践总结(二)从零开始搭建一个项目

导语:本篇文章主要是项目方面的技术开发总结,新建一个项目可以选择使用可视化界面,也可以使用命令行搭建。 目录 可视化界面命令行搭建安卓开发环境苹果开发环境可视化界面 安装软件 使用官方推荐的 HbuilderX 软件,开发方式比较简单,内置相关环境以及终端,无需配置 no…

LLMs:OpenAI官方重磅更新——新增GPT-3.5Turbo调和API更新功能

LLMs&#xff1a;OpenAI官方重磅更新——新增GPT-3.5Turbo调和API更新功能 导读&#xff1a;2023年8月22日&#xff0c;OpenAI官方发布&#xff0c;开发者现在可以使用自己的数据来定制适用于其用例的GPT-3.5 Turbo模型。GPT-3.5 Turbo的微调现在已经可用&#xff0c;GPT-4的微…

图的四种存储方式

图片来源&#xff1a;王道数据结构第六章 目录 邻接矩阵法 不带权的 带权的图 邻接矩阵法的性能分析 链接 对阵矩阵的压缩存储 邻接矩阵法的性质 邻接表法 链接 树的孩子表示法 性能分析 对比邻接矩阵 十字链表法 性能分析 邻接多重表 邻接多重表存储无向图 四种…

后端Windows软件环境安装配置大全[JDK、Redis、RedisDesktopManager、Mysql、navicat、VMWare、finalshell、MongoDB...持续更新中]

文章目录 前言1. 安装 JDK2. 安装 Redis3. 安装 RedisDesktopManager&#xff08;Redis可视化工具&#xff09;4. 安装 Mysql5. 安装 navicat (Mysql可视化工具)6. 安装 VMWare7. 安装 finalshell (VMWare可视化工具)8. 安装 MongodDB9. 安装 maven 总结 前言 为了巩固所学的知…

WIFI模块8121N-UH的应用

随着科技的不断发展&#xff0c;无人机的应用领域正不断扩展并变得异常广泛。无论是无人机的起飞、航行、悬停还是返航等各个阶段&#xff0c;都依赖于高度精准的无线遥控技术。同时&#xff0c;无人机在飞行过程中需要实现无线视频传输&#xff0c;因此&#xff0c;如何确保无…

暴力递归转动态规划(二)

上一篇已经简单的介绍了暴力递归如何转动态规划&#xff0c;如果在暴力递归的过程中发现子过程中有重复解的情况&#xff0c;则证明这个暴力递归可以转化成动态规划。 这篇帖子会继续暴力递归转化动态规划的练习&#xff0c;这道题有点难度。 题目 给定一个整型数组arr[]&…

C#2010 .NET4 解析 json 字符串

下载Newtonsoft.Json.dll using System; using System.Collections.Generic; using System.Linq; using System.Text;using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; namespace ConsoleApplication1 {class Program{static void Main(string[] args){strin…