Skip to main content

3. 协议概述 (Protocol Overview)

QUIC [QUIC-TRANSPORT] 负责数据包的机密性和完整性保护. 为此,它使用从 TLS 握手 [TLS13] 派生的密钥,但与 TCP 上承载 TLS 记录不同,TLS 握手和警报消息直接通过 QUIC 传输承载,QUIC 接管了 TLS 记录层的职责,如图 3 所示.

+--------------+--------------+ +-------------+
| TLS | TLS | | QUIC |
| Handshake | Alerts | | Applications|
| | | | (h3, etc.) |
+--------------+--------------+-+-------------+
| |
| QUIC Transport |
| (streams, reliability, congestion, etc.) |
| |
+---------------------------------------------+
| |
| QUIC Packet Protection |
| |
+---------------------------------------------+

图 3: QUIC 层次结构

QUIC 还依赖 TLS 进行身份验证和协商对安全性和性能至关重要的参数.

这两个协议不是严格分层的,而是相互协作: QUIC 使用 TLS 握手; TLS 使用 QUIC 提供的可靠性、有序传递和记录层.

从高层次看,TLS 和 QUIC 组件之间有两个主要交互:

  • TLS 组件通过 QUIC 组件发送和接收消息,QUIC 为 TLS 提供可靠的流抽象 (Stream Abstraction).

  • TLS 组件向 QUIC 组件提供一系列更新,包括 (a) 要安装的新数据包保护密钥和 (b) 状态变化,如握手完成、服务器证书等.

图 4 更详细地展示了这些交互,其中特别标出了 QUIC 数据包保护.

+------------+                               +------------+
| |<---- Handshake Messages ----->| |
| |<- Validate 0-RTT Parameters ->| |
| |<--------- 0-RTT Keys ---------| |
| QUIC |<------- Handshake Keys -------| TLS |
| |<--------- 1-RTT Keys ---------| |
| |<------- Handshake Done -------| |
+------------+ +------------+
| ^
| Protect | Protected
v | Packet
+------------+
| QUIC |
| Packet |
| Protection |
+------------+

图 4: QUIC 和 TLS 交互

与 TCP 上的 TLS 不同,想要发送数据的 QUIC 应用程序不使用 TLS 应用数据记录 (Application Data Records) 发送数据. 相反,它们将数据作为 QUIC STREAM 帧 (STREAM Frames) 或其他帧类型发送,然后这些帧被承载在 QUIC 数据包中.