网络: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分片和组装的过程

在这里插入图片描述

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

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

相关文章

Node.js:Express 中间件 CORS 跨域资源共享

Node.js:Express 中间件 & CORS 中间件全局中间件局部中间件分类错误级中间件内置中间件 CORS原理预检请求 中间件 中间件是不直接接收请求,也不直接发送响应,而是在这之间处理一个中间过程的组件。 当一个请求到来,会经过多…

【VScode】中文版ChatGPT编程工具-CodeMoss!教程+示例+快捷键

文章目录 1. 多模型选择2. 编辑快捷键3. 历史记录收藏 CodeMoss使用教程1. 安装CodeMoss插件2. 配置AI模型3. 使用快捷键4. 进行代码优化与解释5. 收藏历史记录 总结与展望 在当今快速发展的编程世界中,开发者们面临着越来越多的挑战。如何提高编程效率,…

LabVIEW适合开发的软件

LabVIEW作为一种图形化编程环境,主要用于测试、测量和控制系统的开发。以下是LabVIEW在不同应用场景中的适用性和优势。 一、测试与测量系统 LabVIEW在测试与测量系统中的应用广泛,是工程测试领域的主流工具之一。利用其强大的数据采集与处理功能&…

命令模式(Command)

1 意图 将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 2 结构 Command 声明执行操作的接口。ConcreteCommand 将一个接收者对象绑定于一个动作;调用接收者相应的操作&#xff0c…

Linux 线程概念

一. 线程的基本概念 线程是进程内的一个执行单元,它是调度和执行的基本单位。 1.1 Linux中的线程 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。 1.2 线程的优点 创建一个新线程的代价要比创建一个新进程小得多。与进…

Qt聊天室项目

目录 项目要求 项目背景 技术分析 架构设计 服务器架构 模块划分 模块之间的交互 客户端架构 模块划分 模块之间交互 项目展示 项目实现 服务器 ui server.pro dialog.h dialog.cpp 客户端 ui cient.pro dialog.h dialog.cpp 打包步骤不做演示 视频演示 项目…

node.js模块化分析

什么是Node.js模块化 Node.js中的模块化‌是指将一个大文件拆分成独立且相互依赖的多个小模块。每个JS文件被视为一个独立的模块,模块之间是互相不可见的。如果一个模块需要使用另一个模块,则需要使用指定的语法来引入该模块,并且只能使用模块…

sql练习专场(一) (1-5)

这是总结的一些sql题目,共25道题,每个博客会写5道题 第一题 这道题需要找出连续活跃3天以上的用户,其中每个用户每天可以连续登录多次。 create table sql1_1(uid string,dt string );insert into sql1_1 values(A,2023-10-01),(A,2023…

自动化立体仓库:详细设计方案

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 这份文件是关于自动化立体仓库设计方案的详细介绍,包括了自动化立体仓库的重要性、特点、设计程序、机械部分设计方案、系统硬件设计、系统软件设计以及系统调试等关键部分…

windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576

问题描述 我目前的环境是: 编辑器: Microsoft Visual Studio Community 2022 (64 位) 运行的脚本是ffmpeg自带的remux样例,只不过我想用c语言执行这个样例。在执行的过程中报错如下图: C4576 后跟初始值设定项列表的带圆括…

CentOS 文件系统扩容与缩容

一、 概述 理解Linux文件系统的管理,需要了解以下的一张图: 一般使用LVM (Logical Volume Manager) 管理磁盘存储,该工具允许用户更灵活地分配和管理存储空间。主要有以下几个概念: PV(Physical Volume,物…

Linux系统使用第三方邮件客户端发送邮件

文章目录 安装第三方邮件客户端(s-nail)S-nail的简单介绍重要的特性差异 配置邮件服务配置文件 (以QQ邮箱为例)获取QQ邮箱授权码获取QQ服务器证书使用 OpenSSL 获取 QQ 邮箱服务器的证书安装OpenSSL连接到 QQ 邮箱的 SMTP 服务器并下载证书保存证书验证证…

家常菜点餐|基于java和小程序的家庭大厨家常菜点餐系统设计与实现(源码+数据库+文档)

家常菜点餐系统 目录 基于java和小程序的家庭大厨家常菜系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&am…

利士策分享,青年暴富难守,因何在?

利士策分享,青年暴富难守,因何在? 在人生的长河中,有些人似乎被命运特别眷顾,在年轻之时便轻易地获得了财富。 然而,令人遗憾的是,这些早年得志、财富易得的人,往往难以长久地守住这份来之不…

Echarts环形图引线设置

直接上图吧 直接上代码吧 let labelArr [直接访问, 邮件营销, 联盟广告, 视频广告, 搜索引擎]; let valueArr [{ value: 335, name: 直接访问 },{ value: 310, name: 邮件营销 },{ value: 234, name: 联盟广告 },{ value: 135, name: 视频广告 },{ value: 154, name: 搜索引…

Java8->Java19的初步探索

导读 最近网上开始了大量的关于Java19的讨论,我也想着用了Java8这么久该接受一点新的东西了,于是便开始研究了起来 Java 19 Java19是一个免费版本。下面是JDK19的支持图 image.png (来源: https://www.bilibili.com/video/BV1V84…

软件设计师-上午题-15 计算机网络(5分)

计算机网络题号一般为66-70题,分值一般为5分。 目录 1 网络设备 1.1 真题 2 协议簇 2.1 真题 3 TCP和UDP 3.1 真题 4 SMTP和POP3 4.1 真题 5 ARP 5.1 真题 6 DHCP 6.1 真题 7 URL 7.1 真题 8 浏览器 8.1 真题 9 IP地址和子网掩码 9.1 真题 10 I…

nodejs批量修改word文档目录样式

工作中遇到一个需求:写个nodejs脚本,对word文档(1000+个)的目录页面进行美化。实现过程遇到不少麻烦,在此分享下。 整体思路 众所周知,Docx格式的Word文档其实是个以xml文件为主的zip压缩包,所以,页面美化整体思路是:先将文档后缀名改为zip并解压到本地,然后将关键的…

MathType在Word中的安装与配置记录

一、记录过程 1.MathType安装包下载 可直接下载本人已经安装过的安装包,亲测可以使用,下载链接如下: 链接:https://pan.baidu.com/s/1g-iOgKIqzSNz0E5rEUryug 提取码:1kb3 2.安装后配置 word中会出现mathtype的选项…

无人机之中继通信技术篇

一、定义与原理 无人机中继通信技术是指通过无人机搭载中继设备,将信号从一个地点传输到另一个地点,从而延长通信距离并保持较好的通信质量。其原理类似于传统的中继通信,即在两个终端站之间设置若干中继站,中继站将前站送来的信号…