QUIC 数据包与帧结构
字数 1760 2025-12-06 02:43:22

QUIC 数据包与帧结构

QUIC协议的高效性很大程度上源于其独特的数据包和帧结构设计。理解这个结构是理解QUIC如何实现其核心特性的基础。我们从最外层的数据包开始,层层深入。

第一步:QUIC数据包外层结构

QUIC运行在UDP之上,因此一个QUIC数据包首先被封装在一个UDP数据报中。UDP头部之后,就是QUIC数据包本身。它由两个主要部分构成:

  1. 数据包头(Header):包含连接控制、加密和元数据信息。QUIC有长包头和短包头两种格式。
  2. 数据包有效载荷(Payload):这是数据包的核心,但它不是直接的应用程序数据。有效载荷在传输前已经被加密,并且内部由一个或多个帧(Frame) 组成。

关键点:QUIC的数据包是加密的最小传输单元。所有应用数据和控制信息都必须装入帧中,再将帧装入数据包的有效载荷里。

第二步:长包头与短包头

  • 长包头(Long Header):用于连接建立和恢复等初始阶段。它包含更多字段,例如:
    • 连接ID:用于在IP地址/端口变化时(如切换网络)保持连接,这是QUIC连接迁移的基础。
    • 数据包编号:一个唯一且严格递增的号码,用于数据包确认和加密。QUIC的数据包编号独立于流,用于整体传输可靠性。
    • 版本号:标识QUIC协议版本。
    • 类型字段:指示此数据包的目的(如Initial初始、Handshake握手、0-RTT、Retry重试)。
  • 短包头(Short Header):用于已建立的连接,更精简,开销更小。它主要包含:
    • 目标连接ID:标识接收方。
    • 数据包编号(经过加密和缩短处理):继续进行数据包级的排序和确认。
    • 保留位和密钥阶段位:用于加密密钥轮换。

关键点:长包头建立连接和协商参数,短包头高效传输数据。

第三步:数据包有效载荷与帧

数据包有效载荷在解密后,呈现的是一个按顺序排列的的序列。帧是QUIC中承载所有具体信息的结构化数据块。每个帧都有一个类型字段和特定于该类型的格式。

常见的帧类型包括:

  • STREAM帧:这是最重要的帧,用于传输应用层数据。一个STREAM帧包含流ID偏移量(用于字节流的顺序重组)和数据块。一个QUIC数据包可以包含来自多个不同流的STREAM帧,这是实现多路复用的关键——多个独立的逻辑数据流在单个加密连接上交错传输,互不阻塞。
  • ACK帧:用于确认接收到的数据包。它包含已接收数据包的范围信息,具有高精度对重传包的明确指示,有助于精确计算RTT和减少不必要的重传。
  • CRYPTO帧:专门用于传输TLS握手信息。QUIC将加密握手作为其协议的一部分,使用CRYPTO帧来承载这些数据。
  • PADDING帧:用于填充数据包以达到特定大小。
  • 连接管理帧:如PING(保活)、CONNECTION_CLOSE(关闭连接)、NEW_CONNECTION_ID(提供新连接ID)等。

第四步:从应用到传输的全景

让我们串联起整个过程,想象你通过一个QUIC连接加载一个网页:

  1. 应用程序(浏览器)需要发送多个HTTP请求(如HTML、CSS、图片)。
  2. 每个HTTP请求被映射到一个独立的QUIC上。
  3. 每个流的数据被切割,并加上流ID、偏移量等信息,封装成多个STREAM帧
  4. 这些来自不同流的STREAM帧,连同一些ACK帧(用于确认收到的服务器数据包)等控制帧,被混合打包。
  5. 帧的集合被加密,形成数据包有效载荷
  6. 在有效载荷前加上短包头(连接已建立),封装成完整的QUIC数据包。
  7. QUIC数据包外面再套上UDP头部,发送到网络。
  8. 接收方执行相反的过程:解UDP、解析包头、解密有效载荷、解析帧序列。根据帧类型,STREAM帧的数据被递交给对应的流进行重组,最终还原出HTTP响应给浏览器应用。

核心优势总结

  • 安全性:帧一旦组包,整个有效载荷(包括头部外的部分)都会被加密。
  • 多路复用:基于帧的设计,使来自不同流的数据可以在一个数据包内交织,避免了TCP的“队头阻塞”。
  • 可扩展性:帧类型可以灵活定义和扩展,支持未来的新特性。
  • 可靠性分离:数据包编号提供传输层可靠性(丢包重传),流内的偏移量提供应用数据的有序性,两者解耦,更加灵活高效。
