UDP协议栈之整体架构处理

devtools/2025/3/17 1:37:55/

在之前的章节中,笔者就UDP、ICMP、IP、ARP、MAC层的报文格式,以及组帧解帧、CRC校验、分片处理等操作进行了具体介绍以及详细代码实现,并且通过了仿真测试。但之前的仿真测试都是对单层报文的组帧解帧进行的,这些模块仍处于“孤立”状态,缺乏协同工作的能力。在本章节中,笔者将上述实现的各个模块,进行总线互联,实现一个UDP协议栈的整体架构,用户通过顶层接口,可以实现数据的发送、接收、ARP请求包、IP、MAC、PORT设置等关键操作。架构文字示意如下,其中PHY层物理接口,在之后的还章节会进行介绍
±--------------------+
| 用户接口层 | ← 配置MAC/IP/端口,发送/接收数据
±--------------------+
| UDP传输层 | ← 封装/解封装UDP头,端口校验
±--------------------+
| IP网络层 | ← IP头处理、分片与重组、ICMP响应
±--------------------+
| ARP & MAC链路层 | ← ARP表维护、MAC帧组帧/解帧、CRC校验
±--------------------+
| 物理接口(PHY) | ← RMII/GMII等硬件接口
±--------------------+
流程示意框图如下所示
在这里插入图片描述
接下来进行代码的整体组合,最终用户可操作的接口如下所示

	/*MAC IP PORTp配置*/input   [31:0]      i_port_info     ,input               i_port_valid    ,input   [63:0]      i_ip_info       ,input               i_ip_valid      ,input   [79:0]      i_macip_info    ,input               i_info_valid    ,input   [47:0]      i_mac_sinfo     ,input               i_mac_svalid    ,/*ARP请求包配置*/input   [15:0]      i_op_code       ,input               i_op_valid      ,input   [31:0]      i_request_ip    ,input               i_request_valid ,/*输入数据总线*/input   [15:0]      i_user_len      ,input   [7 :0]      i_user_data     ,input               i_user_valid    ,input               i_user_last     ,output              o_trans_ready   ,/*输出接收数据总线*/output  [15:0]      o_user_len      ,output  [7 :0]      o_user_data     ,output              o_user_valid    ,output              o_user_last     ,

接下来进行代码仿真测试
仿真测试条件如下,两个UDP相互发送指令

  • 首先,两台UDP协议栈向对方发送ARP请求包,请求MAC地址
  • 之后,两台UDP协议栈向对方发送数据,单包1024字节,发送三帧
  • 观察交互信息流
    标号为1的UDP协议栈,信息如下
    MAC地址:8’h11,8’h22,8’h33,8’h44,8’h55,8’h66
    IP地址:192.168.1.10
    PORT:16‘h8080
    标号为2的UDP协议栈,信息如下
    MAC地址:8’ha5,8’hd5,8’hff,8’hff,8’hff,8’he5
    IP地址:192.168.1.20
    PORT:16‘h8081
    首先观察ARP测试
    观察第一副图,ARP_T接收到用户的ARP请求操作码一级请求IP地址,并进行了ARP报文的输出。
    接口功能如下
	/*ARP操作码及请求IP地址*/input   [15:0]      i_op_code       ,input               i_op_valid      ,input   [31:0]      i_request_ip    ,input               i_request_valid ,/*输出给MAC层的报文端口*/output  [15:0]      o_mac_len       ,output  [7 :0]      o_mac_data      ,output              o_mac_valid     ,output              o_mac_last       

在这里插入图片描述
接下来观察ARP_RX模块仿真图,是否接收到UDP站点2的ARP响应。

在这里插入图片描述
观察红框中的有效数据,c0a80114其IP地址即为192.168.1.20,而mac地址为8’ha5,8’hd5,8’hff,8’hff,8’hff,8’he5,检验出,站点2接收到站点1的ARP请求,正确进行了ARP响应,站点1成功收到MAC地址。

接下来观察ARP_LIST模块仿真图,当输入进缓存的IP、MAC地址,是否进行了正确的地址查询,确定不存在后进行缓存

在这里插入图片描述
可以观察图中红框处的RAM使能读写以及数据地址控制信号,由于协议栈运行初始,RAM中不会缓存MAC、IP信息,所以有效搜索范围只有地址0,当检测到当前MAC、IP在ARP缓存表中不存在后,将该MAC、IP信息进行缓存。
可以看出ARP_LISRT模块正常进行了工作

