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

news2024/11/16 21:48:52

软件版本: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 概述

2 以太网协议

2.1 以太网介绍

2.2 物理层 

2.3 以太网帧格式

2.3.1 MAC协议

2.3.2 CRC校验

2.3.3 PAUSE流量控制帧格式

2.3.4 IP协议

2.3.5 IP首部校验

2.3.6 UDP协议

2.3.7 ARP协议

2.3.8 ICMP协议


1 概述

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

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

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

(3)实现了UDP回环通信。

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

2 以太网协议

2.1 以太网介绍

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

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

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

层级

名称

作用

常用协议

7

应用层(Application Layer)

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

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

HTTP、FTP、SMTP、POP3、NNTP

6

表示层(Presentation Layer)

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

LLP、NBSSP

5

会话层(Session Layer)

创建、管理和维护会话

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

SSL、DAP

4

传输层(Transport Layer)

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

TCP、UDP

3

网络层(Network Layer)

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

IP、ICMP

2

数据链路层(Data Link Layer)

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

MACARP

1

物理层(Physical Layer)

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

光纤、双绞线介质)

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

2.2 物理层 

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

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

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

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

万兆以太网的内部逻辑通过XGMII接口与FPGA芯片内部的SERDES连接。XGMII接口的数据位宽为32位,SERDES提供PMA和PCS子层,其结构包括锁相环、串并转换器、预加重电路、均衡器、时钟恢复电路等,万兆网的数据经过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。

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

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

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

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

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

2.3.2 CRC校验

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

