IP层之分片包的整合处理---BUG修复

在之前章节中,笔者就IP层之分片包的整合处理进行了概念介绍,以及代码编写和仿真,在整体代码调试环节,笔者发现了一个问题,在本文中,笔者将就这个BUG进行说明,以及进行修复,讲解代码实现思路,验证代码逻辑正确性
在这里插入图片描述
注意看图片中的框选文字,这里说明,如何确定这是一个单帧包,这里的确定单帧包逻辑是不存在问题,但是直接将UDP报文输出是存在问题的,因为即使确定了当前输入进来的数据报文不是分片包,但该报文的的上一帧报文,可能是分片包,而由于分片包要进行巨型帧组合后输出,其报文长度可能为9000字节以上(假设),那么当前帧报文传输来时,巨型帧报文可能尚未传输完成,此时的输出数据总线是被巨型帧报文占用的。而根据输出赋值的优先级,会出现,巨型帧输出不完全,被新一帧数据报文顶替输出,以及当前报文优先级低,无法获得总线使用权,报文丢失,所谓的优先级,即是在一个时序控制逻辑内,else if的上下级,当两个else if语句满足时,总是先执行最上面的else if语句,单纯的文字解释这个问题,可能会给读者的理解造成混乱,笔者接下来就流程示意框图、代码仿真波形两方面展现这类情况,使得读者更加清晰的理解这些逻辑

在这里插入图片描述
上图所示,便是一种情况,在RAM中整合了三包分片数据包之后,进行数据帧输出,此时接连来了两包单包
此时,这两个单包按照之前的逻辑是会顶替当前包输出的,造成数据混乱,代码仿真如下图所示
在这里插入图片描述
在这里插入图片描述
图片一模拟了流程图中的情况,而图片二中则显示了这样的数据流动出现的问题,接下来将就这种现象进行解决方案的思考。
显然,为了避免这种情况,需要判断此时的数据输出总线是否被占用,如果数据输出总线被占用,则应该缓存本帧数据,待到数据输出总线空闲,再进行数据的读取,同时,若是数据到来时,数据输出总线是空闲的,则不需要缓存数据,直接进行输出,减少不必要的时间浪费。
那么还有一个问题,数据输出总线被占用期间,可能有多帧数据到来,都需要被缓存,那么数据长度同样应该被缓存,在本处理模块中不涉及数据类型,因为其下一级在本设计中一定属于UDP报文,所以不考虑数据类型的缓存,当涉及TCP/UDP两种报文时,会就IP_RX模块中的输出信号进行添加,这在之后讲解的TCP协议栈实现中,会进行具体介绍,大家可以点个关注,后续会有更多文章分享。
对于这些单帧数据包,使用FIFO进行数据缓存,使得逻辑处理简单,同时还需要注意一个问题,每次读取指定长度后,还需要暂缓下一帧数据的输出,避免背靠背传输,对数据总线处理的压力。

代码的主要难点是以下几方面

  1. 缓存分片数据包,并在缓存完成后进行输出
  2. 在分片数据包输出过程中,多个单包数据包到来,缓存至FIFO
  3. 在单包数据包输出过程中,再次到来单包数据包(因为分片包导致的数据堆积)缓存至FIFO
  4. 两个单包从FIFO中读出时,输出间隔问题,保证输出间隔大于10个周期,减轻后续处理压力,以及背靠背传输导致数据包输出长度计算错误问题
  5. 评定各种情况优先级,合理规划缓存以及读取
  6. 针对以上难点,应该多进行代码仿真,找出时序存在问题中,进行对应修改,多仿真是写出好代码的关键

整体仿真测试时序:

  1. 首先发送3472字节的巨型帧,分三次发送1480–1480–512
  2. 之后发送512字节单包,多次128字节单包–在巨型帧尚未缓存完毕以及巨型帧尚未输出完成
  3. 之后发送128字节单包–在输出总线输出单包数据时
  4. 最后发送128字节单包-在输出总线空闲时候
initial begin#200/*ip frag*/@(posedge i_udp_clk)ip_frag_send(0,'d1480,1,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d1480,1,185);#400@(posedge i_udp_clk)ip_frag_send('d0,'d512,0,370);#400@(posedge i_udp_clk)ip_frag_send('d0,'d512,0,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#20000@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#20000@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);
end

情况一:对应仿真情况如下,可以看出分片包成功组合,数据长度3472字节,输出时序正确。

