IP层之分片包的整合处理

前言

在上一章节中,笔者就IP层的接收代码逻辑做了简单介绍,并对实现代码进行了逻辑梳理以及仿真测试,并且在上一章节中,就IP层的分片包问题,如何确定分片包是否存在已经进行了简单介绍,并在接收模块中,将分片信息进行了输出,因为在设计中,只会对IP报文中包含的数据包中UDP报文和ICMP报文,并且ICMP的报文大小不会产生分包情况,所以可知在判断出当前的IP报文中数据包为UDP数据包后,将UDP数据包输入至IP分片处理模块,进行相应处理

IP分片信息详细介绍

  • 标志字段
    标志字段是IP头部的一部分,用于控制分片的行为。标志字段由3个位组成:
    在这里插入图片描述
  • 片偏移字段
    片偏移字段指示当前分片相对于原始数据包的起始位置。单位是8字节(即64位)。例如,片偏移值为1时,意味着当前分片从原始数据包的第8字节开始。该字段占13位,因此片偏移最大值为 2^13 - 1 = 8191,即偏移量最大可以达到 8191 * 8 = 65528 字节。
  • 计算分片的起始位置
    对于每个分片,通过标志字段和片偏移字段来计算该分片在原始数据包中的位置和大小。每个分片的大小是根据MTU和IP头部的大小来决定的。假设MTU为1500字节(通常是Ethernet的最大传输单元,不包含MAC字段,即IP报文的最大字段),则每个分片的最大数据部分大小为:
    每个分片的数据部分最大大小=MTU−IP头部大小=1500−20=1480字节。在实际分片过程中,IP层会根据每个分片的数据部分长度(通常是8的倍数)来计算片偏移和标志。每个分片除了最后一个,都会设置MF(More Fragments)标志。
  • 示例计算
    假设我们有一个原始的IP数据包,其总大小为4000字节(包括IP头部),MTU为1500字节。IP头部大小为20字节。因此,每个分片的最大有效载荷为1480字节(MTU - IP头部大小)
    第一个分片:
    数据部分大小:1480字节
    片偏移:0
    MF标志:1(表示还有更多分片)
    第二个分片:
    数据部分大小:1480字节
    片偏移:1480 / 8 = 185
    MF标志:1(表示还有更多分片)
    第三个分片:
    数据部分大小:1480字节
    片偏移:2960 / 8 = 370
    MF标志:1(表示还有更多分片)
    第四个分片:
    数据部分大小:60字节
    片偏移:4440 / 8 = 555
    MF标志:0(表示这是最后一个分片)
  • 注意事项
    笔者以IP报文中包含UDP数据包为例,在上面的四个分片中,可以计算出,IP报文去除IP头部的大小后,总共包含3920字节,注意,这3920字节为1个UDP数据包,所以UDP首部只在第一个分片存在,在其他分片不存在,故在存在巨型帧传输的情况下,必需对分片包是否存在做检测,否则会因为数据包缺失UDP首部,而对数据包错误的丢弃或是获取。

代码逻辑梳理

  • MF位起始检测
    ip报文分片处理模块,其输入接口包含UDP报文包,以及MF标志,分片大小等信息,在检测UDP报文包到来时,在有效信号的高电平指示下,检测MF标志是否为高,当MF标志位为高时,将当前的数据包存入RAM中,第一次检测电平为高时,写入RAM的起始地址为0,假设第二个以及之后的分片包到来,在上次的RAM地址中进行自加即可。而若MF标志位为低,且在这之前的一个包中,MF标志也为低,则表示这是一个单帧数据包,直接将UDP报文输出即可。只需做相应的延迟处理。

  • MF位结束检测
    在检测到MF为高时,需要设置一个变量,表示要进行分片包的接收,设定这个变量为r_fragment_start,注意MF变量在整个数据包有效周期内,都保持高电平或是低电平。当检测到
    r_fragment_start为高的情况下,且本包数据包MF标志位为低电平。且在本包数据包最后一个字节接收状态下,再进行r_fragment_start的拉低。

  • 分片包的RAM写入以及读出
    因为分片包必然是不连续的,所以写入RAM的条件应该是r_fragment_start为高电平,且报文valid信号为高时,进行RAM的写入,并且在每次数据包到来时,在有效信号的上升沿都要进行报文长度的累加,报文总长的清零设置在输出UDP报文的last电平为高时,保证分片数据包总长度的正确。何时进行RAM的读出,当检测到r_fragment_start的下降沿,表示分片包写入完成,之后便可以进行读取,读取的地址从0开始,当读取的RAM地址到达数据包总长时,表示读取完毕,这里的RAM读取还有一个小坑,在仿真测试时,进行说明

