UDP协议栈之整体架构处理

发布于:2025-03-15 ⋅ 阅读:(13) ⋅ 点赞:(0)

在之前的章节中,笔者就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协议,并在仿真中进行时间同步测验,觉得本文章写的不错,并且对之后的更新内容感兴趣的小伙伴,可以点个关注,不迷路,感谢你的阅读,谢谢!


网站公告

今日签到

点亮在社区的每一天
去签到