UDP 只提供最薄的一层
UDP 只做端口寻址与可选校验,不保证送达、不保证顺序、不保证不重复,也没有拥塞控制。用 UDP 就意味着上面这几件事要由应用层补齐:序号用于检测丢包与乱序,ACK 加定时器负责重传,去重保证幂等,接收窗口做流控。QUIC 与 KCP 正是把这些机制标准化后的产物,业务简单时也可以只做「重试加幂等」这两条。
基本信息
| 适用平台 | 任何支持 UDP 套接字的系统;内网 RPC、音视频、游戏、DNS 等均在其上自建可靠性 |
|---|---|
| 原理 | 应用层自行实现确认、重传、去重与流控 |
| 典型实现 | QUIC(RFC 9000)、KCP、各类自研私有协议 |
| 成本 | 实现与调优成本高,出错常表现为流量放大或拥塞崩溃 |
可靠性机制对照
| 机制 | 要解决的问题 | 简易做法 |
|---|---|---|
| 序号 | 丢包与乱序检测 | 每包递增 ID,接收侧维护窗口 |
| ACK 与重传 | 送达保证 | 定时器加指数退避,限制最大重试次数 |
| 去重 | 重复包 | 按 ID 幂等处理,服务端保留最近 ID 集合 |
| 分段 | 大消息超过单包限制 | 应用层分片并在接收侧重组、设重组超时 |
| 流控 | 压垮对端或链路 | 接收方通告可用额度,发送方限速 |
最小可靠 UDP(伪代码)
最小可靠 UDP(伪代码)
发送: id++, 存入待确认表, 启动定时器
超时: 重发(最多 N 次,退避加倍),达上限则上报失败
收到 ack(id): 从待确认表删除
收到 data(id): 去重后交付业务,回 ack(id)
# 关键补充:重传必须有速率上限与拥塞窗口,否则等于放大攻击流量典型使用场景
- 实时音视频:丢一帧比等重传更划算,可靠性只做局部
- 游戏状态同步:按最新状态覆盖旧值,允许旧包直接丢弃
- 内网低延迟 RPC:链路质量好时用 UDP 绕过 TCP 队头阻塞
- 已有 TCP 但受弱网影响的服务:用 KCP 之类的可靠 UDP 隧道换低延迟
别重复造 QUIC:通用场景直接用现成实现即可,只有对延迟极度敏感、且能自行承担实现与运维成本的场景才值得自研精简协议。
UDP 应用层重传若没有拥塞控制会打爆网络:高丢包时无限重试会引发拥塞崩溃,最终连正常的旁路流量也被波及。