初识Linux · IP分片

目录

前言:

IP分片

分片vs不分片

如何分片

分片举例

三个字段


前言:

前文IP协议·上和IP协议·下我们已经把IP协议的报头的大多数字段介绍了,唯独有三个字段现在还有介绍,即16位标识,8位协议,13位片偏移,今天,我们将通过IP分片的介绍,隆重介绍这三个字段,那么废话不多说,直接进入主题吧!


IP分片

我们熟知报文在向下交付的时候,分别是经过应用层,传输层,网络层,再到数据链路层,那么在报文交付的过程我们是否考虑过报文的字节数是否会超过限制?

实际上,在报文交付的时候,我们拿以太网举例,在数据链路层存在MTU,即数据链路层定义的最大帧负载,说简单一点就是最大传输单元

即从传输层下来的数据不能超过MTU,而MTU在以太网中代表的是1500字节,在不同的网络中有不同的配置。那么传输层的报文经过网络层,封装的时候发现的数据一旦超过了MTU,就会进行分片。

分片vs不分片

我们知道,报文超过了MTU就会在网络层分片,那么分片就代表了报文会从1个报文变成多个报文,所以分片vs不分片的话题,也就变成了1个报文vs多个报文的话题了。

对于这个话题来说,非常的直观,因为网络世界中存在一个老生常谈的话题——丢包问题。如果分的片中,有一片丢失了,那么整个报文就丢失了,此时就会重传,会给网络带来额外的负担,所以分片并不是网络转发的主流,并且因为分片了,那么还要组装,有了组装,我们还得担心是否会有分片丢失,如果分片丢失,还需要重传,即便没有丢失,也需要判断是否发生了丢包的情况。这也就是为什么不想分片的原因。

那么如何做到不分片也很简单,只要发送的数据不超过对应网络的MTU就可以了,但是架不住有的情况下只能分片,所以本文的侧重点主要还是在如何分片上。

如何分片

分片举例

假设现在有一个3000字节的报文,我们一想,MTU不是1500字节吗?所以3000直接除以1500呗,就分两个片就行了呗。

实际上这个操作是非常错误的,因为报文在网络世界中往往要有一个标识,比如IP报头等。如果我们直接一分为2,前1500字节好说,有对应的IP报头嘛,但是后面的1500字节可就遭罪了,就只有有效载荷,报头呢?啥也没有,那谁接收了该报文不迷糊啊。

所以分片的时候,实际上是这样的(只考虑IP的20字节报头):

原始为3000字节的数据,分为了三片,每片都有自己的报头和有效载荷。这是正确分法。

三个字段

到这里,我们可以开始了解这三个字段了,分别是16位标识,3位标志,13位片偏移

对于16位标识来说,是对不同分片的一个分类,毕竟我们要有一个认识就是:OS内存在大量的报文,有的是已经分片了的,有的是没有分片的,那么对于已经分片的报文,我们后面组装的时候知道哪些分片是一类的,哪些不是,这样才能从分片的报文组装为一个完整的报文。

所以16为标识的作用是:标识从同一个报文分下来的分片报文

对于之后组装的时候,我们要清楚一个点就是,如何进行组装?稀里糊涂的组装?逮到谁就是谁吗?那肯定不行,所以我们需要一个字段来表示该分片是原始报文的哪个位置。

在IP报头中标识位置的字段就是13位片偏移,通过该字段有效的标记分片在原始报文的偏移量是多少,比如上面的偏移量分别是0,1480,2960。因为第一片的还有20字节的报头,所以偏移量应该是1480。

那么有意思的来了,我们知道片偏移量是13位,但是IP有一个字段是16位总长度(总字节数),也就代表了数据的最大可以到2^16次方,而片偏移量只有13位,所以偏移量最大只能表示2^13字节,那么没有表示出来的字节数怎么处理?

实际上,在分片的时候,实际偏移的字节数是偏移量右移8位得到的,也就是说这个偏移量一定是能够被8整除的。那么如果不能被8整除怎么办?这问题在网络层严格规定了,只有最后一片报文的字节数可以不被8整数,前面的报文都是要能被8整除的。那么在组装的时候,可以通过偏移量左移得到对应的真实的片偏移量。

