返回

HTTP/2.0 Header Compression 头部压缩(下)

IOS

HTTP/2.0 头部压缩的细枝末节

各位 HTTP 爱好者们,欢迎来到我们深入探讨 HTTP/2.0 头部压缩的又一章。在本篇技术指南中,我们将揭开 rfc7541 文档定义的头部字段压缩规则的神秘面纱,并了解它们在实际中的表现形式。

头部字段的表现形式

HTTP/2.0 头部压缩允许头部字段采用两种表现形式:

  • 数字索引 (Indexed) :使用索引表中的条目来表示头部字段。
  • 字符 (Literal) :直接传输头部字段的内容作为字符串。

数字索引

如果头部字段的名称和值都在索引表中,我们就可以使用数字索引。索引表包含一组常见头部字段的名称和值,通过使用一个字节的索引值即可引用索引表中的条目,节省了传输字节数。例如,索引值 2 对应于头部字段名称 "content-type"。

字符

当头部字段不在索引表中时,或者当使用索引表会更消耗字节数时,我们就需要使用字符。字符形式直接传输头部字段的内容作为字符串。例如,头部字段 "x-custom-header" 不在索引表中,因此必须使用字符传输。

压缩规则

头部字段的压缩规则由 rfc7541 定义,主要包括以下几点:

  • 如果头部字段的名称和值都在索引表中,使用数字索引。
  • 如果头部字段的名称在索引表中,但值不在索引表中,使用数字索引和字符。
  • 如果头部字段的名称和值都不在索引表中,使用字符。
  • 如果使用字符会更消耗字节数,使用数字索引和字符。

实际表现形式

头部字段的实际表现形式为一个八位元组,前七位为类型字段,后一位为标志位。类型字段指示了头部字段的表现形式,而标志位指示了该头部字段是否已包含在之前的头部块中。

类型字段

类型字段 表现形式
0 数字索引
10 动态数字索引
110 字符索引名称
111 字符索引值
11111 字符从不索引
111110 字符增量索引

标志位

标志位为 1 表示该头部字段已包含在之前的头部块中,为 0 表示该头部字段是新出现的。

示例

以下是一个头部字段 "content-type: application/json" 的压缩后表现形式:

  • 索引表索引值:2
  • 实际表现形式:01000010

代码示例

假设我们有一个头部字段 "x-my-custom-header: value",并且 "x-my-custom-header" 不在索引表中,那么我们可以使用以下代码进行压缩:

import h2.connection
import h2.config

config = h2.config.H2Configuration(header_encoding=True)
conn = h2.connection.H2Connection(config=config)
headers = [('x-my-custom-header', 'value')]
headers_frame = conn.wrap_headers(headers)

headers_frame 将包含压缩后的头部字段。

常见问题解答

1. 如何判断使用数字索引还是字符?

根据 rfc7541 定义的压缩规则进行判断。

2. 标志位有什么用?

标志位用于指示该头部字段是否已包含在之前的头部块中,这有助于节省传输字节数。

3. 为什么需要使用字符?

当头部字段不在索引表中时,或者使用数字索引会更消耗字节数时,需要使用字符。

4. 数字索引和字符可以同时使用吗?

是的,当头部字段的名称在索引表中,但值不在索引表中时,可以使用数字索引和字符。

5. 压缩头部字段的目的是什么?

压缩头部字段可以减少 HTTP 请求和响应的大小,从而提高网络性能。