网络:IP分片和组装

个人主页 : 个人主页
个人专栏 : 《数据结构》 《C语言》《C++》《Linux》《网络》 《redis学习笔记》
文章目录
- 前言
- 16位标识,3位标志,13位片偏移
- 分片
- 组装
- 总结
前言
对于IP分片和组装的总结

当一个IP数据报的大小超过网络的MTU(最大传输单元)限制时,就需要进行分片。MTU是数据链路层对IP层数据包进行封装时所能接受的最大数据报长度。
MTU可以通过ifconfig查看

16位标识,3位标志,13位片偏移

IP分片和组装,主要和 16位标识,3位标志,13位片偏移 有关。
- 16位标识:唯一标识主机发送的报文,如果IP报文在数据链路层被分片,那每一片里的 16位标识相同
- 3位标志:

- 13位片偏移:分片相对于原始IP报文开始处的偏移(不包含报头)。
这里有一个小问题,IP报文的总长度是16位,那有没有一个可能,最后一个分片相对于原始IP报文开始的偏移量大于最大13位片偏移?这怎么处理?
实际上,这个偏移量的单位是 8字节,偏移量必须是8的整数倍。因此实际可以表示的偏移范围是 0 到 ( 2 ^ 13 - 1) * 8 = 8191 * 8 = 65528字节,大于 IP报文能表示的最大长度 65535字节(包含报头 和 数据)。
有了以上了解,现在我们来看看,在IP层,有一个大小为3000字节的报文,如何分片?如何组装?
分片
我们知道,在网络中传输的都是报文;也就是说每一个IP分片也都是完整的IP报文。

IP报文大小为3000字节,IP报头的16位标识为111,超过MTU(1500),需要分片。
我们先将IP报文的前1500字节组成一个新的IP报文。
那么IP报头的 16位标识:111,3位标志:MF(1),13位片偏移:0。
16位标识要与分片前的16位标识相同;MF置1表示还有更多分片;13位片偏移为0,表示分片相对于原始IP报文的偏移量是0。

我们再对剩下的1500字节进行分片。因为,每个IP分片也都是完整的IP报文,所以我们不能将这1500字节一次处理完毕(IP报文有20字节),我们需要分成 1480 字节 和 20 字节两部分处理。
组装新的IP报头,
16位标识于原16位标识一致;
后面还有20字节的没处理的报文数据,3位标志:MF(1);
该分片与原始IP报文的偏移量(不包含IP报头)为1480,又因为13位片偏移的单位是8字节,那么13位偏移量就是185。

组装新的IP报头,
16位标识于原16位标识一致;
该分片已经是最后一个了,3位标志:MF(0);
该分片与原始IP报文的偏移量为2980,又因为13位片偏移的单位是8字节,那么13位偏移量就是370。

这样我们就对 3000字节大小的IP报文,进行了分片。
总结流程如下:
- 检查MTU限制,当一个IP数据报的大小超过网络的MTU限制时,就需要进行分片
- 分割数据报,IP层将原始IP数据报分割成多个较小的片段;对每个片段,IP层会设置相应的16位标识,3位标志,13位片偏移
- 添加IP头部,每个分片都是加上自己的IP头部
- 发送分片,分片在传输过程中独立传输,每个分片都有自己的IP报文头部,并且各自独立的选择路由
组装

现在接收方,收到了从发送方来的三个IP报文。我们站在阅读者的角度,知道这三个IP报文,大概率是上文分好的三个IP分片;可站在接收方的角度,他如何知道这三个IP报文是分片,怎么知道是否把IP分片收完?毕竟想要对IP分片进行组装,那要先识别和收完。
识别IP分片,这个好办。
接收方可以查看IP报文的 3位标志 和 13位片偏移来判断
- 如果不是分片,MF(0) && 片偏移:0
- 如果是分片,MF(1) || 片偏移 != 1
接收方怎么保证把分片收全
分片收全不好考虑,但分片丢失只有三种情况,第一片分片丢失,中间分片丢失,最后一片分片丢失。我们只要保证这三种情况没有发生,不就保证了分片收全了。
-
第一片分片丢失,我们只需查看这些分片中是否有13位片偏移为0的分片,如果存在,则第一片分片没有丢失;如果不存在,则第一片分片丢失
-
中间片丢失,我们只需对这些分片按片偏移量进行排序,在遍历这些分片时,检查 该分片的片偏移量 * 8 + 该分片的有效载荷大小 == 下一片的片偏移量 * 8,如果等于,表示中间没有分片丢失;如果不等于,表示中间有分片丢失。

-
最后一片分片丢失,我们只需查看这些分片中是否存在MF 为 0的分片即可,如果存在,则最后一片分片没有丢失;如果不存在,则最后一片分片丢失。
至此,接收方可以识别和判断是否收完分片。
总结流程如下:
- 接受分片,当目的主机的IP层接受到这些分片后,会根据标识字段将属于同一个数据报的所有分片挑选出来
- 排序与组装,IP层会对属于同一个数据报的分片,按照片偏移字段进行升序排序;当所有分片都到达并正确排序后,IP层会将这些分片重新组装成一个完整的IP数据报
- 传递给上层协议
总结
IP分片对传输层是透明的,意味着传输层无需关心数据是否被分片以及如何重新组装
以上就是IP分片和组装的过程

