当前位置: 首页 > 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分片和组装的过程

在这里插入图片描述


http://www.mrgr.cn/news/63719.html

相关文章:

  • 技术星河中的璀璨灯塔 —— 青云交的非凡成长之路
  • vscode在cmake config中不知道怎么选一个工具包?select a kit
  • 可编辑31页PPT | 智慧业务中台规划建设与应用总体方案
  • 蓝牙BLE开发——红米手机无法搜索蓝牙设备?
  • 浏览器相关题集
  • React + SpreadJS 开发时常见问题
  • 拓展:C++程序结构
  • 【系统架构设计师】预测试卷一:论文(包括4篇论文主题对应的写作要点分析)
  • 基于Python爬虫与文本挖掘的网络舆情监控系统【附源码】
  • Java项目实战II基于Java+Spring Boot+MySQL的植物健康系统(开发文档+数据库+源码)
  • 数字IC后端实现之Innovus Place跑完density爆涨案例分析
  • std::bind 的用法
  • 车载总线系列 --- CAN FD简介
  • scrapy爬取名人名言
  • 动态添加的元素点击事件无效
  • sklearn 实现随机森林分类器 - python 实现
  • CSP-S 2023 提高级 第一轮试题(初赛)答案及解析
  • 因为Flock,Flutter又凉一次
  • 《双指针篇》---双指针算法原理
  • SpringMvc day1101
  • L2.【LeetCode笔记】反转链表
  • vue3项目编码时相对合理的顺序推荐仅个人记录备用
  • elementplus组件库el-menu组件中的default-active属性使用
  • Mac “屏幕保护程序启动或显示器关闭后需要密码“无效
  • AIGC生成式人工智能——泼天的富贵(三)
  • 飞机布雷盖航程公式