在这里插入图片描述
情况二:对应仿真情况如下,可以看出在巨型帧缓存输出完成后,被缓存的单帧数据包成功进行输出。

在这里插入图片描述

情况三:对应仿真情况如下,可以看出在输出单包数据完成后,在单包数据输出期间被缓存的单帧数据包成功进行输出。

在这里插入图片描述
情况四:对应仿真情况如下,可以看出在总线空闲期间到的数据包,被直接输出,不需经过缓存。

在这里插入图片描述
经过上述仿真模拟各种可能出现的情况,经验证后,输出时序正确,不会出现数据错误、覆盖、丢失等现象。
关于本次代码的实现、调试思路。大家有什么问题欢迎在评论区中进行讨论,有哪些考虑不到的地方,也请大家批评指正,可以关注下作者,后续会进行更多技术文章分享。
在下一章节中,笔者会将之前介绍的模块进行整合,组合成最终的UDP协议栈,当然,还不包括PHY层的处理,关于PHY层的处理,笔者也会在之后的章节进行介绍,以及UDP的上层及应用层协议,如IEEE1588,笔者也会进行介绍。

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

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

相关文章

修复Electron项目Insecure Content-Security-Policy(内容安全策略CSP)警告的问题

将以下代码粘贴进html的<header>标签内 <metahttp-equiv"Content-Security-Policy"content"default-src self; style-src self unsafe-inline; img-src self data:; "> 解释一下上面代码中的属性含义 default-src self&#xff1a;配置加载策…

linux 的免密切换用户PAM配置

/etc/pam.d/su是Linux系统中与用户切换&#xff08;su命令&#xff09;相关的PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插拔认证模块&#xff09;配置文件。以下是对它的详细介绍&#xff1a; 简介 作用 PAM是一种用于管理系统认证的机制&#xff0c;…

pyspark 数据处理的三种方式RDD、DataFrame、Spark SQL案例

目录 一、浅语二、三种数据处理方式比较2.1 RDD2.2 DataFrame2.3 Spark SQL 三、三种方法的创建方式3.1 创建RDD3.2 创建DataFrame3.2.1 创建sqlContext3.2.2 定义Schema3.2.3 创建DataFrame 3.3 创建SparkSQL3.3.1 登录临时表3.3.2 使用sparkSQL 四、三种方法显示部分字段4.1 …

文件解析漏洞靶机---- 练习通关攻略

1.安装靶机 点击 hackme.ova 文件&#xff0c;直接导入虚拟机&#xff0c;选择存储位置 2. 开启靶机 3. kali扫描同C段的ip&#xff0c;找到靶机ip nmap 192.168.182.1/24 经判断&#xff0c;靶机ip为&#xff1a;192.168.182.157 开启端口 http 80 、ssh 远程连接 22 4…

信号处理抽取多项滤波的数学推导与仿真

昨天的《信号处理之插值、抽取与多项滤波》&#xff0c;已经介绍了插值抽取的多项滤率&#xff0c;今天详细介绍多项滤波的数学推导&#xff0c;并附上实战仿真代码。 一、数学变换推导 1. 多相分解的核心思想 将FIR滤波器的系数 h ( n ) h(n) h(n)按相位分组&#xff0c;每…

【大模型基础_毛玉仁】2.3 基于 Encoder-only 架构的大语言模型

更多内容&#xff1a;XiaoJ的知识星球 目录 2.3 基于Encoder-only 架构的大语言模型2.3.1 Encoder-only 架构2.3.2 BERT 语言模型1&#xff09;BERT 模型结构2&#xff09;BERT 预训练方式3&#xff09;BERT 下游任务 2.3.3 BERT 衍生语言模型1&#xff09;RoBERTa 语言模型2&a…

AIP-165 按条件删除

编号165原文链接https://google.aip.dev/165状态批准创建日期2019-12-18更新日期2019-12-18 有时API需要提供一种机制&#xff0c;按照一些过滤参数删除大量资源&#xff0c;而非提供待删除的各资源名字。 这是一个稀有的场景&#xff0c;用于用户一次性删除数千或更多资源的…

【Maven教程与实战案例】

文章目录 前言一、Maven是什么&#xff1f;二、Maven的安装与配置1. 安装前置条件2. 下载与配置 Maven3. 验证安装 三、Maven的核心概念1. POM.xml 文件2. 构建生命周期与插件机制 四、实战项目示例1. 项目目录结构2. 编写代码App.javaAppTest.java 3. 构建项目4. 运行项目 前言…

