
- 保护一份雷同的静态字典(Static Table),包含常见的头晨名称,以及特别常见的头晨名称与值的组合
- 保护一份雷同的动态字典(Dynamic Table),可以动态地添加内容
- 支撑基于静态哈夫曼码表的哈夫曼编码(Huffman Coding)
静态字典
静态字典就是把常用的头晨映射为字节较短的索引序号,如下图所示,朝长进步了前面几个映射,全部定义可以看 Static Table Definition

例如当头部有个字段是 :method: GET ,那么查表可知,可以用序号2标识,于是这个字段的数据就是 0000010 (2的二进制表示)
动态字典
静态字典能表示的头晨数据毕竟有限,紧缩率也不会高。然则对于一个站点来讲,和某个用户交互时会产生异常多的请求,然则每次请求头部差别不大年夜,话苄很多反复数据,因为用户和浏览器的标识是不变的。那么我们可以针对一次HTTP2的连接生成一个可添加映射的动态字典,如许再后面的连接中就可以应用动态字典中的序号。动态字典的生成过程其实就是通知对方添加映射,客户端可以通知办事端添加,反之亦可。
具体的通知方法就是按照协定规定的格局传输数据。
在 HTTP/0.9 和 HTTP/1.0 中,第3步之后,办事端就会封闭连接,也就是TCP的四次挥手,然则在 HTTP/1.1 后,客户端在发送HTTP请求时头部可以带上 Connection:Keep-Alive ,就是告诉办事器保持连接,不要封闭TCP。当 Connection:Close 时,办事器会封闭连接。
Huffman Coding
哈弗曼编码的特点是出现频率越高,编码长度越短。HTTP2协定中根据大年夜量的请求头部数据样本生成了一种canonical Huffman code,具体在 Huffman Code 列出。
流控 (Flow control)
HTTP/2 流量控制的目标,在流量窗口初始值的束缚下,赐与接收端以全权,控制当下想要接收的流量大年夜小。
算法:
- 两端(收发)保有一个流量控制窗口(window)初始值。
- 发送端每发送一个DATA帧,就把window递减,递减量为这个帧的大年夜小,如果window小于帧大年夜小,那么这个帧就必须被拆分。如不雅window等于0,就不克不及发送任何帧
- 接收端可以发送 WINDOW_UPDATE帧给发送端,发送端以帧内指定的Window Size Increment作为增量,加到window上
办事端推送 (Server Push)
流程:
- 客户端在交换 SETTINGS 帧时,设置字段 SETTINGS_ENABLE_PUSH(0x2) 为1显式许可办事器推送
- 办事器在接收到请求时,分析出要推送的资本,先发个 PUSH_PROMISE 帧给浏览器
- 然后再发送各个response header和response body
- 浏览器收到 PUSH_PROMISE 帧时,根据header block fragment字段里的url,可以知道当前有没有缓存,大年夜而断定是否要接收。如不雅不要,浏览器就要发送个 RST_STREAM 来终止办事器推送
问题:
- 流量浪费。若浏览器有缓存,不要这个推送,就会出现浪费流量的现象,因为全部过程都是异步的,在办事器接收到RST_STREAM时,响应很有可能部份发出或者全部发出了。
HTTP/2简单实践
Okhttp是一个java生态中有名的的http client,因为其简单易用,机能较好,支撑http2。下面用这个对象来实践下,因为本人博客已经在nginx上设备了http2,就拿本博客来实验下。
用过Okhttp的同窗就会发明,这跟日常平凡用的办法一样啊,没有任何差别,是的没错,就是没有任何差别。其余不多说,履行下看看,不幸的是你会发明protocol照样http1.1,并不是h2,这是怎么回事?这是因为HTTP2新参加了ALPN(Application Layer Protocol Negotiation),大年夜字面意思懂得就是应用层协定协商,即两边磋商下用哪个协定。不幸的是jdk8是在2014年宣布的,当时HTTP2协定还没出身,荣幸的是经由过程第三方jar包就可以支撑ALPN。别的jdk9已经支撑了HTTP2,固然还没正式宣布,然则我们可以试用下JDK 9 Early-Access Builds。

jdk7和jdk8经由过程添加jvm参数参加第三方alpn支撑包,留意版本不克不及搞错,jdk7应用 alpn-boot-7.*.jar ,jdk8应用 alpn-boot-8.*.jar ,这里有版本对应关系 alpn-versions
- # jdk8
- -Xbootclasspath/p:/home/payne/Downloads/alpn-boot-8.1.11.v20170118.jar
- # jdk7
- -Xbootclasspath/p:/home/payne/Downloads/alpn-boot-7.1.3.v20150130.jar
- # jdk9
- # 应用jdk9平台时,留意okhttp版本大年夜于3.3.0
- # https://mvnrepository.com/artifact/org.mortbay.jetty.alpn/alpn-boot
【编辑推荐】
- 开启HSTS让浏览器强迫跳转HTTPS拜访
- 在Android上实现HttpServer
- 魏何你会被强插告白?谈HTTPS连接的那些事
- 若何做到兼顾安然与机能?电商网站HTTPS优化摸索与实践
- 经由过程HTTP协定做Web缓存
推荐阅读
【沙龙】51CTO诚邀您9月23号和多位技巧大年夜咖一路聊智能CDN的优化之路,抓紧时光哦! 谈到AI就必须谈大年夜数据,谈到大年夜数据就得谈云计算。在今天ABC(人工智能AI、大年夜数据Bigdada>>>详细阅读
本文标题:HTTP2总结及简单实践总结
地址:http://www.17bianji.com/lsqh/37583.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示