作者备注
作者看到有问题是:「请说说 http2 瘦不压缩原理」, 然后才有了这个问题。 但是作者觉得, 没有事实意义,当做科普即可。
在 HTTP/2 中,首部压缩是一项重要的特性,它主要是为了减少在网络传输中重复的首部信息所占用的带宽,从而提高网络传输效率。
一、为什么需要首部压缩
在 HTTP/1.1 中,每次请求和响应都包含大量的首部信息,这些首部信息可能会重复出现,并且占用不少的网络带宽。例如,每次请求都可能包含的 User-Agent、Accept 等首部字段,在多个请求之间可能是相同的。随着现代网页应用的复杂性增加,请求的数量也越来越多,首部信息的重复传输问题就变得更加突出。
二、HTTP/2 首部压缩的原理
HTTP/2 使用了 HPACK(Header Compression for HTTP/2)算法进行首部压缩。HPACK 主要基于以下两个关键概念:
-
静态表和动态表:
- 静态表是一个预定义的首部名称和值的映射表,其中包含了一些常见的首部字段,如“:method: GET”“:status: 200”等。当在请求或响应中出现这些常见的首部字段时,可以通过索引值来引用静态表中的条目,而不是传输完整的首部名称和值,从而减少传输的数据量。
- 动态表是在通信过程中动态构建的。当出现新的首部字段组合时,可以将其添加到动态表中。后续的请求或响应如果包含相同的首部字段组合,可以通过索引值来引用动态表中的条目。
-
整数编码和霍夫曼编码:
- 整数编码用于对首部字段的索引值和长度进行编码,减少表示这些值所需的位数。
- 霍夫曼编码是一种可变长度编码技术,它根据字符的出现频率为不同的字符分配不同长度的编码。在 HTTP/2 中,霍夫曼编码用于对首部字段的值进行编码,进一步减少数据量。
三、首部压缩的效果
通过首部压缩,HTTP/2 可以显著减少网络传输中的首部信息大小。在实际应用中,首部压缩可以将首部信息的大小减少到原来的几分之一甚至更小,从而提高网络传输效率,降低延迟。特别是对于频繁重复的首部字段,压缩效果更加明显。
例如,在一个包含多个请求和响应的网页应用中,如果每个请求和响应都包含相同的 User-Agent 首部字段,在 HTTP/1.1 中,这个首部字段会在每次请求和响应中重复传输。而在 HTTP/2 中,只需要在第一次出现时传输完整的首部字段,后续可以通过索引值引用动态表中的条目,大大减少了传输的数据量。