跳到主要内容

4. dynamic table 管理 (Dynamic Table Management)

为限制解码器端的内存需求, dynamic table 的大小受到约束.

4.1. 计算表大小

dynamic table 的大小是其各个条目大小之和.

一个条目的大小等于其名称长度, 以 octet 为单位 (如 Section 5.2 所定义), 加上其值长度, 以 octet 为单位, 再加 32.

条目的大小使用其名称和值的长度计算, 不应用任何 Huffman coding.

Note: 额外的 32 octets 用于计入与条目相关的估算开销. 例如, 如果一个条目结构使用两个 64-bit 指针分别引用该条目的名称和值, 并使用两个 64-bit 整数分别统计名称和值的引用次数, 则会有 32 octets 的开销.

4.2. Maximum Table Size

使用 HPACK 的协议会确定允许编码器用于 dynamic table 的 maximum size. 在 HTTP/2 中, 此值由 SETTINGS_HEADER_TABLE_SIZE 设置确定 (见 [HTTP2] 的 Section 6.5.2).

编码器可以选择使用小于此 maximum size 的容量 (见 Section 6.3), 但所选择的大小 MUST 保持小于或等于协议设置的最大值.

dynamic table 的 maximum size 发生变化时, 通过 dynamic table size update 发出信号 (见 Section 6.3). 这个 dynamic table size update MUST 出现在 dynamic table size 变化之后的第一个 header block 的开头. 在 HTTP/2 中, 这发生在 settings acknowledgment 之后 (见 [HTTP2] 的 Section 6.5.3).

在两个 header block 的传输之间, maximum table size 可能发生多次更新. 如果在此间隔内该大小被更改不止一次, 则此间隔内出现的最小 maximum table size MUST 通过 dynamic table size update 发出信号. 最终的 maximum size 始终会被发出信号, 因此最多产生两个 dynamic table size updates. 这确保解码器能够基于 dynamic table size 的减少执行驱逐 (见 Section 4.3).

该机制可通过将 maximum size 设置为 0 来完全清除 dynamic table 中的条目, 之后还可以恢复该值.

4.3. Dynamic Table Size 变化时的条目驱逐

每当 dynamic table 的 maximum size 减小时, 都会从 dynamic table 的末尾驱逐条目, 直到 dynamic table 的大小小于或等于 maximum size.

4.4. 添加新条目时的条目驱逐

在向 dynamic table 添加新条目之前, 会从 dynamic table 的末尾驱逐条目, 直到 dynamic table 的大小小于或等于 (maximum size - new entry size), 或直到该表为空.

如果新条目的大小小于或等于 maximum size, 则将该条目添加到表中. 尝试添加一个大于 maximum size 的条目并不是错误; 尝试添加大于 maximum size 的条目会导致该表中所有现有条目都被清空, 结果为空表.

新条目可以引用 dynamic table 中某个条目的名称, 而该条目会在这个新条目加入 dynamic table 时被驱逐. 如果被引用的条目在插入新条目之前已从 dynamic table 中被驱逐, 实现需要注意避免删除被引用的名称.