首页/网络/协议速查/UDP 上的应用层可靠性
TCP 与 UDP54 条

UDP 上的应用层可靠性

用 UDP 就要自己实现:序号去重、ACK 重传、超时退避、流控;这些正是 QUIC/KCP 帮你做好的事,简单业务可只做「重试+幂等」。

协议速查网络更新于 2026-10-13

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 应用层重传若没有拥塞控制会打爆网络:高丢包时无限重试会引发拥塞崩溃,最终连正常的旁路流量也被波及。

易错点

  • 重传没有速率上限与退避:链路劣化时流量成倍放大,把偶发丢包放大成网络故障
  • 只做重传不做去重:重复包被业务当两次请求处理,出现重复扣款、重复下单这类事故
  • 按固定超时重传而不估算 RTT:在跨地域链路上要么重传过密、要么恢复过慢
  • 把可靠 UDP 当万能替代:丢包率高的公网链路上,自研协议的公平性与穿透表现通常不如成熟的 QUIC 实现

数据来源与参考

  • RFC 9000 §2(QUIC 可靠性设计)
  • RFC 5405(UDP 使用指南)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