万兆以太网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

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链