UDP协议
-
- 一、UDP协议诞生背景与作用
-
- [1.1 为什么需要UDP?](#1.1 为什么需要UDP?)
- [1.2 UDP与TCP的对比](#1.2 UDP与TCP的对比)
- 二、UDP报文格式
-
- [2.1 UDP结构](#2.1 UDP结构)
- [2.2 IP 首部](#2.2 IP 首部)
- [2.3 UDP 字段](#2.3 UDP 字段)
- [2.4 UDP伪头部(校验和计算)](#2.4 UDP伪头部(校验和计算))
- [2.5 抓包分析](#2.5 抓包分析)
- 三、UDP的端口号
-
- [3.1 端口号范围](#3.1 端口号范围)
- [3.2 常见UDP端口](#3.2 常见UDP端口)
- 四、常见基于UDP的协议
-
- [4.1 DNS(域名系统,端口53)](#4.1 DNS(域名系统,端口53))
- [4.2 DHCP(动态主机配置协议,端口67/68)](#4.2 DHCP(动态主机配置协议,端口67/68))
- [4.3 TFTP(简单文件传输协议,端口69)](#4.3 TFTP(简单文件传输协议,端口69))
- [4.4 NTP(网络时间协议,端口123)](#4.4 NTP(网络时间协议,端口123))
- [4.5 RTP(实时传输协议)](#4.5 RTP(实时传输协议))
- [4.6 QUIC(Quick UDP Internet Connections)](#4.6 QUIC(Quick UDP Internet Connections))
一、UDP协议诞生背景与作用
1.1 为什么需要UDP?
在TCP/IP协议栈中,TCP提供了可靠的、面向连接的传输服务,但它带来了额外的开销:
- 三次握手建立连接
- 确认和重传机制
- 流量控制和拥塞控制
- 顺序保证
这些特性在某些场景下是不必要的负担:
| 场景 | 为什么TCP不适用 |
|---|---|
| 实时音视频 | 重传会导致卡顿,宁可丢包也不等重传 |
| DNS查询 | 一个请求一个响应,不需要建立连接 |
| 网络游戏 | 延迟比可靠性更重要,旧数据无意义 |
| SNMP监控 | 少量数据,丢包可由应用层处理 |
| DHCP | 广播请求,TCP不支持广播 |
UDP(User Datagram Protocol,用户数据报协议) 的定位是:
提供一种无连接、不可靠、基于数据报的传输服务,最小化协议开销。
1.2 UDP与TCP的对比
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 确认、重传、序列号 | 不保证,丢包不重传 |
| 顺序保证 | 按序交付 | 不保证,可能乱序 |
| 流量控制 | ✅ 滑动窗口 | ❌ |
| 拥塞控制 | ✅ | ❌ |
| 校验和 | 可选(IPv4)/ 强制(IPv6) | 强制 |
| 报文边界 | 字节流,无边界 | 数据报,保留边界 |
| 广播/组播 | ❌ | ✅ |
| 头部开销 | 20-60字节 | 8字节 |
| 适用场景 | 文件传输、Web、邮件 | 实时通信、DNS、DHCP、SNMP |
核心差异:TCP是"电话"(建立连接、可靠传输),UDP是"明信片"(扔出去不管,可能丢失)。
二、UDP报文格式
2.1 UDP结构

2.2 IP 首部

- 版本 :4位IP版本号(Version),这个值设置为二进制的 "0100" 时表示 IPv4,设置为 "0110" 时表示 IPv6,目前使用比较多的IP协议版本号是 4
- 首部长度 : 4位首部长度(IHL,Internet Header Length),表示IP首部一共有多少个 32bits(4个字节)。最大可表示15个 32 bits,因此 IP 的首部长度最大值为 60 字节
- 服务类型 :8位服务类型(TOS,Type of service),该字段被划分成两个子字段:3位优先级字段(现在已经基本忽略掉了)和4位TOS字段,最后一位固定为0。服务类型为0时表示一般服务
- 总长度 :16位IP数据报总长度(Total Length),包括IP首部和IP数据部分,以字节为单位。我们利用IP首部长度和IP数据报总长度,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16bit,所以IP数据报最长可达65535字节。尽管理论上可以传输长达65535字节的IP数据报,但实际上还要考虑网络的最大承载能力等因素
- 标识 :16位标识(Identification)字段,用来标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1
- 标志 :3位标志(Flags)字段
- 最高位为保留位
- 中间位是 DF (Don't Fragment),表示禁止分片,只有 DF = 0 时才允许分片
- 最低位是 MF (More Fragment),MF = 1 表示后面还有分片,MF = 0 表示最后一个分片
- 片偏移 :13位片偏移字段,指较长的分组在分片后某片在原分组中的相对位置,以 8 字节为偏移单位,也就是说每个分片的长度一定是 8 字节的整数倍
- 生存时间 :8位生存时间字段TTL(Time To Live),设置了数据报可以经过的最多路由器数,表示数据报在网络上生存多久,防止丢失的数据包在无休止的传播TTL的初始值由源主机设置,一般为32、64或者128,一旦经过一个路由器,它的值就减 1,减到 0 时,数据报就丢弃,并发送 ICMP 消息通知源主机
- 协议 :8位协议(Protocol)类型,指出此数据报携带的数据使用何种协议以便目的主机的 IP 层将数据部分上交给哪个处理过程。 0x01 表示为 ICMP 协议, 0x02 表示为 IGMP 协议, 0x06 表示为 TCP 协议, 0x11 表示为 UDP 协议
- 首部校验和 :16位首部校验和(Header Checksum),该字段只校验数据报的首部,不包含数据部分;校验IP数据报头部是否被破坏、篡改和丢失等。
- 源 IP 地址 :32位源IP地址(Source Address),即发送端的IP地址,如192.168.1.123
- 目的 IP 地址 :32位目的IP地址(Destination Address),即接收端的IP地址,如192.168.1.102
- 可选字段 :是数据报中的一个可变长度的可选信息,选项字段以32bit为界,不足时插入值为0的填充字节,保证IP首部始终是32bit的整数倍,没有的话长度可以为 0 。
IP首部校验和的计算方法:
1、将16位检验和字段置为0,然后将IP首部按照16位分成多个单元;
2、对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位);
3、此时仍然可能出现进位的情况,将得到的和再次分成高16位和低16位进行累加;
4、最后将得到的和的反码填入校验和字段。

2.3 UDP 字段
| 字段 | 长度 | 含义 | 说明 |
|---|---|---|---|
| 源端口 | 2字节 | 发送方的端口号 | 可选,不需要时可填0 |
| 目的端口 | 2字节 | 接收方的端口号 | 必须,用于区分应用层协议 |
| 长度 | 2字节 | UDP头部+数据的总长度 | 最小值8(无数据),最大值65535 |
| 校验和 | 2字节 | 检测数据完整性 | 强制(IPv4可选,IPv6强制),覆盖UDP头部+数据+伪头部 |
注意:
- UDP长度字段是冗余的,因为IP头部也有总长度字段,但UDP自己保留一份
- 最大UDP数据报长度 = 65535 - 8(UDP头) - 20(IP头) = 65507字节
- 实际以太网MTU为1500,超过需要分片
2.4 UDP伪头部(校验和计算)
UDP校验和不仅覆盖UDP头部和数据,还覆盖一个伪头部(Pseudo Header),用于验证数据是否正确到达目标。
伪头部结构(IPv4):

伪头部的作用:
- 确保UDP数据报正确到达目标IP和端口
- 如果IP地址不匹配,校验和会失败
- 伪头部不传输,只在计算校验和时临时构造
校验和计算规则:
- 将伪头部 + UDP头部 + UDP数据(如果UDP数据长度为奇数,在计算校验和时,末尾追加一个0字节作为填充。)按16位为单位进行求和
- 每16个bit(即2个字节)组成一个数,相加,如果超过16个bit,把超过的高位值加到这16个bit值上,得到的新值再和下一个值相加
- 如果最后还剩8个bit值,不能简单的加到低位,要把这8个bit当成高位值,再用0填充一个16个bit值,相加
- 最后取反,填充到校验和字段
2.5 抓包分析

三、UDP的端口号
3.1 端口号范围
| 范围 | 分类 | 说明 |
|---|---|---|
| 0-1023 | 知名端口(Well-Known Ports) | 系统占用,需要root/admin权限 |
| 1024-49151 | 注册端口(Registered Ports) | 应用注册使用 |
| 49152-65535 | 动态/私有端口(Dynamic/Private) | 临时分配,客户端使用 |
3.2 常见UDP端口
| 端口 | 协议 | 用途 |
|---|---|---|
| 53 | DNS | 域名解析 |
| 67/68 | DHCP | 动态主机配置 |
| 69 | TFTP | 简单文件传输 |
| 123 | NTP | 网络时间同步 |
| 161 | SNMP | 网络管理 |
| 514 | Syslog | 系统日志 |
| 520 | RIP | 路由信息协议 |
| 1900 | SSDP | 简单服务发现(UPnP) |
| 5353 | mDNS | 组播DNS |
| 33434-33500 | traceroute | 经典UDP traceroute使用 |
四、常见基于UDP的协议
4.1 DNS(域名系统,端口53)
工作流程:
- 客户端发送UDP DNS查询(域名→IP)
- DNS服务器响应(通常UDP,超过512字节可能用TCP)
- 一次查询一个响应,无连接
为什么用UDP:
- 请求响应模式,不需要建立连接
- 数据量小(通常)
- 延迟敏感
4.2 DHCP(动态主机配置协议,端口67/68)
工作流程:
- 客户端广播DHCP Discover(UDP)
- 服务器响应DHCP Offer
- 客户端请求DHCP Request
- 服务器确认DHCP ACK
为什么用UDP:
- 需要广播(客户端不知道服务器IP)
- 基于事务,不需要长期连接
- 简单高效
4.3 TFTP(简单文件传输协议,端口69)
- 基于UDP的可靠文件传输
- 应用层实现:ACK确认、超时重传
- 每个数据块(512字节)都需要确认
- 用于网络设备配置上传/下载、PXE网络启动
4.4 NTP(网络时间协议,端口123)
- 高精度时间同步
- UDP低延迟,适合时间戳传输
- 客户端-服务器模式
4.5 RTP(实时传输协议)
- 音视频实时传输
- 容忍丢包,不能容忍重传延迟
- 常用于VoIP、视频会议、直播
4.6 QUIC(Quick UDP Internet Connections)
- 基于UDP的可靠传输协议(由Google开发,现为IETF标准)
- 在UDP之上实现了TCP的可靠性 + TLS加密
- 解决TCP的队头阻塞问题
- HTTP/3底层使用QUIC