所以13位片偏移的作用是:表示该分片在原始有效载荷的偏移量

三位标记字段就比较简单了,有的报文可以分片有的不能,所以三位标志字段中第一位是保留字段,现在不使用,第二个是置为1代表的是禁止分片,这个时候报文长度如果超过了MTU,IP就会丢弃该报文。第三位表示更多分片的意思,除了最后一个分片设置为0,其他的都是1,为0的时候类似于一个结束标志,就像C语言的字符串使用斜杠0结尾一样。

所以3位标志的作用是:表示该报文是否分片,并且如果分片,最后的分片标志位为0.        

那么在组装的时候,我们一定是要知道分片在原始有效载荷的位置,所以片偏移量有效帮我们解决了这个问题,因为按照顺序来说,依次的片偏移量是升序排列的。

那么我们如何区分报文的是分片了的,如果分片了,它是第一个或者是其他位置的?

对于没有分片的:更多分片为0 && 片偏移量为0。
对于分片了的,第一片的更多分片为1 && 片偏移量为0,其他片的更多分片为1 && 片偏移量>0,最后一片的更多分片为0 && 片偏移量不为0

这样就完美区分了分片和不分片,那么分片我们清楚了,组装不就也清楚了吗?

那么真正的分片如下:

以上就是IP分片的全部内容。


感谢阅读!

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

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

相关文章

u3d 定义列表详细过程

层级结构 - Canvas - Scroll View - Viewport - Content (Vertical Layout Group) - Item1 (Prefab) - Item2 (Prefab) ... 详细设置步骤 1. 创建 Canvas 2. 添加 Scroll View 组件 3. 在 Scroll View 下创建 Content 子对象 4. 添加 …

产品方法论与 AI Agent 技术的深度融合:从决策智能到价值创造

一、引言:智能化时代的产品范式革命 在数字化转型的深水区,产品开发正经历着从 “功能定义” 到 “体验设计” 再到 “智能演化” 的范式跃迁。麦肯锡 2024 年报告指出,采用 AI 驱动产品方法论的企业,新品研发周期平均缩短 40%&a…

力扣.1471数组的k个最强值,力扣.1471数组的k个最强值力扣1576.替换所有的问号力扣1419.数青蛙​编辑力扣300.最长递增子序列

