万兆以太网MAC设计(10)UDP协议解析以及模块设计

前言:UDP报文格式

参考:https://sunyunqiang.com/blog/udp_protocol/
UDP (User Datagram Protocol) 是常用的传输层协议之一, 它向应用层提供无连接, 不可靠, 尽最大努力交付 (best-effort) 的服务, 相对于 TCP, UDP 没有复杂的保证可靠传输的机制, 因此它的传输效率比 TCP 高很多, 对于时延敏感的场景可以使用 UDP 作为传输层协议, 由应用层来施加一定的控制机制保证可靠传输, 由于历史原因, TCP 设计的很复杂, 这几年来已经有很多基于 UDP 实现的可靠传输, 例如 KCP / Google QUIC 等, 它们既保证了可靠传输, 又相比于 TCP 拥有更好的性能, 目前 Google 已经有大量服务开始使用 QUIC over UDP, QUIC 也正处于草案阶段, 在不久的未来将成为互联网的正式标准, 本文讨论 UDP 协议的设计

UDP 是无连接的传输层协议, 通信双方使用 UDP 进行通信时无需事先建立连接, 它的面向 Packet 的协议, 与此相对的 TCP 是有连接, 面向字节流的协议, UDP 的 PDU 结构如下所示:
在这里插入图片描述
从图中可以看过, UDP 的结构非常简单, UDP 的标准文档为 RFC 768, 这份文档只有 3 页, 从 RFC 文档的页数也反映出这是一个设计非常简单的协议, 简单的好处在于它没有过多的控制机制, 因而有很好的传输效率, UDP 的各字段语义如下:

Source Port, 长度为 16 比特, 源端口号

Destination Port, 长度为 16 比特, 目的端口号

Length, 长度为 16 比特, 以字节为单位的 UDP Packet 的长度, 其最小值为 8, 此时仅有 Header

Checksum, 长度为 16 比特, Packet 的校验和, UDP 的校验和计算需要引入伪首部 (Pseudo Header), 伪首部的结构如下所示:
在这里插入图片描述

source address, 长度为 32 比特, 源 IP 地址

destination address, 长度为 32 比特, 目的 IP 地址

zero, 长度为 8 比特, 全部置为 0

protocol, 长度为 8 比特, UDP 协议的协议编号, 值为 17, 协议编号由 IANA 维护

UDP length, 长度为 16 比特, UDP 长度

UDP 计算校验和时需要将伪首部和真正的 UDP Packet 共同放在一起计算, 以 16 位字为分组按二进制反码运算计算校验和, 接收方在收到 UDP Packet 之后按相同的方式计算并比对校验和是否正确.

UDP 协议没有拥塞控制, 即使在网络环境不佳的时候也可以仍然保持恒定的速率发包, 相对于 TCP 的丢包退让, 大量使用 UDP 将会导致网络环境恶化, 因此部分 ISP 在网络负载比较高的时候会优先丢弃 UDP 包.

一、UDP模块设计

由于暂时并没有添加巨帧处理逻辑,所以现有逻辑非常简单,只是按照协议进行组包和数据包解析的功能,巨帧处理逻辑后续更新。

模块接口信号如下,向上对接用户数据,向下对接IP层。

module UDP_module#(
    parameter       P_SRC_UDP_PORT  = 16'h0808,
    parameter       P_DST_UDP_PORT  = 16'h0808
)(
    input           i_clk               ,
    input           i_rst               ,
    input  [15:0]   i_dymanic_src_port  ,
    input           i_dymanic_src_valid ,
    input  [15:0]   i_dymanic_dst_port  ,
    input           i_dymanic_dst_valid ,
    /****next layer data****/
    output [63:0]   m_axis_ip_data      ,
    output [55:0]   m_axis_ip_user      ,//用户自定义{16'dlen,3'bflag,8'dtype,13'doffset,16'dID}
    output [7 :0]   m_axis_ip_keep      ,
    output          m_axis_ip_last      ,
    output          m_axis_ip_valid     ,
    input           m_axis_ip_ready     ,

    input  [63:0]   s_axis_ip_data      ,
    input  [55:0]   s_axis_ip_user      ,
    input  [7 :0]   s_axis_ip_keep      ,
    input           s_axis_ip_last      ,
    input           s_axis_ip_valid     ,

    /****user data****/
    output [63:0]   m_axis_user_data    ,
    output [31:0]   m_axis_user_user    ,
    output [7 :0]   m_axis_user_keep    ,
    output          m_axis_user_last    ,
    output          m_axis_user_valid   ,

    input  [63:0]   s_axis_user_data    ,
    input  [31:0]   s_axis_user_user    ,
    input  [7 :0]   s_axis_user_keep    ,
    input           s_axis_user_last    ,
    input           s_axis_user_valid   ,
    output          s_axis_user_ready   
);

二、仿真

UDP_TX组包过程:
在这里插入图片描述
UDP_RX接收数据:对比发送数据一致。
在这里插入图片描述

总结:

完整工程参考:https://github.com/shun6-6/Ten_gig_eth_design

  • 31
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
万兆UDP协议(Gigabit UDP Protocol)是一种在高速网络通信中使用的协议。这种协议基于UDP(用户数据报协议),可以实现高速、可靠且低延迟的数据传输。而Verilog是一种硬件描述语言,适用于FPGA(现场可编程门阵列)的设计开发。 在使用万兆UDP协议进行通信时,我们可以利用Verilog语言编写FPGA的逻辑电路,实现万兆UDP协议的功能。通过Verilog代码,我们可以描述FPGA中各个模块的状态和行为,从而实现数据的收发、校验和错误处理等功能。 在实现万兆UDP协议FPGA设计中,我们需要考虑以下几个方面: 1. 数据帧处理:通过Verilog代码实现数据帧的解析和封装,包括MAC地址的识别、IP地址的提取、端口号的识别等。 2. 数据交换:通过Verilog代码实现数据的接收和发送,包括从网络中接收数据帧并将其传输给合适的模块进行处理,以及将处理后的数据帧发送到网络中。 3. 错误检测和纠正:通过Verilog代码实现校验和的计算和检查,以及对错误数据的处理,如丢弃或重新发送。 4. 数据缓存和流控制:通过Verilog代码实现数据的暂存和流控制,以保证数据的稳定传输。 总之,通过使用Verilog语言编写FPGA的逻辑电路,结合万兆UDP协议,我们可以实现高速、可靠且低延迟的数据传输。这种设计网络通信、数据中心和高性能计算等领域具有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顺子学不会FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值