文档章节

HTTP/2--HPACK算法

Candy_Desire
 Candy_Desire
发布于 2015/12/30 16:30
字数 1205
阅读 182
收藏 2
点赞 2
评论 0

 为 HTTP/2 头压缩专门设计的 HPACK

      HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量。如何理解 HPACK 压缩呢? 如果我们约定将常用的请求头的参数用一些特殊的编号来表示,比如 GET /index.html 用一个 1 来表示,POST /index.html 用 2 来表示。那么是不是可以节省很多字节? 为 HTTP/2 的专门量身打造的 HPACK 便是类似这样的思路延伸。它使用一份索引表来定义常用的 HTTP Header。把常用的 HTTP Header 存放在表里。请求的时候便只需要发送在表里的索引位置即可。例如 :method=GET 使用索引值 2 表示,:path=/index.html 使用索引值 5 表示。 具体这里的静态映射表请看附录的Table 1: Static Table Entries。

 

      比如我们想表达 请求的Header内容是:   GET /index.html   只要给服务端发送一个 Frame,该 Frame 的 Payload 部分存储 0x8285,Frame 的 Type 设置为 Header 类型。

      为什么是 0x8285,而不是 0x0205? 这是因为高位设置为 1 表示这个字节是一个完全索引值(key 和 value 都在索引中)。类似的,通过高位的标志位可以区分出这个字节是属于一个完全索引值,还是仅索引了 key,还是 key 和 value 都没有索引。因为索引表的大小的是有限的,它仅保存了一些常用的 HTTP Header,同时每次请求还可以在表的末尾动态追加新的 HTTP Header 缓存。动态部分称之为 Dynamic Table。Static Table 和 Dynamic Table 在一起组合成了索引表:

参考: http://io.upyun.com/2015/05/13/http2/ 

技术分享

HPACK 不仅仅通过索引键值对来降低数据量,同时还会将字符串进行霍夫曼编码来压缩字符串大小。

以常用的 User-Agent 为例,它在静态表中的索引值是 58,它的值是不存在表中的,因为它的值是多变的。第一次请求的时候它的 key 用 58 表示,表示这是一个 User-Agent ,它的值部分会进行霍夫曼编码(如果编码后的字符串变更长了,则不采用霍夫曼编码)。服务端收到请求后,会将这个 User-Agent 添加到 Dynamic Table 缓存起来,分配一个新的索引值。客户端下一次请求时,假设上次请求User-Agent的在表中的索引位置是 62, 此时只需要发送 0xBE(同样的,高位置 1),便可以代表: User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36。其过程如下图所示:

 

HPACK: Header Compression for HTTP/2

技术分享

图来自: http://chimera.labs.oreilly.com/books/1230000000545/ch12.html#HTTP2_PUSH

 

WireShark  可以看到具体的 Header 解密后的内容,如下图:

技术分享

上图是用的 WireShark  Development Release (1.99.6) 看到的 Header frame 的内容。

https://www.wireshark.org/download.html 

 

Header  Frame 的数据格式

HTTP2 的 Header Frame 的数据区, 分下面几种格式,相关资料请参考:http://http2.github.io/http2-spec/compression.html#index.address.space

 

1、在 预定的头字段静态映射表 中已经有预定义的 Header Name 和 Header Value值

技术分享

这时候的二进制数据格式如上图, 第一位固定为1, 后面7位为映射的索引值

An indexed header field starts with the ‘1‘ 1-bit pattern, followed by the index of the matching header field, represented as an integer with a 7-bit prefix

例子,

下图的 83 就是这样的,  83 的二进制字节标示  1000 0011 , 抹掉首位, 就是 3 , 对应的 静态映射表中 的 method: POST。

技术分享 

注意,不存在首位为0,但是后面可以在静态表中可以找到的情况。

 

2、 预定的头字段静态映射表中有 name,需要设置新值。

Literal Header Field with Incremental Indexing

这种情况下的数据格式为:

技术分享

例子, 一个指定 path的Header, 

首字符 为 44 ,对应的二进制位   0100 0100   前两个字符为 01 ,  Index 为 4 , 即对应静态映射表中的 path 头。

第二个字符为 95  对应的二进制位 1001 0101 ,排除首字符对应的 Value Length 为 十进制的21。 即 算上 44, 一共23个字符来记录这个信息。

技术分享

 

 

3、预定的头字段静态映射表中没有 name,需要设置新name和新值。

技术分享

例子

40 的二进制是  0100 0000,   
02 的二进制是  0000 0010, 后七位的十进制值是 2

86 的二进制是  1000 0110  后7位的十进制值是 6

技术分享

 

其他还有2种情况:

Literal Header Field without Indexing

  • Literal Header Field without Indexing — Indexed Name

  • Literal Header Field without Indexing — New Name

Literal Header Field Never Indexed


    • Literal Header Field Never Indexed — Indexed Name

    • Literal Header Field Never Indexed — New Name

请参考: http://http2.github.io/http2-spec/compression.html#index.address.space 

 

附录

HTTP2 中, 预定的头字段静态映射表如下。(Table 1: Static Table Entries)

技术分享

 


© 著作权归作者所有

共有 人打赏支持
Candy_Desire
粉丝 31
博文 71
码字总数 84592
作品 0
浦东
产品经理
HPACK 完全解析

