[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-01 以太网协议介绍

news/2024/11/17 7:35:08/文章来源:https://www.cnblogs.com/milianke/p/18351334

软件版本:Anlogic -TD5.9.1-DR1_ES1.1

操作系统:WIN10 64bit

硬件平台:适用安路(Anlogic)FPGA

实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板

板卡获取平台:https://milianke.tmall.com/

登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

 

1 概述

本文介绍了基于XILINX FPGA的米联客UDP协议栈的实现原理、内部逻辑、仿真测试、上板验证。该协议栈具有以下功能:

1)实现了ARP请求和应答报文的发送,完成IP地址和MAC地址的映射。

2)实现了ICMP回显应答报文的发送。

3)实现了UDP回环通信。

4)实现了PAUSE帧对数据流量的控制。

2 以太网协议

2.1 以太网介绍

以太网是IEEE 802.3标准下的计算机局域网技术,具有传输速率高、结构简单、工作可靠等优点,是当今现有局域网采用的最通用的协议标准。

以太网最早由Xerox公司创建,并由XeroxIntelDEC公司联合开发。之后IEEE 802.3标准定义了以太网的技术标准,包括物理层的连线、电信号和介质访问层协议的内容。随着技术的发展,以太网逐渐标准化,并成为了当前应用最普遍的局域网技术。

以太网是一种传输规则,收发双方必须遵循这些规则才能使数据有效传输。OSIOpen System Interconnection)七层模型和TCP/IP四层模型是常用的数据传输模型,本设计使用OSI七层模型设计以太网传输模块,其各个子层的功能如下表所示。

层级

名称

作用

常用协议

7