目录 力扣.1471数组的k个最强值 力扣1576.替换所有的问号 力扣1419.数青蛙​编辑 力扣300.最长递增子序列 力扣.1471数组的k个最强值 class Solution {public static int[] getStrongest(int[] arr,int k) {if(karr.length){return arr;}int []retnew int[k];int narr.lengt…

使用docker安装clickhouse集群

1、简介 clickhouse 作为大数据场景中,实现快速检索的常用列式存储数据库,采用物理机部署,会在数据量大的场景中,物理机器存储达到阈值需要扩容,会带来比较大的问题,因此,使用docker部署clickho…

package-lock.json能否直接删除?

package-lock.json能否直接删除? package-lock.json 生成工具:由 npm 自动生成。 触发条件:当运行 npm install 时,如果不存在 package-lock.json,npm 会创建它;如果已存在,npm 会根据它精确安…

如何在 Windows 命令提示符中创建多个文件夹和多个文件

如何在 Windows 命令提示符中创建多个文件夹和多个文件 虽然大多数用户习惯使用 Windows 图形界面来创建文件夹,但如果你需要一次性创建多个文件夹或文件,如同在类Unix系统中可以使用mkdir和touch命令一样,windows下也有创建目录和文件的对应…

leetcode - 滑动窗口问题集

目录 前言 题1 长度最小的子数组: 思考: 参考代码1: 参考代码2: 题2 无重复字符的最长子串: 思考: 参考代码1: 参考代码2: 题3 最大连续1的个数 III: 思考&am…

Ubuntu20.04下如何源码编译Carla,使用UE4源码开跑,踩坑集合

一、简介 作为一个从事算法研究的人员,无人驾驶仿真一直是比较重要的一部分,但是现在比较常见的算法验证都是在carla这个开源仿真平台上做的,所以我有二次开发carla的需求,今天就来讲讲编译CARLA。 网上的教材很多,但还是推荐大家看官网教程:Linux build - CARLA Simul…

Linux云计算训练营笔记day09(MySQL数据库)

Linux云计算训练营笔记day09(MySQL数据库) 目录 Linux云计算训练营笔记day09(MySQL数据库)外键约束数据的导入和导出数据的导出数据的导入 DQL 数据查询语言查指定字段查所有字段where 过滤条件and 和 orin 和 not inbetween...an…

对心理幸福感含义的探索 | 幸福就是一切吗?

注:机翻,未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗?对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …

零基础学Java——第十一章:实战项目 - 微服务入门

第十一章:实战项目 - 微服务入门 随着互联网应用的复杂性不断增加,单体应用(Monolithic Application)在可扩展性、可维护性、技术栈灵活性等方面逐渐暴露出一些问题。微服务架构(Microservices Architecture&#xff…

git 本地提交后修改注释

dos命令行进入目录,idea可以点击Terminal 进入命令行 git commit --amend -m "修改内容"

Python训练打卡Day22

复习日: 1.标准化数据(聚类前通常需要标准化) scaler StandardScaler() X_scaled scaler.fit_transform(X) StandardScaler() :这部分代码调用了 StandardScaler 类的构造函数。在Python中,当你在类名后面加上括号…

气动排渣煤粉炉专用V型球阀——法兰连接耐磨阀门生产厂家解析-耀圣

气动排渣煤粉炉专用V型球阀——法兰连接耐磨阀门生产厂家解析 副标题:开关灵活无泄漏 标配行程开关/电磁阀/过滤器 一、产品概述:气动排渣煤粉炉专用V型球阀核心优势 作为专业的气动耐磨V型球阀生产厂家,我们针对煤粉炉排渣工况研发的法兰连…

Linux云计算训练营笔记day08(MySQL数据库)

Linux云计算训练营笔记day08(MySQL数据库) 目录 Linux云计算训练营笔记day08(MySQL数据库)数据准备修改更新update删除delete数据类型1.整数类型2.浮点数类型(小数)3.字符类型4.日期5.枚举: 表头的值必须在列举的值里选择拷贝表复…

致远OA人事标准模块功能简介【附应用包百度网盘下载地址,官方售价4W】

人事管理应用,围绕岗位配置、招聘管理、员工档案、入转调离、员工自助申报、数据信息管理等人力资源管理关键业务,构建全员可参与的人事工作协同平台,让人事从繁杂琐碎的事务中解脱出来,高质高效工作,让管理层清楚掌握…

数字孪生工厂实战指南:基于Unreal Engine/Omniverse的虚实同步系统开发

引言:工业元宇宙的基石技术 在智能制造2025与工业元宇宙的交汇点,数字孪生技术正重塑传统制造业。本文将手把手指导您构建基于Unreal Engine 5.4与NVIDIA Omniverse的实时数字孪生工厂系统,集成Kafka实现毫秒级虚实同步,最终交付…

【向量模型 + HNSW 参数如何选择】

目录 一、embedding_function(向量模型) 可选方式 选型建议 二、HNSW 参数选择(核心影响搜索速度与准确率) 2.1 参数解释和推荐值 2.2 配置模板参考 1、推荐默认配置(适合大多数项目): 2…

fpga系列 HDL : Microchip FPGA开发软件 Libero Soc 安装 license申请

启动 注册账号:https://login.microchip.com/申请免费许可:https://www.microchipdirect.com/fpga-software-products C:\Windows\System32>vol驱动器 C 中的卷是 Windows卷的序列号是 ****-****为“D:\Microsemi\License.dat”创建环境变量“LM_LICE…

【C++】解析C++面向对象三要素:封装、继承与多态实现机制

解析C面向对象三要素:封装、继承与多态实现机制 1. 面向对象设计基石2. 封装:数据守卫者2.1 访问控制实现2.2 封装优势 3. 继承:代码复用艺术3.1 继承的核心作用3.2 继承类型对比3.3 典型应用场景3.4 构造函数与析构函数处理3.4.1 构造顺序控…