Skip to main content

1. Introduction (简介)

QUIC 传输协议 (QUIC Transport Protocol, [QUIC-TRANSPORT]) 旨在支持 HTTP 语义, 其设计涵盖了 HTTP/2 ([HTTP/2]) 的许多特性. HTTP/2 使用 HPACK ([RFC7541]) 来压缩头部 (Header) 和尾部 (Trailer) 区段. 如果在 HTTP/3 ([HTTP/3]) 中使用 HPACK, 由于其内置的假设要求所有流上的帧具有全序关系, 将会导致字段区段 (Field Section) 的队头阻塞 (Head-of-Line Blocking).

QPACK 复用了 HPACK 的核心概念, 但重新设计以允许在存在乱序传输的情况下保持正确性, 并为实现提供了在抵御队头阻塞和最优压缩率之间进行权衡的灵活性. 设计目标是在相同的丢包条件下, 以显著减少的队头阻塞为代价, 接近 HPACK 的压缩率.

1.1 Conventions and Definitions (约定和定义)

本文档中的关键词 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 和 "OPTIONAL" 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释, 当且仅当它们以全大写形式出现时, 如此处所示.

本文档中使用以下术语:

HTTP fields (HTTP 字段): 作为 HTTP 消息一部分发送的元数据. 该术语涵盖头部字段和尾部字段. 通俗地说, "headers" 一词经常被用来指代 HTTP 头部字段和尾部字段; 本文档为了通用性使用 "fields".

HTTP field line (HTTP 字段行): 作为 HTTP 字段区段一部分发送的名称-值对. 参见 [HTTP] 的第 6.3 节和第 6.5 节.

HTTP field value (HTTP 字段值): 与字段名称关联的数据, 由该区段中具有该字段名称的所有字段行值组成, 使用逗号分隔符连接在一起.

Field section (字段区段): 与 HTTP 消息关联的 HTTP 字段行的有序集合. 字段区段可以包含多个具有相同名称的字段行. 它还可以包含重复的字段行. HTTP 消息可以包括头部和尾部区段.

Representation (表示): 表示字段行的指令, 可能通过引用动态表和静态表.

Encoder (编码器): 编码字段区段的实现.

Decoder (解码器): 解码已编码字段区段的实现.

Absolute Index (绝对索引): 动态表中每个条目的唯一索引.

Base (基准): 相对索引和 Post-Base 索引的参考点. 引用动态表条目的表示相对于基准.

Insert Count (插入计数): 插入到动态表中的条目总数.

注意, QPACK 是一个名称, 而非缩写.

1.2 Notational Conventions (符号约定)

本文档中的图表使用 [RFC2360] 第 3.1 节中描述的格式, 并具有以下附加约定:

x (A): 表示 x 的长度为 A 位.

x (A+): 表示 x 使用第 4.1.1 节中定义的前缀整数编码, 以 A 位前缀开始.

x ...: 表示 x 是可变长度的, 并延伸到区域的末尾.