udp-协议
UDP 协议
核心定义
UDP(User Datagram Protocol,用户数据报协议)是无连接、不可靠、面向报文的传输层协议(RFC 768),与 TCP 同属传输层但设计哲学相反。
UDP 仅在 IP 数据报服务之上增加最基本的功能:复用/分用(端口) 和 差错检测(校验和),几乎不增加 IP 的负担。
UDP 首部仅 8 字节,包含四个字段:源端口、目的端口、长度、校验和,各占 2 字节。
UDP 的通信是无连接的:发送数据前不需要建立连接,发送结束后也没有连接释放过程,因此开销小、时延低。
UDP 采用面向报文的交付方式:应用层交下来的报文,UDP 既不合并也不拆分,保留报文边界,一次发送一个完整的报文。
flowchart LR
APP["应用层报文"] --> UDP["UDP 加 8B 首部"]
UDP --> IP["封装为 IP 数据报"]
UDP -.面向报文:不合并/不拆分.-> APP
关键细节 / 操作步骤
- 首部结构(8 字节):源端口(2B)+ 目的端口(2B)+ 长度(2B)+ 校验和(2B)。源端口可省略(填全 0),目的端口是分用的依据。
- 长度字段:指 UDP 用户数据报的总长度(首部 + 数据),最小值为 8(仅有首部无数据)。
- 校验和与伪首部:UDP 校验和既校验首部也校验数据,并且额外校验一个 12 字节的伪首部。伪首部 = 源 IP(4B)+ 目的 IP(4B)+ 全 0(1B)+ 协议(1B,UDP=17)+ UDP 长度(2B)。
- 伪首部的特殊性:伪首部既不在 UDP 报文中发送,也不计入 UDP 长度字段,只在计算校验和时临时拼接上去,目的是让 UDP 既校验数据完整性,又确认数据报送达正确的 IP 与协议。
- 面向报文:应用层给一个 100 字节报文,UDP 就发一个 100 字节报文;给一个 50 字节就发 50 字节。一次一个完整报文,由应用层自行控制报文大小合理(太大会被 IP 分片)。
- 无拥塞控制、无流量控制:网络拥塞时 UDP 不会降低发送速率,这也是流媒体/VoIP 倾向用 UDP 的原因之一(实时性 > 可靠性)。
- 差错处理:UDP 通过校验和检测差错,但不纠正——校验和出错时直接丢弃该数据报(或交给应用层附上差错标志),不重传。
- 通信方式:UDP 支持 一对一、一对多(广播/多播)、多对一、多对多通信,而 TCP 仅支持一对一点对点通信。多播能力是 UDP 独有的。
- 分用(demultiplexing):UDP 根据目的端口号,将收到的报文交付给对应的应用进程;常用 UDP 端口:DNS=53、DHCP=67/68、TFTP=69、SNMP=161、RIP=520。
- UDP vs TCP 六维度对比(核心考点,见下表)。
| 特性 | UDP | TCP |
|---|---|---|
| 连接性 | 无连接 | 面向连接(见 TCP 三次握手) |
| 可靠性 | 尽最大努力,不可靠 | 可靠交付(确认、重传) |
| 交付形式 | 面向报文(保留边界) | 面向字节流(无边界) |
| 首部开销 | 8 字节 | 20 字节(最小) |
| 流量控制 | 无 | 有(滑动窗口 / rwnd) |
| 拥塞控制 | 无 | 有(见 TCP 拥塞控制) |
| 通信方式 | 一对一/一对多/多对多 | 仅一对一 |
| 首部字段 | 源端口·目的端口·长度·校验和 | 源端口·目的端口·序号·确认号·数据偏移·标志·窗口·校验和·紧急指针·选项 |
易错辨析
- “UDP 没有差错检测”是错的:UDP 有校验和,能检测差错;只是不恢复(出错丢弃),不等于不检测。
- “UDP 校验和只校验数据”是错的:它既校验首部也校验数据,还额外校验伪首部。
- 伪首部不计入长度:伪首部只是计算校验和时的临时拼接,不发送、不计长度,否则首部就远超 8 字节。
- 面向报文 ≠ 面向字节流:UDP 保留报文边界(应用给什么发什么),TCP 把数据看作无结构字节流——这是两者传输方式的根本差异。
- “UDP 因为简单所以不可靠所以要避免”是错的:不可靠是 UDP 的主动选择(换来低时延、低开销、支持多播),不是缺陷;实时/海量数据场景反而更适合。
- 校验和在 IPv4 与 IPv6 中要求不同:IPv4 可省略校验和(填全 0),IPv6 中 UDP 校验和强制计算。
技巧与口诀
- 口诀:无连不可靠,面向报文小;伪首校验和,多播实时好。
- 端口分配三原则:熟知端口 0–1023、登记端口 1024–49151、客户端口 49152–65535。
- 应用选型:实时/广播/查询类 → UDP(DNS、DHCP、TFTP、SNMP、RIP、流媒体、VoIP、游戏);可靠传输/大数据 → TCP(HTTP、FTP、SMTP、SSH)。
- 记 UDP 首部:源目端口各两字节,长度校验和各两字节,合计八字节。
- 区分”检测”与”恢复”:UDP 能检测不能恢复,TCP 既检测又恢复。
真题闭环
题目:UDP 数据报首部共有几个字节?UDP 的校验和除了校验首部和数据外,还校验了什么?为什么这样设计?
解题思路:
- 审题抓”首部大小 + 校验范围 + 设计意图”,切入点是 8 字节首部 + 伪首部。
- UDP 首部 = 源端口 + 目的端口 + 长度 + 校验和,各 2 字节,共 8 字节。
- 校验和还额外校验 12 字节伪首部:源 IP + 目的 IP + 全 0 + 协议(17)+ UDP 长度。
- 设计意图:伪首部包含 IP 地址,使 UDP 既验证数据完整性,又验证数据报是否送达正确的 IP 和协议端口,防止 IP 层错投。
答案:UDP 首部 8 字节;校验和除首部和数据外,还校验 12 字节伪首部(源 IP·目的 IP·全 0·协议·UDP 长度);伪首部既不发送也不计入长度,仅用于校验和计算,目的是同时验证数据完整性与投递正确性。
cd ..