一、什么是UDP协议
前面已经介绍了以太网协议(以太网帧格式解析-CSDN博客)、ARP协议(以太网ARP协议解析_以太网arp包-CSDN博客)和ICMP协议(以太网ICMP协议-CSDN博客),下面我们介绍一下UDP协议。
UDP协议,是一种面向无连接的传输层协议。同ICMP一样,UDP协议也是基于IP协议的一种协议。
其优点:消耗资源少,通信效率高,适合FPGA实现。
缺点:可靠性差,数据可能出现丢包。
二、UDP数据协议结构
协议类型 | 名称 | 字节数 | 数值 | 含义 |
数据同步 | 前导码 | 7字节 | 0x55_5555_ 5555_5555 | 同步码,通过串行数据的“01”交替,实现数据的同步。 |
帧起始界定符 | 1字节 | 0xD5 | 表示一帧的开始。后面紧跟以太网的帧头 | |
以太网协议(14字节帧头) | 目的MAC地址 | 6字节 | / | 以太网协议的第一个字段。指示目标设备(接收端)的MAC地址。分为广播地址、单播地址和多播地址。广播地址的数值为0xFFFF_FFFF_FFFF,用于和所有设备进行通信。 |
源MAC地址 | 6字节 | / | 发送端的MAC地址。 | |
长度/类型 | 2字节 | / | 当该字段的数值小于1536个字节时,表示的是数据的长度。 当为0x0800时,表示该数据包是IPv4协议包。 当为0x08DD时,表示该数据包是IPv6协议包。 当为0x0806时,表示该数据包是ARP协议包。 | |
IP 协议(20字节首部,4字节对齐) | 版本 | 0.5字节 | / | IP 协议版本号。二进制的 0100 时表示 IPv4,设置为 0110 时表示 IPv6 |
首部长度 | 0.5字节 | / | 表示 IP 首部一共有多少个 32 位(4 个字节)。没有可选字段时,首部有20个字节,此处为5. | |
服务类型 | 1字节 | / | 服务类型为0时,表示一般服务。 | |
总长度 | 2字节 | / | IP数据报文总长度,包括首部+数据部分 | |
标识 | 2字节 | / | 表示数据报文的ID号,每发送一次报文,ID加1 | |
标志 | 0.5字节 | / | 3 位标志(Flags)字段, 第 1 位为保留位; 第 2 位表示禁止分片(1 表示不分片 0:允许分 第 3 位标识更多分片(除了数据报的最后一个分片外,其它分片都为 1)。 | |
片偏移 | 1.5字节 | / | 在接收方进行数据报重组时用来标识分片的顺序 | |
生存时间 | 1字节 | / | 防止丢失的数据包在网络中无休止的传播,一般设置为64或者128。 | |
协议 | 1字节 | / | 表示此数据报所携带上层数据使用的协议类型,ICMP 为 1,TCP 为6,UDP 为 17。 | |
首部校验和 | 2字节 | / | 该字段只校验数据报的首部,不包含数据部分 | |
源IP地址 | 4字节 | / | / | |
目的IP地址 | 4字节 | / | / | |
可选字段 | / | / | 可有可无,一般忽略的时候,首部为20字节。注意可选字段长度必须是4字节整数倍。 | |
UDP协议(8个字节帧头) | 源端口号 | 2字节 | / | / |
目的端口号 | 2字节 | / | / | |
UDP长度 | 2字节 | / | 首部长度+数据长度 | |
UDP校验和 | 2字节 | / | 大多数场景不检测校验,此处忽略 | |
数据 | N字节 | / | ||
以太网协议 | FCS | 4字节 | / | / |
三、实例解析
此处不再赘述wireshark抓包数据。有兴趣参考ARP或ICMP的抓包数据即可。
四、FPGA代码实现
这里提供代码实现的参考,一份是米联客的代码工程,一份是正点原子的代码工程。前者的UDP模块为DCP文件,后者提供verilog源码。