仿真测试

  • 仿真测试1:直接输入给分片处理模块,三帧数据包,长度都为40字节,前两帧分片标志位为001,第三帧为010。仿真测试,模块能否对三帧数据包进行整合然后输出,写入数据为自增数据。
    写入共120字节,三次写入,一次读取,数据为0~119,观察输出数据的最后一个字节,经验证,仿真测试通过
    在这里插入图片描述
    在这里插入图片描述
  • 仿真测试2,数据包输入给IP层接收模块,经IP层处理后,传输给分片处理模块,两帧数据包,每帧长度为1500字节,包含IP首部。第一帧分片标志位001,第二帧分片标志为000,数据数据为8为自增数。
    写入共3960字节,两次写入,一次读取,观察输出数据的最后一个字节,且输出的UDP报文长度也为3960字节,经验证,仿真测试通过。在这里插入图片描述
    在这里插入图片描述

BUG调试

对于该模块的BUG调试,大多需要通过仿真来进行测试,主要是调整输出有效信号的使能位置,以及需要注意RAM的初始写入因从0开始,而非1,读取同样如此,注意时序逻辑的性质。
其中一个关键问题是,本次RAM的输出端口,存在数据寄存器,其主要是为了保证时序的稳定,这也导致了RAM的输出延迟为2,在进行仿真测试时,注意到一个问题,

在这里插入图片描述
如果BRAM的读取使能在107地址之后立刻关闭,则会导致数据106输出持续两个时钟周期,再输出107,给输出UDP报文的完整性造成影响,经过调试,发现,只要读取使能到108地址后,再进行使能关闭,106和107数据就会正常输出,注意0~107地址,存储108个数据,即0-107,图中的是传输了3次长度为36字节的数据包,所以最后一个数据为107.
调整代码逻辑后,仿真如下
在这里插入图片描述

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

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

相关文章

使用jupyter notebook没有正常打开浏览器的几种情况解决

迅速记录前期 1.下载 https://www.anaconda.com/products/individual 2.安装 直接默认安装就行 3.打开jupyter notebook 在开始菜单里面可以找到 4.遇到的问题解决 1.运行jupyter notebook,黑窗口自动关了 每次黑窗口迅速的加载完就自己关掉了 也没有打开新…

50.【8】BUUCTF WEB HardSql

进入靶场 随便输输 上order by ????????,被过滤了,继续找其他也被过滤的关键字 #,-- -,-- 都不行,尝试其他特殊字符后发现and,union,select,空格,都被过滤了 如下 我就不知…

中国石油大学(华东)自动评教工具(涵盖爬虫的基础知识,适合练手)

我开发了一个用于自动评教的工具,大家可以试着用用,下面是链接。 https://github.com/restrain11/auto_teachingEvaluate 可以点个星吗,感谢!🫡 以下是我在开发过程中学到的知识 以及 碰到的部分问题 目录 动态爬虫和静…

深入云电脑PC Farm技术探讨,以阿里云、华为云、ToDesk为例

🌝引言 近年来,云计算技术的飞速发展为各行各业的数字化转型带来了全新机遇,其中云电脑作为一种虚拟化桌面解决方案,逐渐成为个人用户与企业的核心选择。从远程办公、在线教育到高性能计算需求,云电脑通过为用户提供随…

RK3568平台(音频篇)lineout无声调试

