跳转至

UDP 与 QUIC

学习目标

学完本章后,学习者应该能够:

  1. 理解 UDP 的特点和适用场景。
  2. 知道 UDP 为什么需要应用层处理丢包、乱序和重传。
  3. 理解 QUIC 的基本目标和它与 HTTP/3 的关系。
  4. 能判断什么时候不应该用 UDP。

UDP 的特点

UDP 是无连接、不保证可靠、不保证顺序的传输协议。

特点:

  • 头部简单。
  • 无连接握手。
  • 延迟低。
  • 不保证送达。
  • 不保证顺序。
  • 不做拥塞控制。

UDP 不是“更快的 TCP”,而是把可靠性、顺序、拥塞控制等责任交给应用层。

UDP 适用场景

常见场景:

  • DNS 查询。
  • 实时音视频。
  • 游戏同步。
  • 指标或日志采样上报。
  • 自定义可靠协议的底层传输。

如果业务不能接受丢包、乱序、重复,就要在应用层补机制,或者直接使用 TCP / HTTP / gRPC。

QUIC 与 HTTP/3

QUIC 是基于 UDP 的传输协议,目标是改善 TCP + TLS + HTTP/2 的一些问题。

它提供:

  • 内置 TLS 加密。
  • 更快连接建立。
  • 多路复用。
  • 减少队头阻塞。
  • 连接迁移。

HTTP/3 基于 QUIC。对后端工程师来说,先理解它解决的问题即可,不必一开始深入所有细节。

Go 后端实际应用例子

例子一:UDP 指标上报要能接受丢失

func SendMetric(addr string, msg []byte) error {
    conn, err := net.Dial("udp", addr)
    if err != nil {
        return err
    }
    defer conn.Close()

    _, err = conn.Write(msg)
    return err
}

这类上报适合“不要求每条都到达”的场景。如果是订单状态、账单、审计日志,就不应该用裸 UDP。

例子二:应用层加序号

type Packet struct {
    Seq  uint64
    Body []byte
}

如果应用需要识别乱序或重复,就要增加序号、ACK、重传、超时和窗口等机制。复杂度会迅速接近重新实现一部分可靠传输。

常见误区

  • 误区一:UDP 一定比 TCP 快。

UDP 少了连接和可靠性机制,但应用如果自己补可靠性,复杂度和成本会回来。

  • 误区二:UDP 不会拥塞。

UDP 本身不做拥塞控制,不代表网络不会拥塞。应用不控制发送速率可能伤害自己和别人。

  • 误区三:QUIC 就是普通 UDP。

QUIC 基于 UDP,但在应用层实现了加密、可靠传输、多路复用和拥塞控制等能力。

线上问题案例

某服务用 UDP 上报业务关键事件,后来发现少量事件丢失导致统计对不上。根因是 UDP 不保证到达,网络抖动时数据包丢失,应用没有 ACK 和重试。

修复方式是把关键事件改为 Kafka / HTTP / gRPC 等可靠链路,UDP 只保留用于可丢弃指标采样。

实战任务

判断下面场景是否适合 UDP,并说明原因:

  1. 用户登录审计日志。
  2. 实时游戏位置同步。
  3. 支付结果通知。
  4. QPS 采样指标上报。
参考答案

用户登录审计日志和支付结果通知通常不适合裸 UDP,因为它们要求可靠、可追溯、可重试。实时游戏位置同步可以考虑 UDP,因为旧位置丢失后新位置更有价值,低延迟比绝对可靠更重要。

QPS 采样指标上报可以考虑 UDP,因为少量丢失通常不影响趋势判断。但如果指标用于结算、审计或告警闭环,就需要更可靠的传输方式。

面试题

1. UDP 和 TCP 最大区别是什么?

参考答案

TCP 是面向连接、可靠、有序的字节流协议;UDP 是无连接、不保证可靠、不保证顺序的数据报协议。

TCP 帮应用处理重传、排序、流量控制和拥塞控制;UDP 更轻量,但这些能力需要应用自己决定是否实现。

2. 什么场景适合 UDP?

参考答案

适合 UDP 的场景通常能接受少量丢包,或者更看重低延迟和实时性,例如 DNS、实时音视频、游戏同步、指标采样上报。

如果业务需要强可靠、严格顺序、审计追踪,通常不应该直接使用裸 UDP。

3. QUIC 解决了哪些问题?

参考答案

QUIC 基于 UDP,在传输层之上实现加密、可靠传输、多路复用、拥塞控制和连接迁移。它可以减少连接建立成本,并缓解 TCP 层面的队头阻塞。

HTTP/3 基于 QUIC,用来改进 HTTP/2 在部分网络场景下的表现。