IP报文分片与重组原理及实现分析

引用:

  1. ppp/net/packet/IPFragment.h
  2. ppp/net/packet/IPFragment.cpp
1. IP分片原理

当IP数据包大小超过MTU(最大传输单元)时,路由器/主机将其分割为多个片段传输,每个片段包含:

  • IP头信息(除分片相关字段外与原始包一致)
  • 分片控制字段
    • 标志位(Flags)
      • MF(More Fragments):表示后续还有分片
      • DF(Don’t Fragment):禁止分片
    • 分片偏移(Fragment Offset):以8字节为单位标识片段位置
原始IP包结构:
+-----------------+-----------------------+
| IP头(20-60字节) |       数据载荷        |
+-----------------+-----------------------+分片后:
分片1:+-----------------+---------+ (MF=1, Offset=0)
分片2:+-----------------+---------+ (MF=1, Offset=N)
...
分片N:+-----------------+---------+ (MF=0, Offset=M)
2. 关键类关系图
使用
封装
封装
IPFragment
-SubpackageTable:分片缓存
+Input()
+Output()
+Update()
IPFrame
+ToArray()
+Parse()
+Subpackages()
IcmpFrame
+ToIp()
+Parse()
UdpFrame
+ToIp()
+Parse()
3. 分片生成流程(Output)
AppIPFragmentIPFrameNetwork调用Output(原始IP包)调用Subpackages()计算分片数量创建新分片对象设置MF/Offset返回分片列表loop[每个分片]序列化分片发送分片AppIPFragmentIPFrameNetwork
4. 分片重组流程(Input)
MF=1 或 Offset>0
收到IP分片
分片检查
生成分片Key
查找/创建Subpackage
按Offset排序插入
是否连续且完整
重组数据包
等待更多分片
触发重组事件
更新超时时间
5. 关键数据结构

分片缓存表(SubpackageTable):

struct Subpackage {UInt64 FinalizeTime;  // 超时时间戳vector<IPFramePtr> Frames;  // 有序分片列表
};unordered_map<Int128, Subpackage::Ptr> IPV4_SUBPACKAGES_;

分片Key生成算法:

Int128 key = (Int128)Source | (Destination << 32) | (Id << 64);
6. 分片重组验证逻辑
bool fullFragementOffset = true;
int nextOffset = 0;for (分片 in 有序列表) {if (分片.Offset != nextOffset) { fullFragementOffset = false;break;}nextOffset += 分片.Payload长度;
}if (fullFragementOffset && 末片.MF==0) {// 执行重组
}
7. 分片超时管理
0510152025303540分片到达 定时扫描 等待重组 定时扫描 超时清除 定时扫描 分片生命周期清理任务分片超时管理
8. 分片/重组性能优化
  1. 内存管理

    • 使用BufferswapAllocator减少内存碎片
    • 分片数据共享原始缓冲区(wrap_shared_pointer)
  2. 算法优化

    • 分片插入使用二分查找(O(log n))
    • 重组检查使用增量偏移计算
  3. 安全防护

    • 分片超时强制清理(默认1秒)
    • 分片偏移范围校验
9. 协议处理差异
协议封装方式校验机制
ICMP直接封装在IP载荷中标准IP校验和
UDP伪头部参与校验和计算包含源/目的IP的校验和
TCP(未展示) 需要序列号重组复杂流重组逻辑
10. 关键代码实现

分片生成核心逻辑:

int IPFrame::Subpackages(vector<IPFramePtr>& out, const IPFramePtr& packet) {while (剩余数据 > MTU) {auto fragment = make_shared<IPFrame>();fragment->Flags = IPFlags::IP_MF;  // 设置MF标志fragment->SetFragmentOffset(current_offset);// ... 数据切割 ...out.push_back(fragment);}// 处理最后分片(清除MF标志)
}

重组缓冲区构建:

MemoryStream ms(buffer, total_size);
for (auto& frame : subpackage->Frames) {ms.Write(frame->Payload->Buffer, frame->Payload->Length);
}
总结

该实现完整覆盖了IP分片/重组核心功能:

  1. 分片生成:按MTU切割数据,动态设置MF/Offset
  2. 分片重组:基于五元组Key缓存,有序验证连续性
  3. 资源管理:智能指针自动释放+超时清理
  4. 协议支持:统一处理ICMP/UDP等上层协议

改进建议:

  • 增加分片重叠处理(RFC815)
  • 实现分片攻击防护(如偏移量验证)
  • 支持IPv6分片扩展头

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

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

相关文章

[python]在drf中使用drf_spectacular

安装drf_spectacular 文档 pypi链接:https://pypi.org/project/drf-spectacular/ 文档链接:https://drf-spectacular.readthedocs.io/en/latest/readme.html 安装步骤 在环境中添加 pip install drf-spectacular在setting的INSTALLED_APPS中添加 INSTALLED_APPS [# ALL…

【Datawhale AI 夏令营】 用AI做带货视频评论分析(二)

5.预训练模型跑分 回顾赛题 回顾赛题任务 挑战与难点&#xff1a; 标注数据少 ——> 半监督学习 or 数据增强 聚类分析噪点影响严重 回顾Baseline 问题&#xff1a; TF-IDF无法捕捉以下语义。聚类分析粗糙&#xff0c;未评估聚类质量。 提升方案&#xff1a; 分类任务…

SPSSPRO:数据分析市场SaaS挑战者的战略分析

目录 第一部分&#xff1a;执行摘要 第二部分&#xff1a;平台解构&#xff1a;产品、架构与用户体验 2.1 SaaS范式转移&#xff1a;架构与起源 2.2 功能能力&#xff1a;分析师的工具箱 2.3 “智能分析”的价值主张 第三部分&#xff1a;市场渗透与受众细分 3.1 目标用户…

低版本hive(1.2.1)UDF实现清除历史分区数据

目标&#xff1a;通过UDF实现对表历史数据清除 入参&#xff1a;表名、保留天数N 一、pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.…

C++中顶层const与底层const

在C中&#xff0c;const关键字用于定义常量&#xff0c;但它在指针和引用上下文中会产生两种不同的常量性&#xff1a;顶层const&#xff08;top-level const&#xff09;和底层const&#xff08;low-level const&#xff09;。理解它们的区别是避免编译错误和提高代码质量的关…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI指数生态质量评价

集成云端、桌面端等环境&#xff0c;结合遥感云计算、GIS空间分析&#xff0c;R语言统计分析的优势&#xff0c;以分析生态环境脆弱性的时空演变为主线。通过本课程的学习&#xff0c;您将掌握&#xff1a;第一&#xff0c;收集各类指标数据&#xff0c;构建的“生态压力度-生态…

算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题

在计算机科学和数学领域&#xff0c;蒙特卡洛算法&#xff08;Monte Carlo Algorithm&#xff09;以其独特的随机抽样思想&#xff0c;成为解决复杂问题的有力工具。从圆周率的计算到金融风险评估&#xff0c;从物理模拟到人工智能&#xff0c;蒙特卡洛算法都发挥着不可替代的作…

Tortoise 设置

如何关闭 Windows 下 TortoiseGit 任务栏里窗口标题的分支显示 一、引言 TortoiseGit 是一个专为团队协作设计的 Git 图形化客户端&#xff0c;旨在解决版本控制中常见的问题&#xff0c;如冲突、回滚、历史查看等。本文档是 TortoiseGit 的使用手册前言部分&#xff0c;旨在向…

[论文阅读] 人工智能 + 软件工程 | AI助力软件可解释性:从用户评论到自动生成需求与解释

AI助力软件可解释性&#xff1a;从用户评论到自动生成需求与解释 Automatic Generation of Explainability Requirements and Software Explanations From User ReviewsarXiv:2507.07344 Automatic Generation of Explainability Requirements and Software Explanations From …

C语言---自定义类型(上)(结构体类型)

结构体结构体的定义与声明结构体其实和数组一样&#xff0c;都是一些值的集合&#xff0c;只不过数组是一系类相同类型的值&#xff0c;而结构体里边的成员可以是不同的数据类型。关于它的声明&#xff0c;所用到的关键字是struct。声明的语法如下&#xff1a;struct 结构体名{…

Java观察者模式实现方式与测试方法

一、实现方式 自定义实现 通过手动定义Subject和Observer接口&#xff0c;实现一对多依赖关系&#xff1a; // 观察者接口 public interface Observer {void update(float temp, float humidity, float pressure); } // 主题接口 public interface Subject {void registerObser…

leetGPU解题笔记(1)

1.题面 题目要求 向量加法 实现一个程序&#xff0c;在GPU上对两个包含32位浮点数的向量执行逐元素加法。该程序应接受两个长度相等的输入向量&#xff0c;并生成一个包含它们和的输出向量。 实现要求 禁止使用外部库 solve函数签名必须保持不变 最终结果必须存储在向量C中 示例…

5. JVM 的方法区

1. JVM介绍和运行流程-CSDN博客 2. 什么是程序计数器-CSDN博客 3. java 堆和 JVM 内存结构-CSDN博客 4. 虚拟机栈-CSDN博客 5. JVM 的方法区-CSDN博客 6. JVM直接内存-CSDN博客 7. JVM类加载器与双亲委派模型-CSDN博客 8. JVM类装载的执行过程-CSDN博客 9. JVM垃圾回收…

网络安全的基本练习

一.docker搭建 1.安装dockerapt-get install docker.io docker-compose2.编写配置文件&#xff08;注意路径正确&#xff09;vim /etc/systemd/system/docker.service.d/http-proxy.conf[Service] Environment"HTTP_PROXYhttp://科学上网访问的ip:端口" Environment&…

380. O(1) 时间插入、删除和获取随机元素

实现RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象 bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#xff0c;返回 false 。 bool remove(int val) 当元素 val 存在时&#xff…

【LeetCode Hot100 | 每日刷题】字母异位词分组

题目链接&#xff1a;49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 示例 1: 输入: strs ["eat", "tea", "tan"…

docker 安装windows

目录 下载地址&#xff1a; 使用教程&#xff1a; docker compose 查看版本 测试启动 hello-world 报错1 The system cannot find the file specified&#xff1a; 检查 Docker Desktop 是否运行中 报错2HF_ENDPOINT 1. 临时解决方案&#xff08;当前终端会话有效&…

docker compose 和build

目录 docker compose 和build 的区别是什么&#xff1f; 核心差别&#xff1a; 1. docker build --platform linux/amd64 -f Dockerfile -t infiniflow/ragflow:nightly_lbg . 2. docker compose -f docker-compose-gpu.yml up -d 二者如何配合&#xff1f; 总结 docker …

裂变时刻:全球关税重构下的券商交易系统跃迁路线图(2025-2027)

——基于RWA清算、量子加密与实时非线性风控的下一代跨境基础设施核心事件锚定&#xff1a;特朗普于7月7日对14国启动分级关税制裁&#xff08;日韩25%、东南亚30%-40%、金砖关联国10%附加税&#xff09;&#xff0c;引发日元兑美元暴跌至144.47、铜价单日跳涨3.2%、散户单日交…

python爬虫初入门——基本库和写入方法

1.准备环境 python环境&#xff1a;3.10 2.常用库 1.请求库&#xff1a;实现 HTTP 请求操作 requests&#xff1a;基于 urllib 编写的&#xff0c;阻塞式 HTTP 请求库&#xff0c;发出一个请求&#xff0c;一直等待服务器响应后&#xff0c;程序才能进行下一步处理。seleni…