去年五月, IETF 正式发布了 HTTP/2 协议与之配套的 HPACK 头部压缩算法。 RFC 如下: Hypertext Transfer Protocol Version 2 RFC 7540 HPACK: Header Compression for HTTP/2 RFC 7541 笔者......

任我行
2016/08/20
0
0
HTTPS、SPDY、HTTP/2 对比

整理自:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 Firefox 35,成为第一个默认开启支持HTTP/2协议的浏览器。Chrome也支持了,只是以SPDY 4的名义,并且要自己在里面手动开...

Candy_Desire
2015/12/30
263
0
HTTPS, SPDY和 HTTP/2性能的简单对比

中文原文:HTTPS, SPDY和 HTTP/2性能的简单对比 整理自:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 请尊重版权,转载请注明来源,谢谢! Firefox 35这周发布了,成为第一个...

天马行空的鱼
2016/03/21
45
0
okhttp 3.4.0 和 3.4.1 发布,HTTP+SPDY 客户端开发包

okhttp 3.4.0 和 3.4.1 发布了,okhttp 是一个 Java 的 HTTP+SPDY 客户端开发包,同时也支持 Android。 3.4.0 更新如下: New: Support dynamic table size changes to HPACK Encoder. Fix:......

NextLife
2016/07/11
2.5K
7
使用 JSON.hpack 对 JSON 数据进行大幅压缩

JSON.hpack 是一个用来压缩 JSON 数据的工具包和算法,目前提供了 PHP 和 C# 两种语言的版本。

红薯
2011/06/28
573
0
HTTP/2 正式通过 IETF 组织批准发布

超过两年的讨论,超过 200 个设计问题, 17 个草案 和 30 个实现, HTTP/2 和 HPACK 规范终于通过了 IETF 组织的批准并作为可跟踪的 RFC 标准。HTTP/2 将帮助实现更快的用户浏览体验,降低带宽...

oschina
2015/02/20
3.3K
6
okhttp 3.4.0 RC1 发布,HTTP+SPDY 客户端开发包

okhttp 3.4.0 RC1 发布了,更新如下: 改写了 HttpURLConnection 和 HttpsURLConnection. Cipher suites 现在可能有任意的名称。 Fix: now matches canonicalized hostnames. Fix: Don’t c......

淡漠悠然
2016/07/04
1K
0
JSON压缩算法--JSON.hpack

JSON.hpack 是一个用来压缩 JSON 数据的工具包和算法,目前提供了 PHP 和 C# 两种语言的版本。 压缩前: [{name : "Andrea",age : 31,gender : "Male",skilled : true}, {name : "Eva",age ...

匿名
2011/06/28
14K
1
HTTP2.0 协议被曝 4 个高危漏洞,可致服务器崩溃

如果你认为HTTP2.0协议比标准HTTP(超文本传输协议)更安全,那你就错了。有研究人员花费4个月的时间在HTTP2.0协议中发现4个漏洞! 去年2月,谷歌把自家的SPDY项目捆绑进HTTP2.0,意在加强网...

oschina
2016/08/08
4.6K
16
Python 的 HTTP 草拟规范--Python Hyper

HTTP 规范在不久之后就会升级,从 HTTP/1.1 升级到 HTTP/2.0。新的规范包括了许多很棒的新机制,HTTP/1.1 将无法处理这些特性。 Hyper 就是个纯 Python 实现的当前 HTTP/2.0 规范的 draft(9)...

叶秀兰
2014/02/27
393
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

20位活跃在Github上的国内技术大牛 leij 何小鹏 亚信

本文列举了20位在Github上非常活跃的国内大牛,看看其中是不是很多熟悉的面孔? 1. lifesinger(玉伯) Github主页: https://github.com/lifesinger 微博:@ 玉伯也叫射雕 玉伯(王保平),...

海博1600
12分钟前
0
0
高性能服务器本质论

一 服务器分类 从软件性能角度,高性能服务器分:cpu密集型服务器/IO密集型服务器 (1)CPU密集型:该类服务器没有对io的访问/没有同步点,性能瓶颈在于对cpu的充分利用。 典型的如转发服务器/...

码代码的小司机
13分钟前
0
0
Mybatis收集配置

一、Mybatis取Clob数据 1、Mapper.xml配置 <resultMap type="com.test.User" id="user"> <result column="id" property="id"/> <result column="json_data" property="jsonData" ......

星痕2018
38分钟前
0
0
centos7设置以多用户模式启动

1、旧版本linux系统修改inittab文件,在新版本执行vi /etc/inittab 会有以下提示 # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON......

haha360
今天
0
0
OSChina 周日乱弹 —— 局长:怕你不爱我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ andonny :分享周二珂的单曲《孤独她呀》 《孤独她呀》- 周二珂 手机党少年们想听歌,请使劲儿戳(这里) @孤星闵月 :没事干,看一遍红楼梦...

小小编辑
今天
192
9
Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式 Factory工厂模式 Singleton单例模式 Delegate委派模式 Strategy策略模式 Prototype原型模式 Template模板模式 Spring5 beans 接口实例化 代理Bean操作 ...

小致dad
今天
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
11
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
17
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
254
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部