12. UDP协议概述
二.UDP协议报文
一、UDP 报文整体结构
UDP报文分为两部分,整体结构非常清晰:
- 首部(固定8字节):包含寻址和校验信息,没有可变部分/选项字段。
- 数据部分:应用层数据,长度可变(可以为0字节,即只有首部)。
和TCP报文相比,UDP首部没有任何复杂的控制字段(如seq/ack、标志位、窗口),是为了追求低延迟、低开销而设计的。
二、首部4个字段详解(按顺序)
每个字段都是16位(2字节),4个字段加起来正好是8字节:
| 字段名 | 长度 | 核心作用 | 关键细节 |
|---|---|---|---|
| 源端口号 | 16位 | 发送方进程的端口标识 | 可选字段:如果不需要对方回复,可以设为0;需要回复时,对方会用这个端口作为目的端口 |
| 目的端口号 | 16位 | 接收方进程的端口标识 | 必须字段:用来把UDP报文交付给主机上对应的应用进程(比如DNS用53,TFTP用69) |
| UDP长度 | 16位 | 整个UDP报文的总长度(首部+数据) | 单位:字节;最小值为8(仅首部,无数据);最大值为65535字节;和IP首部的“总长度”区分:IP总长度是IP包的长度,UDP长度是UDP包的长度 |
| UDP检验和 | 16位 | 校验UDP报文的完整性 | 可选字段:部分实现支持不校验(设为0),但实际网络中通常会校验;计算时会包含IP层的伪首部,防止报文发错主机 |
三、UDP 与 TCP 的核心区别(结合你之前学的内容)
结合你之前学的TCP报文、三次握手/四次挥手,两者的差异一目了然:
| 特性 | UDP | TCP |
|---|---|---|
| 连接性 | 无连接:不建立三次握手,直接发包 | 面向连接:必须三次握手建立连接后再传输 |
| 可靠性 | 不保证可靠:不重传、不排序、不确认 | 可靠传输:通过seq/ack、重传、窗口机制保证数据按序不丢 |
| 数据模型 | 面向报文:每个UDP包是一条完整消息,无粘包问题 | 面向字节流:数据是连续字节流,存在粘包/拆包问题 |
| 首部开销 | 固定8字节,极小 | 可变20-60字节,控制字段多,开销大 |
| 适用场景 | 实时性要求高、丢包不敏感的场景(如DNS、视频通话、游戏、直播) | 可靠性要求高的场景(如网页、文件传输、数据库) |
四、补充:UDP 检验和的伪首部(关键细节)
UDP检验和计算时,会额外加上IP层的伪首部,包含:
- 源IP地址
- 目的IP地址
- 协议号(UDP为17)
- UDP长度
这样做的目的是:
- 防止UDP报文被错误转发到其他主机;
- 确保UDP报文的IP地址信息没有被篡改;
- 虽然UDP本身不可靠,但伪首部校验能减少错误交付的概率。
五、代码层面的UDP首部定义(和C语言结构体对应)
在网络编程中,UDP首部的结构体定义和图里的格式1:1对应:
structudphdr{uint16_tsource;// 源端口号uint16_tdest;// 目的端口号uint16_tlen;// UDP长度(首部+数据)uint16_tcheck;// UDP检验和};结构体的每个成员正好对应图中的4个字段,总大小固定为8字节,和UDP首部的设计完全一致。