接下来查看单包信息的传递情况,需知道MAC层使用的目的AMC地址,是在ARP缓存表中进行读取的,在数据报文到达IP层时,向ARP缓存表进行读取,寻找目的IP的MAC地址是否存在于ARP缓存表中,将寻找到的MAC地址发送给MAC层,所以在仿真中进行检验,是否使用了正确的MAC地址

观察下图,为ARP_LIST接收到搜寻IP对应MAC地址命令,并进行响应的时序波形

在这里插入图片描述
观察红框处,可以看出ARP缓存表正确输出了MAC地址

观察下图,为MAC层的发送仿真图

在这里插入图片描述
观察红框处,可以看出MAC_TX正确接收到MAC地址,并在发送报文时,进行了使用。

关于各层之间的处理,因为之前在各个章节已经仿真过,便不再赘述,直接观察UDP_RX的输出,是否正确接收到1024字节的数据包即可,UDP_RX的输出如下图所示

在这里插入图片描述
可以看出,UDP_RX正确输出三帧1024的字节包。

至此,UDP协议栈的仿真告一段落,本章节中涉及到的许多知识,在之前的章节都有讲述,对哪部分有疑问的小伙伴可以查找对应章节,进行学习。接下来,笔者将其应用层协议进行讲解,初步打算是讲解IEEE1588V2协议,并在仿真中进行时间同步测验,觉得本文章写的不错,并且对之后的更新内容感兴趣的小伙伴,可以点个关注,不迷路,感谢你的阅读,谢谢!


http://www.ppmy.cn/devtools/167702.html

相关文章

SVT-AV1源码分析函数 svt_av1_cost_coeffs_txb

一 函数作用说明 svt_av1_cost_coeffs_txb 用于计算变换块(Transform Block, TXB)中量化系数的码率失真成本(Rate - Distortion Cost). 该函数在视频编码 如AV1 的模式决策,阶段被调用,目的是评估当前变换块编码的比特率和失真的权衡,从而选择…

starrocks批量启停脚本

#!/bin/bash # 定义 StarRocks 安装目录 STARROCKS_HOME"/path/to/starrocks" # 定义 FE 和 BE 节点列表 FE_NODES("fe_node1_ip" "fe_node2_ip" "fe_node3_ip") BE_NODES("be_node1_ip" "be_node2_ip" "be_…

[023-01-40].第40节:组件应用 - OpenFeign与 Sentinel 集成实现fallback服务降级

SpringCloud学习大纲 一、需求说明: 需求1:通过fallback属性进行统一配置 a.问题分析: 1.需要实现cloudalibaba-consumer-nacos-order83模块通过OpenFeign调用cloudalibaba-provider-payment9001 83服务通过OpenFeign调用 9001微服务&…

玩转github

me github 可以给仓库添加开发人员吗 4o 是的,GitHub允许仓库管理员为仓库添加开发人员,并设置这些开发人员的角色和权限。这里是一个简单的步骤指导,教你如何给一个 GitHub 仓库添加开发人员: 前提条件 你必须有这个仓库的权限&…

DICOM开发者常用DICOM开源库详解

DICOM开发工具与开源库,涵盖C++、C#、Python、Java、JavaScript等多种编程语言。这些库在功能、性能和社区支持方面各有优势,开发者可根据项目需求选择合适的工具。 DICOM开发工具与开源库详解 一、C++库 1. DCMTK(DICOM Toolkit) </

LinkedList底层结构和源码分析(JDK1.8)

参考视频&#xff1a;韩顺平Java集合 特点 LinkedList 底层实现了 双向链表 和 双端队列 的特点。可以添加任意元素&#xff08;元素可以重复&#xff09;&#xff0c;包括 null。线程不安全&#xff0c;没有实现同步。 LinkedList 底层结构 LinkedList 底层维护了一个双向链…

maven笔记

maven介绍和作用 Maven 是一款为 Java 项目构建管理、依赖管理的工具&#xff08;软件&#xff09;&#xff0c;使用 Maven 可以自动化构建、测试、打包和发布项目&#xff0c;大大提高了开发效率和质量。 主要作用的理解&#xff1a; 依赖管理&#xff1a; 在编写项目时我…

数学 :矩阵

文章目录 前言1. 基本矩阵运算1.1 矩阵加法1.2 矩阵减法1.3 矩阵乘法 2. 转置矩阵3. 旋转矩阵小结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 前言 在许多应用场合下&#xff0c;我们都需要用矩阵来表示公式&#xff0c;接下来简洁描述矩阵…