UDP数据包结构组成
关于数据字段的长度解释
在标准IPV4协议中,以太网帧的最大MTU是1500字节,这指的是IP数据包的最大大小。这个大小包括了IP头部、UDP头部和UDP数据部分,IPV4标准下,IP头部长度为20字节,UDP头部全为8字节,故使用标准的IPV4和UDP协议,UDP报文的数据部分最大长度为
1500 - IP头部 - UDP头部 === 1500 - 20 - 8 = 1472字节
而对于最小字节18的计算则是,在以太网中,最小帧长度为64字节,以太网帧头为14字节,尾部CRC校验和为4字节,则要求数据部分最小为46字节,而这里的数据部分包含了IP头部和UDP头部,28字节,故UDP数据报文的最小长度即为18字节。
最小帧长度要求的主要原因是为了确保帧在网络中能够正确地被检测到并有效传输。以太网协议使用的是碰撞检测机制(在共享介质的网络中),最小帧长度的存在保证了在发生碰撞时,能够有足够的时间进行检测和处理。
如果帧的长度小于最小值(即小于64字节),以太网硬件会在发送端填充额外的字节(通常是0)直到达到最小长度。因此,发送的数据部分可以是少于46字节的数据,通过填充空字节来满足最小帧长度要求。
在FPGA实现UDP协议栈的设计中,充分考虑以太网最小帧长的要求。
UDP报文组包格式
由文章开篇的贴图可知,UDP首部为8字节,而千兆以太网的传输标准是8bit,故在接收数据报文后,需要对数据报文进行缓存或延迟处理,先进行UDP首部的处理,对于数据报文的缓存或是延迟,可以考虑使用FIFO,或者是移位RAM实现。移位RAM的处理方式更加简单,只需要设定固定的延迟深度即可,关于UDP首部中地UDP校验和的问题。
其校验和的计算方式是UDP伪首部+UDP首部+UDP数据部分
对于校验和的计算,会引入固定的延迟周期,提高了协议处理开销,而UDP作为一种无连接,实时应用协议,可以不进行UDP校验和,降低协议处理开销,故在本设计中,除非必要地校验和计算,其他校验和进行省略。
UDP的组包处理流程是十分简单的,在FPGA中,UDP层接收到FPGA侧上层用户传来的数据报文后,对数据报文做缓存或延迟处理,进行帧头的封装后,再在帧头尾部进行数据报文的传输即可。
UDP发送数据的代码编写与仿真测试
代码的逻辑架构在前文中,已进行详细介绍,在这里便不做展示,只对仿真测试结果进行分析与验证
仿真测试1,用户层传输32字节数据,0~31,源端口为8080,目的端口为8081
仿真图中数据为16进制显示
通过仿真可知,UDP组包成功
仿真测试2,用户层传输10字节数据,0~9,不满18字节,源端口为8080,目的端口为8081
仿真图中数据为16进制显示
通过仿真可知,UDP组包成功,并且由于用户层数据不满18字节,程序内部在报文结尾进行了补零操作。