20250310:OpenCV mat对象与base64互转

代码: https://github.com/ReneNyffenegger/cpp-base64 指南:https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/ 实操:

概率论的基本知识

逆概率还不懂&#xff0c;改天再想想。 联合概率 联合概率&#xff08;Joint Probability&#xff09; 是概率论中的一个重要概念&#xff0c;用于描述多个随机变量同时取某些值的概率。联合概率可以帮助我们理解多个变量之间的关系。

pytest数据库测试文章推荐

参考链接&#xff1a; 第一部分&#xff1a;http://alextechrants.blogspot.fi/2013/08/unit-testing-sqlalchemy-apps.html第二部分&#xff1a;http://alextechrants.blogspot.fi/2014/01/unit-testing-sqlalchemy-apps-part-2.html

如何自己做奶茶,从此告别奶茶店

自制大白兔奶茶&#xff0c;奶香与茶香激情碰撞&#xff0c;每一口都是香浓与甜蜜的双重诱惑&#xff0c;好喝到跺脚&#xff01;丝滑口感在舌尖舞动&#xff0c;仿佛味蕾在开派对。 简单几步就能复刻&#xff0c;成本超低&#xff0c;轻松在家享受奶茶自由。 材料:大白兔奶糖&…

SOA(面向服务架构)与微服务架构的区别与联系

SOA&#xff08;面向服务架构&#xff09;与微服务架构的区别与联系 1. 引言 在现代软件架构中&#xff0c;SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务架构&#xff09;和微服务架构&#xff08;Microservices Architecture&#xff09;是两种常见的…

LLM的准确率评估采用什么方式:准确率评估使用的是 `sklearn.metrics` 模块中的 `accuracy_score` 函数

LLM的准确率评估采用什么方式:准确率评估使用的是 sklearn.metrics 模块中的 accuracy_score 函数 评估方式 代码里的准确率评估是基于每个样本最后一个预测的 token 与真实的 token 进行对比。具体来说,它会遍历测试数据集中的每个样本,使用模型预测出最后一个 token 的 …

文件和异常

从文件中读取数据 读取整个文件 读取整个文件 要读取文件&#xff0c;需要一个包含几行文本的文件。下面首先创建一个文件&#xff0c;它包含精确 到小数点后30位的圆周率值&#xff0c;且在小数点后每10位处换行&#xff1a; pi_digits.txt 3.14159265358979323846264338…

2025最新版Windows通过GoLand远程连接Linux构建Go项目保姆级教学

以Ubuntu24.04和GoLand2024.1.6为例子&#xff0c;演示如何在Windows上通过GoLand远程连接Linux进行Go编程。 通过go version指令可以发现当前Ubuntu系统没有安装go。 go version 通过指令安装go&#xff0c;其他系统可以通过wget安装&#xff0c;要指定安装的具体go版本&…

Spring Boot 集成 Lua 脚本:实现高效业务逻辑处理

1. 前言 1.1 什么是Lua Lua是一种轻量级、高性能的脚本语言,常用于游戏开发、嵌入式系统、配置文件解析等领域。Lua语法简洁,易于学习和使用,且具有强大的扩展性。 1.2 Spring Boot与Lua集成的意义 将Lua集成到Spring Boot应用中,可以实现动态配置业务逻辑、简化复杂业…

Linux笔记---文件系统硬件部分

1. 文件系统 文件系统是操作系统用于明确存储设备&#xff08;常见的是磁盘&#xff0c;也有基于NAND Flash的固态硬盘&#xff09;或分区上的文件的方法和数据结构&#xff0c;即在存储设备上组织文件的方法。 1.1 基本组成 索引节点&#xff08;inode&#xff09;&#xff…

12.31[net]review

复用&#xff08;Multiplexing&#xff09;的概念 定义&#xff1a;在传输层&#xff0c;复用是指多个应用进程可以使用同一个传输层协议&#xff08;如 TCP 或 UDP&#xff09;来发送数据。从应用层的角度看&#xff0c;不同的应用进程&#xff08;如网页浏览器、邮件客户端等…

网络安全防护架构有哪些 网络安全防护措施包括

网络安全预防措施 网安措施 计算机网络安全措施主要包括保护网络安全、保护应用服务安全和保护系统安全三个方面&#xff0c;各个方面都要结合考虑安全防护的物理安全、防火墙、信息安全、Web安全、媒体安全等等。 (一)保护网络安全。 网络安全是为保护商务各方网络端系统之…