比如,当m(x)为11101,g(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-32的8位并行运算公式。

2.3.3 PAUSE流量控制帧格式

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

PAUSE帧的格式如下图所示。

目的MAC(6Byte):PAUSE帧的目的为保留的组播地址,其值为固定的48’h01_80_c2_00_00_01。

TYPE(2Byte):固定值为16’h8808,表示帧类型为MAC控制帧。

OPCODE(2Byte):操作码,值为16’h0001,表示MAC控制帧中的PAUSE帧。

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

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

2.3.4 IP协议

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

版本(4bit):定义IP协议版本,IPV4为4’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处理过程完成后,传输层的协议。UDP为8’d17,TCP为8’d6,ICMP为8’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。

OPCODE(2Byte):操作码,值为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.coloradmin.cn/o/1975374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 3的两种SPI加载方式

从spring boot 2.7.0发布后, 自动配置类的加载方式就发生了改变,原来从META-INF/spring.factories文件中加载,变为了从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中加载,对应的加载实…

Ubuntu下python3.12安装, 分布式 LLM 推理 exo 安装调试过程, 运行自己的 AI 集群

创作不易 只因热爱!! 热衷分享,一起成长! “你的鼓励就是我努力付出的动力” —调试有点废,文章有点长,希望大家用心看完,肯定能学废,感谢. 1. Ubuntu下python3.12安装 1.1 导入 Python 的稳定版 PPA,不用编译 sudo add-apt-repository ppa:deadsnakes/ppa sudo…

82.WEB渗透测试-信息收集-框架组件识别利用(6)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:81.WEB渗透测试-信息收集-框架组件识别利用(5) log4j/log4j2&…

《Excelize权威指南》新书发布

在数据洪流涌动的数字化时代,数据处理与分析已跃升为解锁无限洞察力的金钥匙,赋能商业智慧、重塑医疗健康版图、驱动教育科研创新。然而,当数据量级爆炸式增长,传统工具如 Excel 虽被誉为数据处理领域的常青树,其手动操…

modelsim仿真quartus IP

开发环境:quartus prime pro 20;modelsim se-64 10.6d 1. 生成Altera的IP库 使用quartus生成IP库,需要使用Simulation Library Compiler(Tools->Launch Simulation Library Compiler) 如下图操作,选择…

车载音频开发(一):从看懂wav开始

背景介绍:随着电车的发展势头迅猛,国内车载音频也成为电车火热宣称的势头,要想深入了解车载音频,那首先还是得从最为普通的音频文件WAV开始。 我们都知道,计算机只能存储数字,声音确实靠不同频率的波组成&a…

RabbitMQ的快速入门

目录 前言 1. 安装RabbitMQ 2.基本结构 3. RabbitMQ消息模型 ​​​​​​4. 入门案例 4.1 publisher实现 4.2 consumer实现 4.3 总结 前言 RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Q…

达梦数据库的系统视图v$cachesql

达梦数据库的系统视图v$cachesql 达梦数据库的系统视图V$CACHESQL的主要作用是提供缓冲区中SQL语句的信息,在 ini 参数 USE_PLN_POOL !0 时才统计。通过查询这个视图,用户可以了解SQL语句在缓冲区中的执行情况,包括SQL节点的类型、进入次数、…

滚珠丝杆与丝杆支撑座:稳定性与精度的双重保障

丝杆支撑座是连接滚珠丝杆与电机的轴承,采用优质的轴承能确保支撑座与滚珠丝杆之间的刚性平衡。那么,滚珠丝杆搭连接杆支撑座有哪些优缺点呢? 正常情况下,丝杆支撑座能够提供稳定的支撑力,确保滚珠丝杆在复杂工况下保持…

使用PasteSpider实现类似Jenkins的功能,让你的2G服务器也可以飞起

获取你接触过Jenkins,在我理解就是拉取源码,然后构建成镜像,最后启动容器! 这个步骤你在PasteSpider上也可以实现,以下案例使用svn作为源码管理 如果你使用git作为源码管理,道理差不多 以我的代码为例 …

假期BUUCTF小练习3

文章目录 [极客大挑战 2019]BuyFlag[BJDCTF2020]Easy MD5[HCTF 2018]admin第一种方法 直接登录第二种方法 flack session伪造第三种方法Unicode欺骗 [MRCTF2020]你传你🐎呢[护网杯 2018]easy_tornadoSSTI注入 [ZJCTF 2019]NiZhuanSiWei [极客大挑战 2019]BuyFlag 一…

好用的AI智能写作助手,创作者必备

随着科技的不断发展,人工智能(AI)在各个领域都起到了革命性的作用。在写作领域,AI智能写作助手已经成为了创作者们的必备工具。这些智能助手通过强大的自然语言处理能力和深度学习算法,能够帮助创作者们提高写作效率、…

网络安全领域含金量最高的5大赛事,每个网安人的梦!

做网络安全一定要知道的5大赛事,含金量贼高,如果你能拿奖,国内大厂随你挑,几乎是每个有志网安人的梦! 一、 DEF CON CTF(DEF CON Capture the Flag) DEF CON CTF是DEF CON黑帽大会上的一项著名…

grep工具的使用

grep [options]…… pattern [file]…… 工作方式: grep 在一个或者多个文件中搜索字符串模板,如果模板中包括空格,需要使用引号引起来,模 板后的所有字符串会被看作是文件名。 工作结果:如果模板搜索成功&#xf…

算法力扣刷题记录 六十三【回溯章节开篇】

前言 开始回溯章节学习。 在二叉树中预先体会了回溯。那么回溯单独来说是怎么回事? 一、基础知识学习 回溯基础知识参考链接 二、组合问题 2.1题目阅读 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答…

C#--DirectShowLib 关闭自动白平衡和自动曝光时间

一、前言 因项目需要需关闭相机自身的自动白平衡和自动曝光时间,统统设定为恒定值,开始实验了opencvCvSharp,但是不起作用,故实验了更底层的 DirectShowLib ,可成功关闭相机自带的自动白平衡和自动曝光时间&#xff0c…

用script实现的一个简易计算机

目录 一、计算器原理 二、源码 三、结果展示 四、不足与改进 一、计算器原理 首先我们列出想象中简易计算器的样子: 虽然画的磕碜但是应该不影响下面的操作hh 首先想到用表格形式在网页中表示它,是一个5行4列的表格,接着要实现计算器的…

ShardingSphere中的ShardingJDBC常见分片算法的实现

文章目录 ShardingJDBC快速入门修改雪花算法和分表策略核心概念分片算法简单INLINE分片算法STANDARD标准分片算法COMPLEX_INLINE复杂分片算法CLASS_BASED自定义分片算法HINT_INLINE强制分片算法 注意事项 ShardingJDBC Git地址 快速入门 现在我存在两个数据库,并…

【传知代码】Flan-T5 使用指南(论文复现)

当今,自然语言处理技术正在以前所未有的速度和精度发展。在这个领域中,Flan-T5作为一种新兴的预训练语言模型,正吸引着广泛的关注和应用。Flan-T5不仅仅是一个强大的文本生成工具,它还能通过提供高效的语义理解和多任务学习能力&a…