UDP报文由8字节首部(源端口、目的端口、长度、校验和)和用户数据组成,面向数据报、无连接、不重传;封装于IP报文中,协议号为17;接收缓冲区满时静默丢包。

Linux 中 UDP 报文结构非常简洁,由固定 8 字节首部和可变长用户数据组成,不带连接状态、不拆分合并、也不重传。理解它的字段含义和封装边界,是写好 UDP 网络程序的基础。
UDP 首部的四个 16 位字段
首部共 8 字节,按顺序依次为:
- 源端口:发送方应用进程绑定的端口号,0 表示未指定;常由内核随机分配(如客户端)。
- 目的端口:接收方进程监听的端口号,知名服务如 DNS(53)、NTP(123)等有约定值。
- 长度:整个 UDP 数据报字节数(首部 + 用户数据),最小为 8,最大为 65535;注意该值由内核自动填入,应用层不可直接修改。
- 校验和:用于检测传输错误,覆盖伪首部(IP 源/目的地址、协议号、UDP 长度)、UDP 首部和用户数据;值为 0 表示校验禁用,但 Linux 默认启用。
用户数据的封装与边界特性
UDP 是面向数据报的协议,应用层交给内核多大的数据块,就原样封装成一个报文发出:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 调用
sendto()一次发 1024 字节,接收端必须用一次recvfrom()完整读取 1024 字节,不能分多次读取。 - 若应用层数据超过 IP 层 MTU(通常 1500 字节),IP 层会自动分片;但 UDP 本身不处理分片重组,丢一片整包失效。
- 单个 UDP 报文最大有效载荷为 65527 字节(65535 − 8),但实际受限于链路 MTU 和内核 socket 缓冲区大小,通常建议控制在 1472 字节以内(1500 − 20(IP首部) − 8(UDP首部))以避免分片。
UDP 在协议栈中的封装位置
UDP 数据报不是独立在网络上传输的,它始终作为 IP 数据报的载荷存在:
- IP 首部中“协议”字段值为 17,标识上层承载的是 UDP。
- 封装顺序为:IP 首部 + UDP 首部 + 用户数据。
- 接收时,内核按协议字段识别出 UDP,剥掉 IP 首部后,将剩余部分交由 UDP 模块处理;校验通过后,再剥离 UDP 首部,把纯用户数据拷贝进 socket 接收缓冲区。
UDP 接收缓冲区与丢包行为
Linux UDP 只维护接收缓冲区,没有发送缓冲区:
- 应用调用
sendto()后,数据立即交由内核网络栈处理,不排队等待确认。 - 接收缓冲区满时,新到达的 UDP 报文会被静默丢弃,不会通知应用层 —— 这是 UDP 不可靠性的底层体现之一。
- 可通过
net.core.rmem_max调整最大接收缓冲区大小,用setsockopt(..., SOL_SOCKET, SO_RCVBUF, ...)设置单 socket 缓冲区。

