应用层(Application Layer

为应用程序或用户请求提供各种服务

文件传输、电子邮件、虚拟终端

HTTPFTPSMTPPOP3NNTP

6

表示层(Presentation Layer

数据编码、格式转换、数据加密

LLPNBSSP

5

会话层(Session Layer

创建、管理和维护会话

建立或解除与其他接点的联系

SSLDAP

4

传输层(Transport Layer

提供端对端的接口,数据通信

TCPUDP

3

网络层(Network Layer

为数据包选择路由,IP地址及路由选择

IPICMP

2

数据链路层(Data Link Layer

提供介质访问和链路管理。传输有地址的帧,错误检测功能

MACARP

1

物理层(Physical Layer

管理通信设备和网络媒体之间的互联互通以二进制数据形式在物理媒体上传输数据

光纤、双绞线(介质)

数据从上至下逐级封装,加入每层的头部信息,在物理层转换为比特流发送;接收端使用逆向顺序把数据逐级解封装,发送给应用层。FPGAUDP通信只做到了传输层,物理层一般由外部PHY芯片提供,没有应用层、表示层和会话层。

2.2 物理层

以太网物理层是OSI模型中的第一层,它负责数据的编码、解码、数模转换和数据在物理介质上的传输等。

10Mbps100Mbps1Gbps速率的以太网中,通常采用RJ45网口和双绞线作为物理介质传输数据,RJ45连接器是一种8针连接器,提供4对提供信号输出。在10Mbps./100Mbps速率下,使用了其中4根线,在1Gbps速率下使用了全部8根线。

千兆以太网传输的数据由外部PHY芯片提供编解码和数模转换功能。在1000BASE-T标准中采用4D_5PAM编码方式,其带宽相比传统二电平编码相比提高了带宽利用率。千兆以太网的数据链路层和物理层之间一般采用RGMII接口连接,其接口连接示意图如下:

该接口采用双沿采样的方案,相比GMII接口减少了I/O数量,从而减小了PCB的面积和布线难度,降低了成本。RGMII接口的控制信号被多路复用,CTL信号复用了EREN信号,上升沿传输EN信号,下降沿传输EN信号与ER信号的异或结果。

万兆以太网的内部逻辑通过XGMII接口与FPGA芯片内部的SERDES连接。XGMII接口的数据位宽为32位,SERDES提供PMAPCS子层,其结构包括锁相环、串并转换器、预加重电路、均衡器、时钟恢复电路等,万兆网的数据经过SERDES进行64/66B的编码,通过10.3125Gbps的速率发出,经过光模块进行光电转换后,采用光纤作为物理介质进行传输。

本文通过千兆以太网来验证UDP协议栈的功能。

2.3 以太网帧格式

数据在以太网中传输时需逐层封装或拆解,以添加或过滤上各层协议对应的首部。UDP数据帧的结构和封装顺序如图所示,用户数据经过UDP层、IP层、MAC层,分别添加了8字节UDP头部、20字节IP头部、22字节MAC头部和4字节CRC校验结果,再经过PHY层传出完整的一帧数据。

下面介绍各层协议的具体功能及其帧格式。

2.3.1 MAC协议

以太网MAC层在网络通信中起着至关重要的作用,它负责数据的封装与拆包、传输控制、错误检测与纠正功能,确保数据在网络中正确传输和有效处理。

MAC数据帧格式如下图2.1所示,其包头包含前导码、SFD、目的MAC地址、源MAC地址、类型/长度,最后4个字节为CRC校验位。

各区域具体功能如下:

前导码(7Byte):用于调整时钟使收发节点的时钟同步,接收端通过识别前导码来确定数据帧的边界,以确保接收端能够准确地提取出完整的数据帧。内容为连续7字节的8'h55

帧起始定界符SFD1Byte):用于区分前导段和数据段,确保后续数据的正确解析。内容为8'hd5

MAC地址(6Byte):MAC地址由48bit数据组成,它是网卡的物理地址,一般固化在网卡的ROM中。在以太网传输的最底层就是根据MAC地址来发送数据,同一个网络里不能有两个相同的MAC地址。MAC地址的前3个字节是组织唯一标识符,用于标识网络硬件制造商,后3个字节是制造商为网卡分配的序列号。

类型/长度(2Byte):该区域可以用来表示MAC数据包下一层的类型,也可以用来描述MAC数据包数据段的长度。该值小于1536表示长度,大于1536表示类型,IP协议对应的数值为0x0800ARP协议为0x0806

FCS4Byte):FCS(错误检测码)是用于检测数据帧在传输过程中是否发生错误的一个字段,它通过CRC(循环冗余校验)算法计算得出,并附加在数据帧的尾部。发送数据时,会根据数据内容生成简短的校验和,并将其与数据一起发送。接收数据时,将再次生成的校验和并将其与发送的校验和进行比较。如果二者相等,则数据没有损坏。

每一帧传输完成后,都必须等待96bit数据传输的时间,即最小帧间隔(IFG),才可以进行下一次以太网帧的传输。由于以太网每个时钟周期发送8bit数据,所以最小帧间隔为12个时钟周期。

2.3.2 CRC校验

CRC校验的实现原理比较简单。设m(x)为需要校验的数据,g(x)为多项式,先将数据左移K位(Kg(x)的最大项系数),然后做模2除法运算,模二运算的本质是异或运算。

比如,当m(x)11101g(x)X3+X+1时,将11101左移3位得到1101000,与101进行模2除法,过程和结果如下图所示。计算得到的余数为011,将其附加到m(x)数据后得到11101011,即为新的数据帧,该数据与101进行模二除法得到的余数为0,说明校验正确。

硬件设计中,可以通过串行或并行的方式来实现CRC的计算。串行方式消耗的资源少,但速度较慢。串行处理的硬件电路实现实际上就是寄存器和异或门电路连接成线性反馈移位寄存器。CRC-32生成的多项式为g(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1,其硬件实现如下图所示。

c1[31:0]表示移位寄存器的次态,用c[31:0]表示移位寄存器的现态,用d[0:0]表示需要校验的串行数据,得到的布尔表达式如下:

c1[0 ] = d[0] ^ c[31];

c1[1 ] = d[0] ^ c[0] ^ c[31];

c1[2 ] = d[0] ^ c[1] ^ c[31];

c1[3 ] = c[2];

c1[4 ] = d[0] ^ c[3] ^ c[31];

c1[5 ] = d[0] ^ c[4] ^ c[31];

c1[6 ] = c[5];

c1[7 ] = d[0] ^ c[6] ^ c[31];

c1[8 ] = d[0] ^ c[7] ^ c[31];

c1[9 ] = c[8];

c1[10] = d[0] ^ c[9] ^ c[31];

c1[11] = d[0] ^ c[10] ^ c[31];

c1[12] = d[0] ^ c[11] ^ c[31];

c1[13] = c[12];

c1[14] = c[13];

c1[15] = c[14];

c1[16] = d[0] ^ c[15] ^ c[31];

c1[17] = c[16];

c1[18] = c[17];

c1[19] = c[18];

c1[20] = c[19];

c1[21] = c[20];

c1[22] = d[0] ^ c[21] ^ c[31];

c1[23] = d[0] ^ c[22] ^ c[31];

c1[24] = c[23];

c1[25] = c[24];

c1[26] = d[0] ^ c[25] ^ c[31];

c1[27] = c[26];

c1[28] = c[27];

c1[29] = c[28];

c1[30] = c[29];

c1[31] = c[30];

并行方式消耗的资源多,但速度快,适合用于使用千兆以太网或万兆以太网的场景。得到8位并行运算的结果,需要对d[7:0]的每一位做迭代运算,对d[0]计算得到的结果已经列出,对d[1]做同样的运算得到的布尔表达式如下:

c2[0 ] = d[0] ^ c1[30];

c2[1 ] = d[1] ^ d[0] ^ c1[30] ^ c1[31];

c2[2 ] = d[1] ^ d[0] ^ c1[0] ^ c1[30] ^ c1[31];

c2[3 ] = d[1] ^ c1[1] ^ c1[31];

c2[4 ] = d[0] ^ c1[2] ^ c1[30];

... ...

c2[31] = c1[29];

经过8次迭代运算即可得到CRC-328位并行运算公式。

2.3.3 PAUSE流量控制帧格式

PAUSE帧是一种用于控制数据流量的控制帧,当对端发来的数据量过大,为了防止缓冲区溢出导致的数据丢失,MAC层控制流量控制子层发出流量控制帧。接收方收到PAUSE帧后,会将其内容送到MAC层中的流量控制模块中进行解析,得到需要暂停发送的时间。在一帧结束后开启暂停,暂停计数结束后,开始发送新一帧的数据。

PAUSE帧的格式如下图所示。

目的MAC6Byte):PAUSE帧的目的为保留的组播地址,其值为固定的48'h01_80_c2_00_00_01

TYPE2Byte):固定值为16'h8808,表示帧类型为MAC控制帧。

OPCODE2Byte):操作码,值为16'h0001,表示MAC控制帧中的PAUSE帧。

TIME2Byte):时间参数,它的值表示以太网以当前速率传输512bit数据的时间,接收方实际暂停的时间为该字段数值左移6位得到的值乘时钟周期。

补充数据:有效信息后补0,补齐MAC帧所需要的最小数据数量。

2.3.4 IP协议

MAC数据帧经过数据链路层传输到网络层时,前导码、SFDMAC地址、类型/长度以及校验字节均被过滤,IP数据包传入了网络层。该数据包也不完全是有效数据,其还包含20字节的IP头部,具体见上图。IP头部各区域功能如下:

版本(4bit):定义IP协议版本,IPV44'h4

首部长度(4bit):定义IP数据包头部长度,表示具有32位字长数据的数量。最小值为5,最大值为15

服务类型(8bit):用于分配优先级、延迟、吞吐量及可靠性,一般为8'h00

总长度(16bit):定义整个IP数据包长度。

标识(8bit):发完一包数据自动加1

标记(3bit):最高位保留为0;中间位是否开启分段,0不开启,1开启;最低位表示是否存在下一个分段,0表示为最后一个分段,1表示还存在下一个分段。一般默认为3'b010

分段偏移(13bit):表示分段数据在源数据报中的相对位置。

生存时间(8bit):表示以太网数据包可以中转进过多少个路由器,每进过一个路由器,该值就会减少1,直到该值变成0,丢包该包。WIN系统默认为8'h80

协议(8bit):指出IP处理过程完成后,传输层的协议。UDP8'd17TCP8'd6ICMP8'd1

首部校验和(16bit):该区域确保IP协议头部的完整性。将头部每16位划分为一部分,将各部分相加取得的结果再取反码,即为该区域数据。

源地址(32bit):源主机IP地址。

目的地址(32bit):目的主机IP地址。

2.3.5 IP首部校验

IP首部校验的原理是将IP数据包头部每16bit的数据划分、校验位置0,进行累加操作,得到的结果若有进位,则将进位数据和低16bit数据进行相加,直到不再产生进位,把得到的结果取反,就是IP首部校验和的值。

发送方对首部校验和计算,并将其结果放入IP头部的首部校验和字段。接收方接收到IP数据包时,将其所有的包头数据进行校验,若得到的校验结果为全1,则数据没有发生改变。

2.3.6 UDP协议

UDP数据报文分为UDP头部和有效数据。UDP头部由源端口号、目的端口号、长度以及校验和组成,如下图所示。相比TCP协议,UDP的传输效率更高,但其提供不可靠传输,有可能丢包。各区域的功能如下:

UDP数据包分为UDP头部和有效数据。UDP头部由源端口号、目的端口号、长度以及校验和组成,如下图所示。相比TCP协议,UDP的传输效率更高,但其提供不可靠传输,有可能丢包。各区域的功能如下:

源端口号(16bit):源主机的应用程序使用的端口号。

目的端口号(16bit):目的主机的应用程序使用的端口号。

UDP长度(16bit):UDP头部和UDP数据的字节长度之和。

UDP校验和(16bit):检查数据是否被正确接收,可以不使用。

2.3.7 ARP协议

ARP即地址解析协议的基本功能是通过目标设备的IP地址,查询目标设备的MAC地址。在发送IP数据包时,发送方首先查看自己的ARP链表,确定IP地址对应的MAC地址。如果找到了对应的MAC地址,则利用ARP链表中的MAC地址对IP数据包进行封装,将数据包发送出去;如果没有找到对应的MAC地址,则发送ARP广播,请求接收方将自己的MAC地址通过ARP应答发送到请求方,然后发送方将ARP应答包中的地址信息缓存进ARP链表中。

 

ARP数据包的结构如下图:

硬件类型(2Byte):硬件地址的类型,以太网的硬件类型为1

协议类型(2Byte):上层协议类型,IP的协议类型为16'h0800

硬件地址长度(1Byte):硬件地址(MAC地址)的长度,以字节为单位,其值固定为8'h06

协议地址长度(1Byte):IP地址的长度,以字节为单位,固定值8'h04

OPCODE2Byte):操作码,值为16'h0001表示ARP请求,值为16'h0002表示ARP应答。

MAC地址(6Byte):发送方的MAC地址。

IP地址(4Byte):发送方的IP地址。

目的MAC地址(6Byte):发送ARP请求时为广播地址48'hff_ff_ff_ff_ff_ff,发送ARP应答时为接收方的MAC地址。

目的IP地址(4Byte):接收端的IP地址。

2.3.8 ICMP协议

ICMP协议主要用于诊断网络连接故障和测试网络连接,PC端通常会使用ping命令来测试网络,ping命令就是基于ICMP协议实现的。

由于UDP协议提供不可靠传输,所以需要和ICMP协议配合使用以达到查询和纠错目的。ICMP报文分为查询报文和差错报文两大类,本协议栈实现了对远程主机发送的ping请求回复一个ping应答包。ping请求和ping应答都属于查询报文,查询报文的报文格式如下:

类型(1Byte):表示ICMP报文的类型,不同类型代表不同的功能,如:8'h08表示回显请求,8'h00表示回显应答。

代码(1Byte):和类型字段结合使用,共同标识了ICMP报文的详细类型,回显请求和回显应答是该值为8'h00

校验和(2Byte):用于判断数据传输时是否出了差错,与IP首部校验的方式相同。

标识符(2Byte):对数据报进行标识,用于区分不同的请求和应答。

序列号(2Byte):每次发送完就加1,和标识符一起用于区分不同的请求和应答。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

manim边学边做--点

几何图形是manim中最重要的一类模块,manim内置了丰富的各类几何图形,本篇从最简单的点开始,逐个介绍manim中的几何模块。 manim中点相关的模块主要有3个:Dot:通用的点 LabeledDot:在点的中间可以加一些说明文字 AnnotationDot:使用在注释场景中的点Dot系列在manim各个模…

给定一个10GB大小的文件,存储的都是数字,如何对文件中的数字进行排序,并输出新文件?限制内存只有1GB

背景 这是一道面试题,可考察的点也不少。总结几个关键词去解决这个问题,1,文件拆分;2、排序算法;3、缓冲buffer性能优化。 啊,乍一看,这绝对不是一个初级程序员能够答出来,且能答得很好的问题,这个题目可以考察到我们的算法能力,性能优化经验。可万万不能马虎对待!开…

从「数据资产入表」到「数据资产运营管理」,成功的关键在于找到合适的数资服务提供商

璞华科技在数据服务领域深耕细作,不断突破创新,近来荣膺多项重要认证与荣誉。 璞华易表数据资产运营管理平台正式获得国家计算机软件著作登记证书。这一殊荣不仅是对璞华科技研发团队技术实力的肯定,更是对璞华易表产品原创性和创新性的高度认可。它标志着璞华易表在软件开发…

基于米尔芯驰MY-YD9360商显板的神经网络推理库测试

本篇测评由优秀测评者“短笛君”提供。 本文将介绍基于米尔电子MYD-YD9360商显板(米尔基于芯驰D9360国产开发板)的TinyMaxi轻量级的神经网络推理库方案测试。 算力测试 TinyMaix 是面向单片机的超轻量级的神经网络推理库,即 TinyML 推理库,可以让你在任意单片机上运行轻量级…

Qwen2-Math 开源 AI 模型发布;阿里云推出首个域名 AI 大模型应用丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内…

ssh连接失败,排错经验

一、场景描述 ssh连接服务器,发现连接失败,但是对应服务器的ip能够ping通。 场景:[root@yl-web ~]# ssh root@10.1.101.35 ssh_exchange_identification: read: Connection reset by peer [root@yl-web ~]# ping 10.1.101.35 PING 10.1.101.35 (10.1.101.35) 56(84) bytes o…

面向忙碌的-Java-开发者的-Python-教程-全-

面向忙碌的 Java 开发者的 Python 教程(全)原文:Python for the Busy Java Developer 协议:CC BY-NC-SA 4.0一、语言 让我们从了解 Python 与 Java 的不同之处开始我们的 Python 之旅。在下一章深入研究 Python 的语法之前,我将帮助你设置 Python。 Python 是什么? Pytho…

maven搭建的springboot项目,引用了其他moudle的类,明明有这个类,install的时候确报错找不到这个类

其实这个问题是maven打包插件引起的,正常配置,install后包内首层会出现BOOT-INF这个目录,导致别的moudle打包install引用时找不到正确的目录 正常配置 打包后看引用的jar包就会有一层BOOT-INF目录包括着。 修改配置为下图,重新打包就没有了BOOT-INF目录了。再次引用并insta…

vue+iview-table点击展开展示内容,表格嵌套

实现如下效果的表格嵌套: 点击展开,展示tabs。 table的columns里设置展示的属性,然后属性里设置返回一个组件,然后在组件里写嵌套的内容。 <Table :columns="tableColumns" :data="tableData" style="width:100%" @on-selection-change=&…

Python-和-PowerShell-协作教程-全-

Python 和 PowerShell 协作教程(全)原文:PowerShell and Python Together 协议:CC BY-NC-SA 4.0一、面向调查人员的 PowerShell 简介 PowerShell 提供了一个强大的获取引擎,可以从实时系统、服务器、外围设备、移动设备和数据驱动的应用程序(如 Active Directory)中获取大…

Blender-Python-API-教程-全-

Blender Python API 教程(全)原文:The Blender Python API 协议:CC BY-NC-SA 4.0一、Blender 界面 本章讨论并定义 Blender 界面的组件。它作为我们在整个文本中讨论界面时使用的词汇的参考。我们将关注 Python 开发中最常用的接口组件,并为高效的 Python 脚本设置自定义接…

2024暑期学习(一)

摸鱼~2024暑期学习(一) 非常非常非常感谢ve1kcon!^ ^✌️2024年暑期学习 (1) - ve1kcon - 博客园 (cnblogs.com) 学习内容: 1.复现了一点点题目 2.了解了C++异常处理 3.学习了Tmux的使用 cqb2024x ctf stdout 前置内容(copy): setvbuf() 函数的原型如下 int setvbuf(FILE *s…