头部压缩 HPACK

tech2022-08-19  146

为什么要进行头部压缩呢?

HTTP头是比较长的,如果发送的数据比较小时,也得发送一个很大的HTTP头部。当这种请求数很多的时候,会导致网络的吞吐率不高。并且,比较大的HTTP头部会迅速占满慢启动过程中的拥塞窗口,导致延迟加大。

如何进行头部压缩

简单说,HTTP头压缩需要在HTTP/2 Client和服务端之间:

维护一份相同的静态表(Static Table),包含常见的头部名称,以及特别常见的头部名称与值的组合;维护一份相同的动态表(Dynamic Table),可以动态地添加内容;基于静态哈夫曼码表的哈夫曼编码(Huffman Coding);

静态表格

首先对常用的HTTP头部字段进行编号,用一个静态表格表示

如果是静态表格中出现的,就直接用索引。比如2代表Method:post

哈夫曼编码 不在静态表格中或者只有key在静态表格value不在静态表格(Method:option),使用哈夫曼编码/索引+哈夫曼编码

动态表格 服务端收到新的请求头后,会将他们缓存在动态表格中,索引从62开始。

如何判断是完全索引(key+value)还是只有key 高位设置为 1 表示这个字节是一个完全索引值(key 和 value 都在索引中)

Method POST表示为:0x82。不是02了,这里就是把第8位置成了1,变成了二进制的1000 0002,表示name/value完全匹配。

而如果第8位不是1,如0000 0002那么value值就是自定义的,后面紧跟着的一个字节就是表示value的字符长度,然后再跟着相应长度的字符。Method: OPTION:0206OPTION(02=>Method,06后面的值长为6,option要哈夫曼编码)

最新回复(0)