HTTP/2.0 Header Compression 头部压缩(下)
2023-10-26 18:50:59
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 请求和响应的大小,从而提高网络性能。