相关文章:
网络:IP分片和组装
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言16位标识,3位标志,13位片偏移分片组装总结 前言 对于IP分片和组装的总结 当一个IP数据报的大小超过网络的MTU(最…...
Oracle dblink创建使用
1、首先要有创建Database Link 的权限。可通过语句查看当前用户是否有权限: SELECT * FROM USER_SYS_PRIVS;如果没有权限,使用系统管理员用户登陆后给当前用户授权: GRANT CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK TO user;…...
Classic GNNs are Strong Baselines: Reassessing GNNs for Node Classification
Classic GNNs are Strong Baselines: Reassessing GNNs for Node Classification Neurips 24 推荐指数: #paper/⭐⭐⭐# 摘要 我们的研究结果表明,由于GNN中的超参数设置次优,之前报道的GT的优越性可能被夸大了。值得注意的是ÿ…...
Android 字节飞书面经
Android 字节飞书面经 文章目录 Android 字节飞书面经一面二面 一面 1. 线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 2. 根本区别:进程是操作系统资源分配的基本单位,…...
选择好友窗口(三)
选择好友窗口(三) 前言 在前两集我们就完成了整个左半部分的内容了,那么我们这一集开始就要完成我们的选择好友窗口的右侧部分。 需求分析 我们要做出的效果如下图 可以看到我们整个布局是一个网格的布局,当然也可以做成一个垂…...
【含文档】基于ssm+jsp的音乐播放系统(含源码+数据库+lw)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定义了两个…...
【C语言】动态内存开辟
写在前面 C语言中有不少开辟空间的办法,但是在堆上开辟的方法也就只有动态内存开辟,其访问特性与数组相似,但最大区别是数组是开辟在栈上,而动态内存开辟是开辟在堆上的。这篇笔记就让不才娓娓道来。 PS:本篇没有目录实在抱歉CSD…...
Redis缓存在thinkPHP/fastAdmin框架中的应用
Redis缓存在thinkPHP/fastAdmin框架中的应用 引言 在现代Web开发中,性能优化是一个永恒的话题。随着用户数量的增加和业务逻辑的复杂化,如何提高应用的响应速度和处理能力成为了开发者们必须面对的挑战。缓存技术作为提升性能的有效手段之一࿰…...
Ceisum无人机巡检视频投放
公司投标内容有个视频投放的功能动画,原本想实现这么一个效果: 案例效果来自别人的展示作品,Leader一眼就相中了这个效果,可惜别人的终究是别人的,又不会白白给你,终究是要自己动手尝试。 动画方面的展示…...
分享几款开源好用的图片在线编辑,适合做快速应用嵌入
图片生成器是指一种工具或软件,用于自动生成图片或图像内容,通常依据用户设定的参数或模板进行操作。这种工具能够帮助用户快速创建视觉效果丰富的图像,而无需具备专业的设计技能。 在数字化时代,图片编辑已经成为日常工作和生活的…...
闪存学习_1:Flash-Aware Computing from Jihong Kim
闪存学习_1:Flash-Aware Computing from Jihong Kim 前言一、Storage Media:NAND Flash Memory1、概念2、编程和擦除操作3、读操作4、异地更新操作(Out-Place Update)5、数据可靠性6、闪存控制器(SSD主控)7…...
如何将本地项目上传至Gitee仓库(详细教程)
前提条件 1、本地电脑安装Git客户端 2、本地已有项目 3、Gitee注册好了账户 如果没有安装Gitee 可以区菜鸟查看一下安装教程 Git教程https://www.runoob.com/git/git-tutorial.html 操作示例 前提条件已经准备好的情况下登录gitee 码云 https://gitee.com 点解右侧加号 新…...
redis详细教程(3.hash和set类型)
hash Redis中的Hash是一种数据结构,用于存储键值对集合。在Redis中,Hash非常适合表示对象,其中对象的每个字段都对应一个键值对。以下是关于Redis中Hash的详细讲解: 特点: 1. 键值对集合:Hash是一个包含…...
性能测试详解
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点…...
修改ruoyi的logo和标题
1、修改网页标签上的图标和标题 静态修改 标签页上的 图标 直接替换public/favicon.ico文件为你自己的图标文件 如果你的图标文件名不是favicon.ico,你还需要在public/index.html中相应地修改这一行,将/favicon.ico替换为你的图标文件路径。 静态修改…...
vue系列==vue3新语法
vue系列vue3新语法 1、setup组合式API入口函数 2、利用ref函数定义响应式数据 3、利用reactive函数定义响应式数据 1、setup组合式API入口函数 1、Vue3为组合式API提供了一个setup函数,所有组合式API函数都是在此函数中调用的,它是组合式API的使用入口…...
001-Kotlin界面开发之Jetpack Compose Desktop学习路径
Compose Desktop学习之路 学习过程 理解Kotlin的基本语法 Compose Desktop采用Kotlin构建,因此对Kotlin的基本语法有很好的理解是必不可少的。你可以从官方的Kotlin文档开始。 用一句话概括,Kotlin是一种现代的、静态类型的编程语言,它结合…...
qt QStackedLayout详解
QStackedLayout类提供了一种布局方式,使得在同一时间内只有一个子部件(或称为页面)是可见的。这些子部件被维护在一个堆栈中,用户可以通过切换来显示不同的子部件,适合用在需要动态显示不同界面的场景,如向…...
python实现钉钉群机器人消息通知(消息卡片)
直接上代码 python """ 飞书群机器人发送通知 """ import time import urllib3 import datetimeurllib3.disable_warnings()class DingTalkRobotAlert():def __init__(self):self.webhook webhook_urlself.headers {Content-Type: applicatio…...
防火墙技术应用
目录 防火墙安全功能指标防火墙性能指标防火墙部署防火墙应用案例-Linux防火墙防火墙应用案例-华为包过滤防火墙ACL(基本)防火墙应用案例-工控防火墙部署 防火墙安全功能指标 我们防火墙也会提供各种各样的互联接口,它这种接口有以太网、快速以太网、千兆以太网&am…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
