跳到主要内容

1. 引言 (Introduction)

QUIC 传输协议 ([QUIC-TRANSPORT]) 旨在支持 HTTP 语义, 其设计吸收了 HTTP/2 ([HTTP/2]) 的许多特性. HTTP/2 使用 HPACK ([RFC7541]) 压缩 header 和 trailer section. 如果在 HTTP/3 ([HTTP/3]) 中使用 HPACK, 由于它内建了所有流上帧之间存在全序关系的假设, 将导致 field section 出现队头阻塞.

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 消息一部分发送的元数据. 该术语同时涵盖 header fields 和 trailer fields. 在非正式用法中, "headers" 常用于指代 HTTP header fields 和 trailer fields; 本文档为保持一般性而使用 "fields".

HTTP field line: 作为 HTTP field section 一部分发送的名称-值对. 见 [HTTP] 第 6.3 节和第 6.5 节.

HTTP field value: 与 field name 关联的数据, 由该 section 中具有相同 field name 的所有 field line value 组成, 并以逗号分隔连接而成.

Field section: 与 HTTP 消息关联的 HTTP field line 有序集合. 一个 field section 可以包含多个同名 field line, 也可以包含重复的 field line. 一个 HTTP 消息可以同时包含 header section 和 trailer section.

Representation: 表示 field line 的指令, 可能通过引用 dynamic table 和 static table 来表示.

Encoder: 对 field section 进行编码的实现.

Decoder: 对已编码 field section 进行解码的实现.

Absolute Index: dynamic table 中每个条目的唯一索引.

Base: relative index 和 post-Base index 的参考点. 引用 dynamic table 条目的 representation 都相对于某个 Base.

Insert Count: 已插入 dynamic table 的条目总数.

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

1.2 符号约定 (Notational Conventions)

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

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

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

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