软件版本: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公司创建,并由Xerox、Intel和DEC公司联合开发。之后IEEE 802.3标准定义了以太网的技术标准,包括物理层的连线、电信号和介质访问层协议的内容。随着技术的发展,以太网逐渐标准化,并成为了当前应用最普遍的局域网技术。
以太网是一种传输规则,收发双方必须遵循这些规则才能使数据有效传输。OSI(Open System Interconnection)七层模型和TCP/IP四层模型是常用的数据传输模型,本设计使用OSI七层模型设计以太网传输模块,其各个子层的功能如下表所示。
数据从上至下逐级封装,加入每层的头部信息,在物理层转换为比特流发送;接收端使用逆向顺序把数据逐级解封装,发送给应用层。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生成的多项式为
用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];
经过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,和标识符一起用于区分不同的请求和应答。
本文来米联客(milianke),作者:米联客(milianke),转载请注明原文链接:https://www.cnblogs.com/milianke/p/18351334