索引与字面值可以混合
HTTP字段列表是有序的名称—值对集合,允许相同名字或相同对重复。HPACK可以把整对字段表示为表索引,也可发送字面值,并选择名称是直接写出还是借用已有表项;解码结果仍要按原顺序保留。
静态表预先规定常见字段,动态表则随连接中的编码更新,保存后续可能重复使用的名称和值。编码器决定如何利用表,解码器按所接收表示执行相同更新;协议不强迫所有编码器采用同一套压缩启发式。
参考:[1]
表容量与方向分别管理
动态表初始为空,新项进入前端,较老项目从末尾淘汰,容量不能超过协议允许上限。大小计算使用未作Huffman编码的名字和值字节数,再加每项32字节的规定开销;它不是看压缩后报文有多短。
双向HTTP通信的请求与响应动态表各自独立。当前索引的含义还会随插入和淘汰改变,必须按连接的正确状态解释;从另一条连接复制一个压缩块,不能假定接收方已经有同样的动态表。
参考:[1]
固定Huffman编码与敏感字段
字面字符串可以原样编码,也可以使用规范给定的固定Huffman码;这一选择不同于把整个字段列表交给通用DEFLATE压缩。表索引省掉重复字段,Huffman编码缩短字符串表示,两者处理的重复层次不同。
never-indexed字面形式表达不要把相应敏感字段加入索引,重新编码的中间组件也需尊重这个选择。但不用动态索引并不等于字段已经保密,HPACK仍不是加密协议;机密性与压缩侧信道风险需要结合传输保护和使用场景分别分析。
参考:[1]