**
闲来无事,想了想写点东西,顺带着记录一下自己学习的过程,其中千兆以太网这个模块是之前的一个项目任务,已经实现,但是想着自己在这里面也遇到过许多坑,所以写点东西,避免后来者遇到相同的问题,以后尽量避免事后总结,要做到边做边总结;
在2020年国产化的大趋势下,国产芯片开始发展,在这样的时代背景下,我开始了千兆以太网的学习;
实现的是简单千兆以太网的实现,利用udp协议、arp协议等千兆以太网的通信,在介绍具体操作流程的过程前,我先介绍一下千兆以太网的设计框架,知识浅薄,有错误请多多支持;
本实验以千兆以太网 RGMII 通信为例来设计 verilog 程序,会先发送预设的 UDP 数据到网络,每秒钟发送一次,如果 FPGA 检测网口发来的UDP 的数据包,会把接收到的数据包存储在FPGA 内部的 RAM 中,再不断的把 RAM 中的数据包通过网口发回到 ethernet 网络。程序分为两部分,分别为发送和接收,实现了 ARP,UDP,Ping 功能。以下为 原理实现框图:
至于使用哪一个,看自己的模块使用的总线类别而定;我使用的是智多晶的开发板,这个模块是rgmii总线的,具体型号好像是2000系列的,可以去官网查一下
读者在设计时一定要清楚RGMII和GMII的区别,包括时钟信号,信号传输方式等等,例如:RGMII使用的是同时利用上下延进行数据的传输;
上图为GMII接口
上图为RGMII接口
RGMII 接口是 GMII 接口的简化版,在时钟的上升沿及下降沿都采样数据,上升沿发送TXD[3:0]/RXD[3:0],下降沿发送 TXD[7:4]/RXD[7:4],TX_EN 传送 TX_EN(上升沿)和 TX_ER(下降沿)两种信息,RX_DV 传送 RX_DV(上升沿)和 RX_ER(下降沿)两种信息。
接下来,为大家介绍一下以太网的各个协议,协议的内容等
下图为以太网帧格式:
前导码(Preamble):8 字节,连续 7 个 8’h55 加 1 个 8’hd5,表示一个帧的开始,用于双方设备数据的同步。
目的 MAC 地址:6 字节,存放目的设备的物理地址,即 MAC 地址
源 MAC 地址:6 字节,存放发送端设备的物理地址
类型:2 字节,用于指定协议类型,常用的有 0800 表示 IP 协议,0806 表示 ARP 协议,8035表示 RARP 协议
数据:46 到 1500 字节,最少 46 字节,不足需要补全 46 字节,例如 IP 协议层就包含在数据部分,包括其 IP 头及数据。
FCS:帧尾,4 字节,称为帧校验序列,采用 32 位 CRC 校验,对目的 MAC 地址字段到数据字段进行校验。
进一步扩展,以 UDP 协议为例,可以看到其结构如下,除了以太网首部的 14 字节,数据部分包含 IP 首部,UDP 首部,应用数据共 46~1500 字节。
ARP 地址解析协议,根据 IP 地址获取物理地址。主机发送包含目的 IP 地址的 ARP 请求广播(MAC 地址为 48’hff_ff_ff_ff_ff_ff)到网络上的主机,并接收返回消息,以此确定目标的物理地址,收到返回消息后将 IP 地址和物理地址保存到缓存中,并保留一段时间,下次请求时直接查询 ARP 缓存以节约资源。
上图为数据报格式,
帧类型:ARP 帧类型为两字节 0806
硬件类型:指链路层网络类型,1 为以太网
协议类型:指要转换的地址类型,采用 0x0800 IP 类型,之后的硬件地址长度和协议地址长度分别对应 6 和 4
OP 字段中 1 表示 ARP 请求,2 表示 ARP 应答(这里要注意)
例如:|ff ff ff ff ff ff(以太网的目的地址)|00 0a 35 01 fe c0(以太网源地址)|08 06(帧类型)|00 01(硬件类型)|08 00(协议类型)|06(硬长)|04(软长)|00 01(请求)|00 0a 35 01 fe c0(以太网源地址)
|c0 a8 00 01(源IP地址)| ff ff ff ff ff ff(以太网的目的地址)|c0 a8 00 02(目的IP地址)| 表示向 192.168.0.2 地址发送 ARP 请求。
下面就不备注了,这就是对应的arp请求与应答;
|00 0a 35 01 fe c0 | 60 ab c1 a2 d5 15 |08 06|00 01|08 00|06|04|00 02| 60 ab c1 a2 d5 15|c0 a8 00 02|00 0a 35 01 fe c0|c0 a8 00 01|表示向 192.168.0.1 地址发送 ARP 应答。
因为 UDP 协议包只是 IP 包中的一种, 所以我们来介绍一下 IP 包的数据格式。下图为 IP 分组的报文头格式,报文头的前 20 个字节是固定的,后面的可变
由于IP协议并不是一个单独的协议,UDP协议是它其中的一种,TCP协议也是它其中的一种,HTTP协议等,具体的每一种协议有着它的应用场合,在这里我们使用UDP协议,又称为不可靠传输,主要用于传输视频等不可靠数据,最主要的原因是简单;
版本:占 4 位,指 IP 协议的版本目前的 IP 协议版本号为 4 (即 IPv4)
首部长度:占 4 位,可表示的最大数值是 15 个单位(一个单位为 4 字节)因此 IP 的首部长度的最大值是 60 字节
区分服务:占 8 位,用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过.1998年这个字段改名为区分服务.只有在使用区分服务(DiffServ)时,这个字段才起作用.一般的情况下都不使用这个字段
总长度:占 16 位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节.总长度必须不超过最大传送单元 MTU
标识:占 16 位,它是一个计数器,用来产生数据报的标识
标志(flag):占 3 位,目前只有前两位有意义
MF
标志字段的最低位是 MF (More Fragment)
MF=1 表示后面“还有分片”。MF=0 表示最后一个分片
DF
标志字段中间的一位是 DF (Don’t Fragment)
只有当 DF=0 时才允许分片
片偏移:占 12 位,指较长的分组在分片后某片在原分组中的相对位置.片偏移以 8 个字节为偏移单位
生存时间:占 8 位,记为 TTL (Time To Live) 数据报在网络中可通过的路由器数的最大值,TTL 字段是由发送端初始设置一个 8 bit 字段.推荐的初始值由分配数字 RFC 指定,当前值为 64.发送 ICMP回显应答时经常把 TTL 设为最大值 255
协议:占 8 位,指出此数据报携带的数据使用何种协议以便目的主机的 IP 层将数据部分上交给哪个处理过程, 1 表示为 ICMP 协议, 2 表示为 IGMP 协议, 6 表示为 TCP 协议, 17 表示为 UDP 协议
首部检验和:占 16 位,只检验数据报的首部不检验数据部分,采用二进制反码求和,即将 16 位数据相加后,再将进位与低 16 位相加,直到进位为 0,最后将 16 位取反。
源地址和目的地址:都各占 4 字节,分别记录源地址和目的地址
UDP 是 User Datagram Protocol(用户数据报协议)的英文缩写。UDP 只提供一种基本
的、低延迟的被称为数据报的通讯。所谓数据报,就是一种自带寻址信息,从发送端走到接收端的数据包。UDP 协议经常用于图像传输、网络监控数据交换等数据传输速度要求比较高的场合。
UDP 协议的报头格式:
UDP 报头由 4 个域组成,其中每个域各占用 2 个字节,具体如下:
① UDP 源端口号
② 目标端口号
③ 数据报长度
④ 校验和
UDP 协议使用端口号为不同的应用保留其各自的数据传输通道。数据发送一方将 UDP 数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。
数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为 65535 字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到 8192 字节。
UDP 协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此 UDP 协议可以检测是否出错。虽然 UDP 提供有错误检测,但检测到错误时,错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。
先写到此,在设计的过程中参考的是黑金的千兆以太网例程,这一章先来点理论知识,具体的实现流程和其他在后来的章节在阐述。