当前位置: 首页 > news >正文

网络: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报文,进行了分片。
总结流程如下:

  1. 检查MTU限制,当一个IP数据报的大小超过网络的MTU限制时,就需要进行分片
  2. 分割数据报,IP层将原始IP数据报分割成多个较小的片段;对每个片段,IP层会设置相应的16位标识,3位标志,13位片偏移
  3. 添加IP头部,每个分片都是加上自己的IP头部
  4. 发送分片,分片在传输过程中独立传输,每个分片都有自己的IP报文头部,并且各自独立的选择路由

组装

在这里插入图片描述

现在接收方,收到了从发送方来的三个IP报文。我们站在阅读者的角度,知道这三个IP报文,大概率是上文分好的三个IP分片;可站在接收方的角度,他如何知道这三个IP报文是分片,怎么知道是否把IP分片收完?毕竟想要对IP分片进行组装,那要先识别和收完。


识别IP分片,这个好办。
接收方可以查看IP报文的 3位标志 和 13位片偏移来判断

  • 如果不是分片,MF(0) && 片偏移:0
  • 如果是分片,MF(1) || 片偏移 != 1

接收方怎么保证把分片收全
分片收全不好考虑,但分片丢失只有三种情况,第一片分片丢失,中间分片丢失,最后一片分片丢失。我们只要保证这三种情况没有发生,不就保证了分片收全了。

  1. 第一片分片丢失,我们只需查看这些分片中是否有13位片偏移为0的分片,如果存在,则第一片分片没有丢失;如果不存在,则第一片分片丢失

  2. 中间片丢失,我们只需对这些分片按片偏移量进行排序,在遍历这些分片时,检查 该分片的片偏移量 * 8 + 该分片的有效载荷大小 == 下一片的片偏移量 * 8,如果等于,表示中间没有分片丢失;如果不等于,表示中间有分片丢失。
    在这里插入图片描述

  3. 最后一片分片丢失,我们只需查看这些分片中是否存在MF 为 0的分片即可,如果存在,则最后一片分片没有丢失;如果不存在,则最后一片分片丢失。


至此,接收方可以识别和判断是否收完分片。
总结流程如下:

  1. 接受分片,当目的主机的IP层接受到这些分片后,会根据标识字段将属于同一个数据报的所有分片挑选出来
  2. 排序与组装,IP层会对属于同一个数据报的分片,按照片偏移字段进行升序排序;当所有分片都到达并正确排序后,IP层会将这些分片重新组装成一个完整的IP数据报
  3. 传递给上层协议

总结

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的优越性可能被夸大了。值得注意的是&#xff…...

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开发中,性能优化是一个永恒的话题。随着用户数量的增加和业务逻辑的复杂化,如何提高应用的响应速度和处理能力成为了开发者们必须面对的挑战。缓存技术作为提升性能的有效手段之一&#xff0…...

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…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...