1. 概述
1. 概述 (Overview)
QUIC 是一种安全的通用传输协议. 本文档定义 QUIC 版本 1, 该版本符合 [QUIC-INVARIANTS] 中定义的 QUIC 版本无关属性.
QUIC 是一种面向连接的协议, 它在 client 与 server 之间创建有状态交互.
QUIC handshake 结合了加密参数和传输参数的协商. QUIC 集成了 TLS handshake [TLS13], 但使用定制的成帧方式来保护 packet. [QUIC-TLS] 更详细地描述了 TLS 与 QUIC 的集成. 该 handshake 的结构允许尽可能早地交换应用数据. 这包括一个让 client 立即发送数据 (0-RTT) 的选项, 启用该选项需要某种形式的先前通信或配置.
endpoint 通过交换 QUIC packet 在 QUIC 中通信. 大多数 packet 包含 frame, frame 在 endpoint 之间承载控制信息和应用数据. QUIC 对每个 packet 的全部内容进行认证, 并尽可能加密 packet 中的内容. 为了更便于在现有系统和网络中部署, QUIC packet 承载在 UDP datagram [UDP] 中.
应用协议通过 stream 在 QUIC connection 上交换信息, stream 是有序字节序列. 可以创建两类 stream: bidirectional stream, 允许两个 endpoint 都发送数据; unidirectional stream, 只允许单个 endpoint 发送数据. QUIC 使用基于 credit 的方案来限制 stream 创建, 并约束可发送的数据量.
QUIC 提供实现可靠递送和 congestion control 所需的反馈. [QUIC-RECOVERY] 第 6 节描述了一种检测数据丢失并从中恢复的算法. QUIC 依赖 congestion control 来避免网络拥塞. [QUIC-RECOVERY] 第 7 节描述了一种示例 congestion control 算法.
QUIC connection 并不严格绑定到单个网络路径. connection migration 使用 connection ID, 使 connection 能够转移到新的网络路径. 在本版本 QUIC 中, 只有 client 能够迁移. 此设计还允许 connection 在网络拓扑或地址映射变化后继续存在, 例如 NAT rebinding 可能导致的变化.
connection 建立后, 提供了多种终止 connection 的选项. 应用可以管理 graceful shutdown, endpoint 可以协商超时时间, error 可以导致立即拆除 connection, 并且一种 stateless 机制可以在某个 endpoint 丢失状态后终止 connection.
1.1 文档结构 (Document Structure)
本文档描述 QUIC 核心协议, 结构如下:
-
stream 是 QUIC 提供的基本服务抽象.
- 第 2 节描述与 stream 相关的核心概念,
- 第 3 节提供 stream 状态的参考模型, 并且
- 第 4 节概述 flow control 的运行方式.
-
connection 是 QUIC endpoint 进行通信的上下文.
- 第 5 节描述与 connection 相关的核心概念,
- 第 6 节描述 version negotiation,
- 第 7 节详细说明建立 connection 的过程,
- 第 8 节描述地址验证以及关键的拒绝服务缓解措施,
- 第 9 节描述 endpoint 如何将 connection 迁移到新的网络路径,
- 第 10 节列出终止已打开 connection 的选项, 并且
- 第 11 节提供 stream 和 connection error handling 指南.
-
packet 和 frame 是 QUIC 用于通信的基本单位.
- 第 12 节描述与 packet 和 frame 相关的概念,
- 第 13 节定义数据传输, 重传和确认的模型, 并且
- 第 14 节规定管理承载 QUIC packet 的 datagram 大小的规则.
-
最后, QUIC 协议元素的编码细节描述于:
- 第 15 节 (version),
- 第 16 节 (integer encoding),
- 第 17 节 (packet header),
- 第 18 节 (transport parameter),
- 第 19 节 (frame), 以及
- 第 20 节 (error).
配套文档描述 QUIC 的 loss detection 和 congestion control [QUIC-RECOVERY], 以及 TLS 和其他加密机制的使用 [QUIC-TLS].
本文档定义 QUIC 版本 1, 该版本符合 [QUIC-INVARIANTS] 中的协议不变量.
引用 QUIC 版本 1 时, 请引用本文档. 对 QUIC 中有限集合的版本无关属性的引用可以引用 [QUIC-INVARIANTS].
1.2 术语和定义 (Terms and Definitions)
本文档中的关键词 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 和 "OPTIONAL", 当且仅当它们以此处所示的全大写形式出现时, 按 BCP 14 [RFC2119] [RFC8174] 中的描述解释.
本文档中常用术语描述如下.
QUIC: 本文档描述的传输协议. QUIC 是一个名称, 不是首字母缩略词.
Endpoint: 能够通过生成, 接收和处理 QUIC packet 参与 QUIC connection 的实体. QUIC 中只有两类 endpoint: client 和 server.
Client: 发起 QUIC connection 的 endpoint.
Server: 接受 QUIC connection 的 endpoint.
QUIC packet: QUIC 中完整的可处理单元, 可以封装在 UDP datagram 中. 一个或多个 QUIC packet 可以封装在单个 UDP datagram 中.
Ack-eliciting packet: 包含 ACK, PADDING 和 CONNECTION_CLOSE 之外 frame 的 QUIC packet. 这些 packet 会使接收方发送 acknowledgment; 见第 13.2.1 节.
Frame: 结构化协议信息单元. frame 有多种类型, 每种类型承载不同信息. frame 包含在 QUIC packet 中.
Address: 在未加限定时, 指表示网络路径一端的 IP version, IP address 和 UDP port number 组成的元组.
Connection ID: 用于在 endpoint 识别 QUIC connection 的标识符. 每个 endpoint 为其 peer 选择一个或多个 connection ID, 供 peer 在发往该 endpoint 的 packet 中包含. 对 peer 而言, 此值是不透明的.
Stream: QUIC connection 内的单向或双向有序字节通道. 一个 QUIC connection 可以承载多个并发 stream.
Application: 使用 QUIC 发送和接收数据的实体.
本文档使用术语 "QUIC packet", "UDP datagram" 和 "IP packet" 指代相应协议的单位. 也就是说, 一个或多个 QUIC packet 可以封装在 UDP datagram 中, UDP datagram 又封装在 IP packet 中.
1.3 表示约定 (Notational Conventions)
本文档中的 packet 和 frame 图使用一种自定义格式. 此格式的目的在于概括而非定义协议元素. 完整的语义和结构细节由正文定义.
复杂字段先给出名称, 随后是一对匹配花括号包围的字段列表. 列表中的每个字段以逗号分隔.
单个字段包含长度信息, 以及关于固定值, 可选性或重复的指示. 单个字段使用以下表示约定, 所有长度均以 bit 为单位:
x (A): 表示 x 长度为 A bit
x (i): 表示 x 使用第 16 节描述的 variable-length encoding 保存 integer 值
x (A..B): 表示 x 可以是从 A 到 B 的任意长度; 可以省略 A 来表示最小值为零 bit, 也可以省略 B 来表示没有设定上限; 此格式中的值总是在字节边界结束
x (L) = C: 表示 x 具有固定值 C; x 的长度由 L 描述, L 可以使用上面的任一长度形式
x (L) = C..D: 表示 x 的值位于从 C 到 D 的范围内, 包含端点, 长度如上由 L 描述
[x (L)]: 表示 x 是可选的, 长度为 L
x (L) ...: 表示 x 重复零次或多次, 每个实例的长度为 L
本文档使用 network byte order (即 big endian) 值. 字段从每个字节的高位 bit 开始放置.
按约定, 单个字段通过复杂字段的名称引用该复杂字段.
图 1 给出一个示例:
Example Structure {
One-bit Field (1),
7-bit Field with Fixed Value (7) = 61,
Field with Variable-Length Integer (i),
Arbitrary-Length Field (..),
Variable-Length Field (8..24),
Field With Minimum Length (16..),
Field With Maximum Length (..128),
[Optional Field (64)],
Repeated Field (8) ...,
}
图 1: 示例格式 (Example Format)
当正文中引用单 bit 字段时, 可以通过承载该字段的字节在该字段值被设置时的值来明确该字段的位置. 例如, 值 0x80 可用于引用字节最高有效 bit 中的单 bit 字段, 如图 1 中的 One-bit Field.