一、简介
一般来说,我们要将 FPGA 板子上采集的数据传输到 PC 端有多种方式,如 UART、USB、千兆网、光纤、PCIe等手段,感觉还是千兆网传输的性价比最高,实现上不是很难,传输速率也比较快。以太网的分类有标准以太网(10Mbit/s),快速以太网(100Mbit/s)和千兆以太网(1000Mbit/s)。随着以太网技术的飞速发展,市场上也出现了万兆以太网(10Gbit/s),它扩展了IEEE802.3协议和MAC规范,使其技术支持 10Gbit/s的传输速率。然而在实际应用中,标准以太网和快速以太网已经能够满足我们的日常需求,对通信速率较高的场合才会用到千兆以太网。
二、对以太网数据包格式的协议一一讲解
由上图可知,要发送的数据是加载在UDP协议中,UDP协议又是加载在IP协议中,IP协议加载在MAC协议中,是一种层层包含的关系,下面对MAC、IP、UDP协议一一详细讲解。
1、MAC帧格式
1)前导码(Preamble):实现底层数据的正确阐述,物理层使用 7 个字节同步码(0和1交替(55_55_55_55_55_55_55))实现数据的同步。
2)帧起始界定符:一个字节,固定为(0xd5)来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。
3)目的MAC地址:六个字节,表明帧的接受者(电脑的MAC地址)。
4)源MAC地址:六个字节,表明帧的发送者(板子的MAC地址,一般为自己设置一个地址)。
5)长度/类型:两个字节,长度/类型具有两个意义,当着连个字节的值小于1536(十六进制为0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议、0x0806代表ARP协议等。
6)数据:以太网中的数据段长度最小 46 字节,最大1500个字节。最大值1500称为以太网的最大传输单元,之所以闲置最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其他数据帧等待的时间就会加长,导致体验变差。
7)帧校验序列(FCS):四个字节,为了保证数据的正确传输,在数据的尾部加入了4个字节的循环冗余校验码(CRC校验)来检测数据是否传输错误。CRC数据校验从以太网帧头开始即不包含前导码和帧起始界定符。
值得注意的地方:以太网相邻两帧之间的时间间隔,即帧间隙(IFG)。帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并未接收下一帧做准备的时间。不管是10M/100M/1000M的以太网,两帧之间最少要有96bit time,IFG的最小间隔时间计算方法如下:
10Mbit/s 最小时间为 :96 * 100ns = 9600ns;
100Mbit/s最小时间为 :96 *10ns = 960ns;
1000Mbit/s最小时间为:96 * 1ns = 96ns;
2、IP数据报格式
IP数据报前 20 个字节是固定的,IP首部的每一行以32位(4个字节)为单位。
1)版本:4位IP版本号,设置为0x4时,表示 IPv4,设置为0x6,表示IPv6,目前使用较多的IP协议版本号是IPv4。
2)首部长度:4位首部长度,表示IP首部一共有多少个32位。在没有可选字段时,IP首部长度为20个字节,因此首部长度的值为0x5。
3)服务类型:8位服务类型,一般设置为全零,8‘h00。
4)总长度:16位,IP首部长度 + UDP首部长度 + 数据部分的长度(如:IP首部长度固定为 20个字节 + UDP首部长度为 8个字节 + 数据部分的字节数)。
5)标识:16位,用来标识主句发送的每一份数据报,通常每发一份报文它的值就会加1。(也可以设置为0)
6)标志字段:3位,第一位为保留为;第二位表示禁止分片(1表示不分片,0表示分片);第三位表示更多分片。(也可以设置为0)
7)片偏移:13位,在接收方进行数据报重组时用来标识分片的顺序。(也可以设置为0)
8)生存时间:8位,防止丢失的数据包在无休止的传播,一般被设置为64或者128。
9)协议:8位,表示此数据包所携带上层数据使用的协议类型,ICMP为1,TCP为6,UDP为17。
10)首部校验和:16位,该字段只校验数据报的首部,不包含数据部分,校验IP数据报头部是否被破坏、篡改和丢失等。
11)源IP地址:32位,即发送端的IP地址(板子的IP地址),一般为自己设置,如192.168.0.2。
12)目的IP地址:32位,即接收端的IP地址(电脑的IP地址),也可以自己设置,如192.168.0.3。在上板实验时,需将电脑上的IP改为自己设置的那个IP地址。
IP首部校验和的计算方法:
(1)将16位检核和字段置为0,然后将IP首部按照16位分成多个单元;
(2)将各个单元采用反码加法运算(即高位溢出会加到低位,通常的补码运算时直接丢掉溢出的高位);
(3)此时仍然可能出现进位的情况,将得到的和再次分成高16位和低16位进行累加;
(4)最后将得到的和的反码填入校验和字段;
如:0 - 31: 45_00_00_32
0 - 31: 00_00_00_00
0 - 31: 40_11_00_00
0 - 31 : c0_a8_00_02
0 - 31 : c0_a8_00_03
(a)0x4500 + 0x0032 +0x0000 +0x0000 +0x4011 +0x0000 + 0xc0a8 +0x 0002 + 0xc0a8 +0x0003 = 0x20698
(b)0x0002 + 0x0698 = 0x0698
(c)0x0000 + 0x0698 = 0x0698
(d)ip_checksm = ~0x0698 = 0xf967
3、UDP协议
原文:https://www.cnblogs.com/571328401-/p/13268689.html