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

2024-04-29 22:52

本文主要是介绍万兆以太网MAC设计(10)UDP协议解析以及模块设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言: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

这篇关于万兆以太网MAC设计(10)UDP协议解析以及模块设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装