文章目录
- 前言:UDP报文格式
- 一、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