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要哈夫曼编码)