一.声音硬件框架 硬件HP_MUTE已强制拉低。 二.设备树配置 es8388_sound: es8388-sound {status = "okay";compatible = "rockchip,multicodecs-card";rockchip,card-name = "rockchip-es8388";hp-det-gpio = <&gpio1 RK_PD2 GPIO_ACT…

docker 部署 MantisBT

1. docker 安装MantisBT docker pull vimagick/mantisbt:latest 2.先运行实例&#xff0c;复制配置文件 docker run -p 8084:80 --name mantisbt -d vimagick/mantisbt:latest 3. 复制所需要配置文件到本地路径 docker cp mantisbt:/var/www/html/config/config_inc.php.…

【Linux】Mysql部署步骤

一、JDK安装配置 在home目录下执行命令&#xff1a;mkdir Jdk 1.将JDK 上传至该文件夹&#xff0c;有些终端工具可以直接上传文件&#xff0c;比如&#xff1a;MobaXterm 可以看到安装包已经上传上来了 2.直接安装 命令&#xff1a;rpm -ivh jdk-8u311-linux-x64.rpm 3.安装成…

静态综合路由实验

实验拓扑 实验要求 1.除R5的环回地址外&#xff0c;整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2.R1-R4每个路由器存在两个环回接口&#xff0c;用于模拟pc网段&#xff1b;地址也在192.168.1.0/24这个网络范围内 3.R1-R4上不能直接编写到达5.5.5.0/24的静态路由…

Unity ShaderGraph中Lit转换成URP的LitShader

ShaderGraph中的LitShader如下&#xff1a; 在顶点和片元着色器暴露出了上图中的几个参数&#xff0c;要转换成URPLitShaderLab,首先要找到这几个参数&#xff0c;打开LitShader&#xff0c;找到第一个Pass&#xff0c;可以看到下图中的顶点和片元的定义函数&#xff0c;还有引…

从漏洞管理到暴露管理:网络安全的新方向

在网络安全的快速发展中&#xff0c;传统的漏洞管理仍然是防御体系的基石。然而&#xff0c;面对日益复杂的威胁和不断增长的漏洞数量&#xff0c;单靠漏洞优先级评分&#xff08;如VPR&#xff09;已经无法满足现代安全需求。暴露管理这一全新的思维模式正在引领企业从被动应对…

中职网络建设与运维ansible服务

ansible服务 填写hosts指定主机范围和控制节点后创建一个脚本&#xff0c;可以利用简化脚本 1. 在linux1上安装系统自带的ansible-core,作为ansible控制节点,linux2-linux7作为ansible的受控节点 Linux1 Linux1-7 Yum install ansible-core -y Vi /etc/ansible/hosts 添加…

YOLOv8从菜鸟到精通(二):YOLOv8数据标注以及模型训练

数据标注 前期准备 先打开Anaconda Navigator&#xff0c;点击Environment&#xff0c;再点击new(new是我下载anaconda的文件夹名称)&#xff0c;然后点击创建 点击绿色按钮&#xff0c;并点击Open Terminal 输入labelimg便可打开它,labelimg是图像标注工具&#xff0c;在上篇…

【WPS】【WORDEXCEL】【VB】实现微软WORD自动更正的效果

1. 代码规范方面 添加 Option Explicit&#xff1a;强制要求显式声明所有变量&#xff0c;这样可以避免因变量名拼写错误等情况而出现难以排查的逻辑错误&#xff0c;提高代码的健壮性。使用 On Error GoTo 进行错误处理&#xff1a;通过设置错误处理机制&#xff0c;当代码执行…

2023-2024 学年 广东省职业院校技能大赛(高职组)“信息安全管理与评估”赛题一

2023-2024 学年 广东省职业院校技能大赛(高职组“信息安全管理与评估”赛题一&#xff09; 模块一:网络平台搭建与设备安全防护第一阶段任务书任务 1&#xff1a;网络平台搭建任务 2&#xff1a;网络安全设备配置与防护DCRS:DCFW:DCWS:DCBC:WAF: 模块二&#xff1a;网络安全事件…

【Flink系列】9. Flink容错机制

9. 容错机制 在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 9.1 检查点&#xff08;Checkpoint&#xff09; 9.1.1 检查点的保存 1&#xff09;周期性的触发保存 “随时存档”确实恢复起来方便&#xff0c;可是需要我…

docker一张图理解

1、push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。参数说明&#xff1a; –disable-content-trust : 忽略镜像的校验,默认开启 # 上传本地镜像myapache:v1到镜像仓库中。 docker push myapache:v1 1.2、search 从Docker Hub查找镜像。参数说明&#xff1a; –…

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标 使用FPGA实现AD模块驱动采集模拟电压&#xff0c;通过以太网上传到电脑上位机。 二、框架设计 数据位宽转换模块&#xff08;ad_10bit_to_16bit&#xff09;&#xff1a;为了方便数据传输&#xff0c;数据位宽转换模块实现了将十位的 AD 数据转换成十六位&#…

【进程与线程】进程的状态

在操作系统中&#xff0c;进程是执行中的程序实例。进程在其生命周期中会经历不同的状态&#xff0c;操作系统根据进程的执行情况和资源调度&#xff0c;将进程划分为多个状态。 这些状态帮助操作系统更加高效地管理 CPU 和系统资源。 进程的状态&#xff1a;就绪态&#xff0…

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…

数字人助力企业出海增长,魔珐科技亮相2025晋江跨境电商峰会

近年来&#xff0c;越来越多中国企业纷纷投身于跨境电商行业&#xff0c;推动其规模实现了跨越式的发展。如今&#xff0c;跨境出海仍在加速的过程中&#xff0c;其中蕴涵了巨大的潜力和机遇。 1月3日&#xff0c;“跨境新域 聚势发展——2025晋江跨境电商年度发展峰会暨晋江市…