注:本文基于模型知识整理,建议结合权威教材与 RFC 原文核对细节。
一句话定义
传输层在两台主机之间提供「进程到进程」的端到端逻辑通信;UDP(User Datagram Protocol,用户数据报协议)是其中最简的一种:8 字节首部、无连接、只承诺尽最大努力交付。
为什么重要
网络层把数据报送到目的主机就交棒了,而主机上同时运行着几十个进程,数据必须交给正确的那个——这最后一跳由传输层的端口号完成。UDP 也是理解 TCP 的参照系:先看清一个传输层协议「可以不做什么」,才能明白 TCP 为什么需要那么复杂。此外 DNS、DHCP、实时音视频以及承载 HTTP/3 的 QUIC 都跑在 UDP 之上,技术选型绕不开它的边界。
前置知识
建议先读 kp-004《网络层与 IP 协议》,需要理解 IP 数据报、主机寻址与分组转发的概念;若熟悉进程与套接字(socket)编程接口,端口机制的落地会更直观。
核心概念
- 端口(port):16 位整数,范围 0~65535。0~1023 为熟知端口(well-known port),如 DNS 53、HTTP 80;1024~49151 为注册端口(registered port);更高段为动态/临时端口(ephemeral port),由内核为出站连接随机分配。
- 套接字标识:UDP 只需二元组(目的 IP, 目的端口)即可定位进程;TCP 连接由四元组(源 IP, 源端口, 目的 IP, 目的端口)唯一标识,因此服务器同一个端口可同时服务成千上万条 TCP 连接,而 UDP 端口同一时刻通常只绑定一个套接字。
- 多路复用与多路分解(multiplexing / demultiplexing):发送侧把各进程数据加上端口号汇聚发出,接收侧按端口号拆分分发,这是传输层的本职工作。
- UDP 首部固定 8 字节,四个字段各 2 字节:源端口(可填 0 表示匿名)、目的端口、长度(首部加数据的总字节数)、校验和(checksum)。计算校验和时要叠加由源/目的 IP 等组成的 12 字节伪首部(pseudo header),目的是把「这份数据确实发给了正确的主机」也纳入校验;IPv4 中校验和可选,IPv6 中强制。
图示
UDP 数据报结构(伪首部仅参与校验和计算,不随报文传输)
+------------+------------+
| 源端口 | 目的端口 |
+------------+------------+
| 长度 | 校验和 |
+------------+------------+
| 应用层报文(边界原样保留) |
+--------------------------------+原理与机制
UDP 有四个公认特点。其一,无连接:发送前不握手、无状态,拿到数据直接封装发出。其二,尽最大努力交付(best-effort delivery):不保证不丢、不保证有序、不重传,IP 层丢什么它就丢什么。其三,面向报文(message-oriented):应用交多长就发多长,报文边界原样保留,接收方一次 recv 恰好取回一个应用报文,不存在 TCP 那样的「粘包」。其四,无拥塞控制:网络再拥塞它也照常全速发送——对实时应用是优点(不会为重传排队等待),对全网却可能火上浇油。
适用场景随之清晰:DNS、DHCP 这类一问一答、重发比等待便宜的查询;实时音视频,宁可丢一帧也不要迟到数秒;以及 QUIC——它把可靠性、拥塞控制与加密在用户态重新实现,只借用 UDP 的端口寻址和穿透能力。「面向报文 + 无拥塞控制」既是优点也是软肋,而 QUIC 用 UDP 重建了可靠性,正是这对特性的另一种用法(衔接 kp-025)。
实例分析
一次 DNS 查询:客户端内核选一个临时端口(如 51432)作源端口,目的端口 53;请求与应答各为一个 UDP 报文,一来一回完成。超时未收到应答,由应用层自行重发同一查询。若改用 TCP:三次握手加四次挥手要付出约十个控制报文的代价,只为完成一个不重传就能结束的短查询,得不偿失——这就是一问一答场景选 UDP 的经济账。
常见误区
一,「UDP 不可靠所以校验和没用」:校验和能发现比特翻转,只是不提供恢复手段,发现即丢弃。二,「无拥塞控制所以 UDP 一定更快」:公网高丢包环境下无重传可能反而更慢,快慢取决于链路与应用,不是协议标签。三,「UDP 完全不占资源」:端口表项与套接字缓冲区照样存在,UDP 服务同样会被打满打挂。四,把「面向报文」当成「UDP 替你管分片」:过大报文仍会触发 IP 分片,任一分片丢失整份报文作废,大报文应由应用层自行分包。
自测题
- 为什么 TCP 服务器的一个端口能同时服务上万条连接,UDP 却不行?
答案要点: TCP 连接由四元组唯一标识,端口只是其中之一,不同源地址与端口可复用同一本地端口;UDP 按二元组定位,套接字与目的端口绑定,粒度更粗。
- UDP 校验和为什么要引入伪首部?
答案要点: 把源 IP、目的 IP 等纳入校验范围,防止报文被误投到错误主机仍校验通过;伪首部只参与计算、不随报文传输。
- 实时视频会议为什么常选 UDP 而非 TCP?
答案要点: 实时场景下迟到的数据没有价值;TCP 的重传与队头阻塞会累积延迟,UDP 让应用自行丢弃迟到数据并用前向纠错补偿丢包。
- 一次发送 64KB 的 UDP 报文有什么隐患?
答案要点: 超过接口 MTU 触发 IP 分片,任一分片丢失则整份报文无法重组;应在应用层控制报文尺寸并自行分包。
延伸阅读
- RFC 768《User Datagram Protocol》
- RFC 9293《Transmission Control Protocol (TCP)》中端口与多路分解语义可对照阅读
- 谢希仁《计算机网络》(第 8 版)传输层章节
- W. Richard Stevens《TCP/IP 详解 卷 1:协议》(第 2 版)第 11 章