014 FPGA千兆网UDP通信
一、UDP协议分析
为什么UDP协议在FPGA实现时很受欢迎,最主要一个原因就是简单,简答到什么地步呢?UDP协议只是在IP的数据服务之上增加了复用和分用的功能和查错检验的功能。
图8‑13 UDP协议示意图
从上图简单总结几个UDP的特点:
1、UDP是面向报文的,发送方的UDP只需要对应用数据报文添加相关首部后就向下交付,这个过程UDP对应用层交下来的数据报文,既不合并也不进行拆分,而是保留这些报文的边界;
2、UDP 是无连接的,从图中可以看出,UDP只是对应用数据添加首部后便以以太网帧格式进行发送,发送前不需要建立连接(发送数据结束时也没有连接可释放),减少了开销和发送数据之前的时延;
3、UDP 使用尽最大努力交付,即不保证可靠交付,主机不需要维持复杂的连接状态表;
4、UDP 没有拥塞控制,从上面可以看出,由于源主机只是进行发送(或接收),而不进行复杂的连接,从而网络出现的拥塞也不会使源主机的发送速率降低。(说白了,就是发送时我不管数据能不能被准确接收,接收时也不管数据是否准确)这对某些实时应用是很重要的;
5、UDP 支持一对一、一对多、多对一和多对多的交互通信;
6、UDP 的首部开销小,只有8个字节,比 TCP 的20个字节的首部要短。这就在产生首部时减少很多时间。
端口分用
上面提到UDP支持一对多交互通信,也就是端口分用。当运输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口,上交最后的终点——应用进程:
图8‑14 UDP基于端口的应用
如果接受方 UDP 发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用程序),就丢弃该报文,并由网际控制报文协议 ICMP 发送“端口不可达”差错报文给发送方
UDP 的首部格式
用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,由四个字段组成,每个字段都是两个字节
首部字段
源端口源端口号。在需要对方回信时。不需要时可用全0
目的端口目的端口号。这在终点交付报文时必须使用
长度 UDP 用户数据报的长度,其最小值是8(仅有首部)
检验和检测 UDP 用户数据报在传输中是否有错。有错就丢弃
伪首部
UDP 用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在 UDP 用户数据报之前增加 12 个字节的伪首部。所谓“伪首部”是因为这种伪首部并不是 UDP 用户数据报真正的首部。只是在计算检验和时,临时添加在 UDP 用户数据报前面,得到一个临时的 UDP 用户数据报。检验和就是按照这个临时用户数据报来计算的。伪首部既不向下传也不向上递交,而仅仅是为了计算检验和。
图8‑15 UDP用户数据报的首部和伪首部
二、UDP数据包分析
1、MAC 数据包
以太网帧格式说明
类别 |
字节数 |
说明 |
前导码(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 地址字段到数据字段进行校验。 |
2、IP 数据包格式
IP数据报的格式如下:
注意,上图表示的数据,最高位在左边,记为0位;最低位在右边,记为31位。在网络中传输数据时,先传输0~7位,其次是8~15位,然后传输16~23位,最后传输24~31位。由于TCP/IP协议头部中所有的二进制数在网络中传输时都要求以这种顺序进行,因此把它称为网络字节顺序。在实际编程中,以其他形式存储的二进制数必须在传输数据前使用网络编程API相应的函数把头部转换成网络字节顺序。
IP数据报各字段功能如下:
1)版本号(4bit):占用4位二进制数,表示该IP数据报使用的IP协议版本。目前Internet中使用的主要是TCP/IP协议族中版本号为4的IP协议。
2)头长度(4bit):占用4位二进制位,此域指出整个报头的长度(包括选项),该长度是以32位二进制数为一个计数单位的,接收端通过此域可以计算出报头在何处结束及从何处开始读数据。普通IP数据报(没有任何选项)该字段的值是5(即20个字节的长度)。
3)服务类型(TOS、type of service)(8bit):占用8位二进制位,用于规定本数据报的处理方式。服务类型字段的8位分成了5个子域:
(1)—优先权(0-7)数越大,表示该数据报优先权越高。网络中路由器可以使用优先权进行拥塞控制,如当网络发生拥塞时可以根据数据报的优先权来决定数据报的取舍。
(2)—短延迟位D(Delay):该位置1时,数据报请求以短延迟信道传输,0表示正常延时。
(3)—高吞吐量位T(Throughput):该位置1时,数据报请求以高吞吐量信道传输,0表示普通。
(4)—高可靠位R(Reliability):该位置1时,数据报请求以高可靠性信道传输,0表示普通。
(5)—保留位。
目前在Internet中使用的TCP/IP协议大多数情况下网络并未对TOS进行处理,但在实际编程时,有专门的函数来设置该字段的各域。一些重要的网际应用协议中都设置了建议使用的TOS值:
从上表可以看出,对于与用户直接交互的应用,一般使用短延时;对于有大量数据需要进行传输的应用,一般选用高吞吐量;对于数据报要传输控制信息的应用,一般选用高可靠性。在数据报的生存期内不支持TOS的,TOS字段就设置为0x00。
4)总长度(16bit):占用16位二进制位,总长度字段是指整个IP数据报的长度(报头区+数据区),以字节为单位。利用头部长度字段和总长度字段就可以计算出IP数据报中数据内容的起始位置和长度。由于该字段长度为16位二进制数,因此理论上IP数据报最长可达65536个字节(事实上受物理网络的限制,要比这个数值小很多)。
5)生存时间(TTL,time to live)(8bit):占用8位二进制位,它指定了数据报可以在网络中传输的最长时间。实际应用中把生存时间字段设置成了数据报可以经过的最大路由器数。TTL的初始值由源主机设置(通常为32、64、128或256),一旦经过一个处理它的路由器,它的值就减1。当该字段为0时,数据报就丢弃,并发送ICMP报文通知源主机,因此可以防止进入一个循环回路时,数据报无休止地传输下去。
6)上层协议标识(8bit):占用8位二进制位,IP协议可以承载各种上层协议,目标端根据协议标识就可以把收到的IP数据报送到TCP或UDP等处理此报文的上层协议了。
常用网际协议编号:
7)校验和(16bit):占用16位二进制数,用于协议头数据有效性的校验,可以保证IP报头区在传输时的正确性和完整性。头部检验和字段是根据IP协议头计算出的检验和,它不对头部后面的数据进行计算。
原理:发送端首先将检验和字段置0,然后对头部中每16位二进制数进行反码求和的运算,并将结果存在校验和字段中。 由于接收方在计算过程中包含了发送方放在头部的校验和,因此,如果头部在传输过程中没有发生任何差错,那么接收方计算的结果应该是全1。
8)源IP地址(32bit):占用32位二进制数,表示发送端IP地址。
9)目的IP地址(32bit):占用32位二进制数,表述目的端IP地址。
3、UDP数据包格式
UDP 数据包分为 UDP 首部和有效数据两个部分。 UDP 首部由源端口,目的端口,报文长度以及校验和组成。相比 TCP, UDP 的传输效率更高,开销更小,但是无法保证数据传输可靠性。
首部各字段意义按顺序如下:
源端口号(16Byte):源主机的应用程序使用的端口号。
目的端口号(16Byte):目的主机的应用程序使用的端口号。
UDP 长度(16Byte):是指 UDP 头部和 UDP 数据的字节长度。因为 UDP 头部长度是8 字节,所以字段的最小值为 8。
UDP 校验和(16Byte):该字段提供了与 TCP 校验字段同样的功能;该字段是可选的。
三、参考资料
1、https://mp.weixin.qq.com/s/EJOdYYI8l7TCD2l1bdy3MA
2、征途Pro《FPGA Verilog开发实战指南——基于Altera EP4CE10》2020.12.16(下)
3、https://blog.csdn.net/wangzhen209/article/details/74453548