QUIC 数据包与帧结构 QUIC协议的高效性很大程度上源于其独特的数据包和帧结构设计。理解这个结构是理解QUIC如何实现其核心特性的基础。我们从最外层的数据包开始,层层深入。 第一步:QUIC数据包外层结构 QUIC运行在UDP之上,因此一个QUIC数据包首先被封装在一个UDP数据报中。UDP头部之后,就是QUIC数据包本身。它由两个主要部分构成: 数据包头(Header) :包含连接控制、加密和元数据信息。QUIC有长包头和短包头两种格式。 数据包有效载荷(Payload) :这是数据包的核心,但它 不是 直接的应用程序数据。有效载荷在传输前已经被加密,并且内部由一个或多个 帧(Frame) 组成。 关键点 :QUIC的数据包是加密的最小传输单元。所有应用数据和控制信息都必须装入帧中,再将帧装入数据包的有效载荷里。 第二步:长包头与短包头 长包头(Long Header) :用于连接建立和恢复等初始阶段。它包含更多字段,例如: 连接ID :用于在IP地址/端口变化时(如切换网络)保持连接,这是QUIC连接迁移的基础。 数据包编号 :一个唯一且严格递增的号码,用于数据包确认和加密。QUIC的数据包编号独立于流,用于整体传输可靠性。 版本号 :标识QUIC协议版本。 类型字段 :指示此数据包的目的(如Initial初始、Handshake握手、0-RTT、Retry重试)。 短包头(Short Header) :用于已建立的连接,更精简,开销更小。它主要包含: 目标连接ID :标识接收方。 数据包编号 (经过加密和缩短处理):继续进行数据包级的排序和确认。 保留位和密钥阶段位 :用于加密密钥轮换。 关键点 :长包头建立连接和协商参数,短包头高效传输数据。 第三步:数据包有效载荷与帧 数据包有效载荷在解密后,呈现的是一个按顺序排列的 帧 的序列。帧是QUIC中承载所有具体信息的结构化数据块。每个帧都有一个类型字段和特定于该类型的格式。 常见的帧类型包括: STREAM帧 :这是最重要的帧,用于传输应用层数据。一个STREAM帧包含 流ID 、 偏移量 (用于字节流的顺序重组)和 数据块 。一个QUIC数据包可以包含来自多个不同流的STREAM帧,这是实现 多路复用 的关键——多个独立的逻辑数据流在单个加密连接上交错传输,互不阻塞。 ACK帧 :用于确认接收到的数据包。它包含已接收数据包的范围信息,具有 高精度 和 对重传包的明确指示 ,有助于精确计算RTT和减少不必要的重传。 CRYPTO帧 :专门用于传输TLS握手信息。QUIC将加密握手作为其协议的一部分,使用CRYPTO帧来承载这些数据。 PADDING帧 :用于填充数据包以达到特定大小。 连接管理帧 :如PING(保活)、CONNECTION_ CLOSE(关闭连接)、NEW_ CONNECTION_ ID(提供新连接ID)等。 第四步:从应用到传输的全景 让我们串联起整个过程,想象你通过一个QUIC连接加载一个网页: 应用程序(浏览器)需要发送多个HTTP请求(如HTML、CSS、图片)。 每个HTTP请求被映射到一个独立的QUIC 流 上。 每个流的数据被切割,并加上流ID、偏移量等信息,封装成多个 STREAM帧 。 这些来自不同流的STREAM帧,连同一些ACK帧(用于确认收到的服务器数据包)等控制帧,被混合打包。 帧的集合被加密,形成 数据包有效载荷 。 在有效载荷前加上 短包头 (连接已建立),封装成完整的QUIC数据包。 QUIC数据包外面再套上 UDP头部 ,发送到网络。 接收方执行相反的过程:解UDP、解析包头、解密有效载荷、解析帧序列。根据帧类型,STREAM帧的数据被递交给对应的流进行重组,最终还原出HTTP响应给浏览器应用。 核心优势总结 : 安全性 :帧一旦组包,整个有效载荷(包括头部外的部分)都会被加密。 多路复用 :基于帧的设计,使来自不同流的数据可以在一个数据包内交织,避免了TCP的“队头阻塞”。 可扩展性 :帧类型可以灵活定义和扩展,支持未来的新特性。 可靠性分离 :数据包编号提供传输层可靠性(丢包重传),流内的偏移量提供应用数据的有序性,两者解耦,更加灵活高效。