跳到主要内容

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 为可变长度, 并延伸到该区域末尾.