UDP协议
UDP 是 TCP/IP 协议族中传输层的一个核心协议。它被设计成一种极简的、面向报文的传输协议。它在 IP 协议提供的不可靠服务之上,仅增加了两个最基本的服务:复用/分用(端口号)和差错检测(校验和)。
1. UDP 的核心特性
- 面向无连接:发送数据之前不需要建立连接(没有三次握手),发送结束后也没有连接释放(没有四次挥手)。
- 不可靠交付:它不保证数据包能成功到达目的地,也不保证按序到达,更没有重传机制。数据发出去后,UDP 就不再管了。
- 面向报文:UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给 UDP 多长的报文,UDP 就发多长。
- 无拥塞控制与流量控制:UDP 永远以恒定的速度发送数据,不管网络是否拥堵。这对于实时应用(如直播)非常重要。
- 支持一对一、一对多(广播/多播)通信:这是 TCP 做不到的。
- 首部开销极小:只有 8 个字节,比 TCP 的 20 字节轻量得多。
2. UDP 报文首部结构 (仅 8 字节)
UDP 的简洁在其首部体现得淋漓尽致。
| 字段名 | 长度 | 说明 |
|---|---|---|
| 源端口 (Source Port) | 16 位 | 发送方的进程端口号。 |
| 目的端口 (Destination Port) | 16 位 | 接收方的进程端口号。 |
| 长度 (Length) | 16 位 | UDP 用户数据报的长度(包含首部和数据),最小值为 8。 |
| 校验和 (Checksum) | 16 位 | 检测 UDP 数据报在传输中是否有错。如果有错,直接丢弃。 |
3. UDP vs. TCP 深度对比
这是网络面试中最经典的问题,通过表格可以直观看出两者的取向:
| 特性 | UDP | TCP |
|---|---|---|
| 连接性 | 无连接 | 面向连接 |
| 可靠性 | 不可靠(尽力而为) | 可靠(保证送达、不乱序) |
| 传输方式 | 面向报文(保留数据边界) | 面向字节流(无边界) |
| 传输速度 | 极快(无握手开销) | 较慢(机制复杂) |
| 首部开销 | 8 字节 | 20 ~ 60 字节 |
| 流量/拥塞控制 | 无 | 有 |
| 资源消耗 | 低 | 高 |
| 适用场景 | 实时视频、在线游戏、DNS、直播 | 文件传输、邮件、网页浏览 |
| 优点 | 安全、快速、漏洞少 | 稳定、重传机制、拥塞控制机制、断开连接 |
| 缺点 | 不可靠、不稳定、容易丢包 | 速度慢、效率低、占用资源、容易被攻击(三次握手->DDOS攻击) |
4. UDP 的典型应用场景
为什么在明知不可靠的情况下,我们还要使用 UDP?答案是:低延迟和实时性。
- 实时流媒体/视频会议 (VoIP):在语音通话或直播中,丢掉一两个数据包(画面花一下或声音断一下)是可以接受的,但如果因为等待重传而导致长达数秒的延迟,通话就没法进行了。
- 在线游戏:在快节奏游戏中(如 FPS 或 MOBA),即时位置信息比历史位置更重要。丢了旧包没关系,只要下一个新包能快点到就行。
- DNS (域名系统):查询域名的请求很短。如果用 TCP,握手就需要 3 个包,查询才 1 个包,太浪费了。用 UDP 一问一答,效率最高。
- 广播与多播:例如局域网内的设备发现、视频广播。TCP 无法实现一对多。
- 简单网络协议:如 DHCP(动态主机配置)、SNMP(简单网络管理)。
5. 常见问题 (FAQ) 与面试热点
5.1 UDP 是不可靠的,如果我非要在 UDP 上实现可靠传输怎么办?
- 答案:这需要在应用层(你写的代码里)自己实现可靠性机制。
- 具体做法:你可以模仿 TCP,在应用层逻辑中加入序列号、确认应答(ACK)和超时重传。
- 现代案例:QUIC 协议(HTTP/3 的底层)。QUIC 就是基于 UDP 的,但它在 UDP 之上通过算法实现了类似 TCP 的可靠性、拥塞控制,同时又保留了 UDP 快、连接迁移等优点。
5.2 UDP 报文的大小有限制吗?
- 理论上:UDP 长度字段是 16 位,最大可达 65535 字节。
- 实际上:受限于底层 IP 层和以太网的 MTU(最大传输单元,通常是 1500 字节)。
- 为了避免在 IP 层被切片(切片会导致效率降低且增加丢包风险),建议 UDP 载荷控制在 1472 字节以内(1500 - 20 字节 IP 首部 - 8 字节 UDP 首部)。
5.3 UDP 会发生粘包吗?
- 答案:绝对不会。
- 原因:粘包是 TCP 这种“面向字节流”协议特有的问题。UDP 是“面向报文”的,它有明确的数据边界。发送方发一个包,接收方就收一个完整的包,不会出现多个包粘在一起的情况。
5.4 为什么 UDP 适合用于 DDoS 攻击(如 NTP 反射攻击)?
- 无连接性:黑客可以非常容易地伪造源 IP 地址发送 UDP 包,而不需要像 TCP 那样建立握手。
- 放大效应:攻击者利用 UDP 向某些服务器(如 DNS 或 NTP)发送微小的请求,诱导服务器向受害者的 IP 发回巨大的响应数据包,从而以极小的代价瘫痪受害者的网络。
5.5 校验和(Checksum)是必须的吗?
- 在 IPv4 中,UDP 校验和是可选的(但强烈建议开启)。
- 在 IPv6 中,为了保证基本的安全性,UDP 校验和是强制性的。
5.6 UDP 发送太快会导致接收方缓冲区溢出吗?
- 会。 既然 UDP 没有流量控制,如果发送方拼命发,而接收方来不及从内核缓冲区读取数据,缓冲区就会满。一旦满了,后续到达的 UDP 包会被系统直接丢弃。
5.7 既然 UDP 不可靠,那 DNS 丢包了怎么办?
- DNS 客户端在发出请求后会启动一个超时定时器。如果在一定时间内没有收到 UDP 响应,客户端会再次发起请求。这种简单的重试机制对于 DNS 这种轻量级交互来说成本非常低。