QUIC 是一种安全的通用传输协议。文档定义了 QUIC 协议的第一个版本。它符合[QUIC不变特性]QUIC协议中与版本无关属性。QUIC 是一种面向连接的协议,它在客户端和服务器之间创建有状态的交互。QUIC 是一种面向连接的协议,它在客户端和服务器之间创建有状态的交互。
QUIC 握手结合了加密和传输参数的协商。 QUIC 集成了 TLS 握手,尽管使用定制的帧来保护数据包。 TLS 和 QUIC 的集成在 . 握手的结构允许尽快交换应用程序数据。 这包括客户端立即发送数据的选项 (0-RTT:Round-Trip Time 往返时延),这需要事先以某种形式的通信或配置才能启用。
端点通过QUIC通信是通过交换QUIC 数据包。 大多数数据包都包含帧,这些帧在端点之间携带控制信息和应用程序数据。 QUIC 对每个数据包的整体进行身份验证,并尽可能多地加密每个数据包。 QUIC 数据包使用 UDP 数据报传输,以更好地促进其在现有系统和网络中的部署。
应用协议使用QUIC协议交换信息是通过流实现的(streams),流是有序的字节序列。 可以创建两种类型的流:双向流,允许两个端点发送数据; 和单向流,只允许单个端点发送数据。 基于信用的方案用于限制流创建并限制可以发送的数据量
QUIC 提供必要的反馈来实现可靠的交付和拥塞控制。在第六节(QUIC-Recovery)中描述了一种用于检测和恢复数据丢失的算法。 QUIC依靠拥塞控制来避免网络拥塞。 示例性拥塞控制算法在第七节。
QUIC 连接并不严格绑定到单个网络路径。 连接迁移使用连接标识符来允许连接转移到新的网络路径。 只有客户端才能在此版本的 QUIC 中迁移。 此设计还允许在网络拓扑或地址映射发生变化(例如可能由 NAT 重新绑定引起)后继续连接。
一旦连接建立,就会为连接终止提供多个选项。 应用程序可以管理正常关闭,端点可以协商超时期限,错误可以导致立即连接断开,并且无状态机制支持在一个端点丢失状态后终止连接。
本文档描述了核心 QUIC 协议,结构如下
随附的文档描述了 QUIC 的丢失检测和拥塞控制,以及 TLS 和其他加密机制的使用。
本文档定义了 QUIC 版本 1,并且符合[QUIC-INVARIANTS]中的协议不变特性
要参考 QUIC 版本 1,请引用此文档。 对 QUIC 的有限版本独立属性集的引用可以引用[QUIC-INVARIANTS]
当这些关键词出现在文档中,当且仅当他们出现为大写,如展示的这种”MUST“,"MUST NOT", "REQUIRED", "SHALL" ,"SHALL NOT", "SHOULD" ,"SHOULD NOT", "RECOMMENDED" ,"NOT RECOMMENDED" ,"MAY", "OPTIONAL"。需要按照 BCP14 [RFC2119],[RFC8174] 中的说明进行解释。
本文档中的常用术语描述如下:
QUIC: 本文档描述的传输协议。 QUIC 是一个名称,而不是首字母缩略词
EndPoint: 可以通过生成、接收和处理 QUIC 数据包来参与 QUIC 连接的实体。 QUIC 中只有两种类型的端点:客户端和服务器。
Client: 发起 QUIC 连接的终端
Server: 接受 QUIC 连接的终端
QUIC package: 一个完整的 QUIC 可处理单元,可以封装在 UDP 数据报中。 一个或多个 QUIC 数据包可以封装在单个 UDP 数据报中
Ack-eliciting packet:一个 QUIC 数据包,包含除 ACK、PADDING 和 CONNECTION_CLOSE 之外的帧。 这些会导致收件人发送确认信号
Frame: 一种结构化协议信息的单位。 有多种帧类型,每一种都携带不同的信息。 帧包含在 QUIC 数据包中。
Address :当没有获取授权资格的时候,表示网络路径一端的 IP 版本、IP 地址和 UDP 端口号的元组。
Connection ID:用于标识端点处的 QUIC 连接的标识符。 每个端点为其对等端选择一个或多个连接 ID,以包含在发送给端点的数据包中。 此值对对等方不透明。
Stream:QUIC 连接中有序字节的单向或双向通道。 一个 QUIC 连接可以同时传输多个流。
Application: 使用 QUIC 发送和接收数据的实体。
本文档使用术语“QUIC 数据包”、“UDP 数据报”和“IP 数据包”来指代各个协议的单元。 即一个或多个QUIC数据包可以封装在一个UDP数据报中,UDP数据报又封装在一个IP数据包中
本文档中的数据包和帧图使用自定义格式。 这种格式的目的是总结而不是定义协议元素, 而是定义了结构的完整语义和细节。
复杂字段被命名的--由一对匹配的大括号包围的字段列表。 此列表中的每个字段都用逗号分隔
各个字段包括长度信息,以及有关固定值、可选性或重复性的指示。 各个字段使用以下符号约定,所有长度均以bits为单位
x(A):表明x是A bits长度,例如x(4) x是4bit长度
x(i):表示 x 使用第 16 节中描述的可变长度编码保存一个整数值
x(A..B):表示x可以是从A到B的任意长度; A可以省略,表示最少0位,B可以省略,表示没有设置上限; 这种格式的值总是以字节边界结束。
x(L)=C: 表示x有一个固定值C; x 的长度由 L 描述,它可以使用上面的任何长度形式
x (L) = C..D:表示 x 的取值范围为 C 到 D(含),长度由 L 描述,和上面一样
[x (L)] :表示 x 是可选的,长度为 L
x (L) ...: 表示 x 重复零次或多次,并且每个实例的长度为 L
本文档使用网络字节顺序(即大字节序)值。 字段从每个字节的高位bit开始放置。
按照惯例,单个字段通过使用复杂字段的名称来引用复杂字段
Figure1 提供了一个例子
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) ..., }
Figure 1: Example Format
当在文中引用一个One-bit字段时,该字段的位置可以通过使用带有字段值集的字段的byte的值来阐明,例如,值 0x80 可用于引用字节最高有效位中的One-bit字段,比如Figure 1中的One-bit 字段。