作家
登录

HTTP2总结及简单实践总结

作者: 来源: 2017-09-22 12:07:21 阅读 我要评论

HTTP2总结及简单实践

  • 保护一份雷同的静态字典(Static Table),包含常见的头晨名称,以及特别常见的头晨名称与值的组合
  • 保护一份雷同的动态字典(Dynamic Table),可以动态地添加内容
  • 支撑基于静态哈夫曼码表的哈夫曼编码(Huffman Coding)

静态字典

静态字典就是把常用的头晨映射为字节较短的索引序号,如下图所示,朝长进步了前面几个映射,全部定义可以看 Static Table Definition

HTTP2总结及简单实践

例如当头部有个字段是 :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。

HTTP2总结及简单实践

jdk7和jdk8经由过程添加jvm参数参加第三方alpn支撑包,留意版本不克不及搞错,jdk7应用 alpn-boot-7.*.jar ,jdk8应用 alpn-boot-8.*.jar ,这里有版本对应关系 alpn-versions

  1. # jdk8 
  2. -Xbootclasspath/p:/home/payne/Downloads/alpn-boot-8.1.11.v20170118.jar 
  3. # jdk7 
  4. -Xbootclasspath/p:/home/payne/Downloads/alpn-boot-7.1.3.v20150130.jar 
  5. # jdk9 
  6. # 应用jdk9平台时,留意okhttp版本大年夜于3.3.0  
  7. # https://mvnrepository.com/artifact/org.mortbay.jetty.alpn/alpn-boot 

【编辑推荐】

  1. 开启HSTS让浏览器强迫跳转HTTPS拜访
  2. 在Android上实现HttpServer
  3. 魏何你会被强插告白?谈HTTPS连接的那些事
  4. 若何做到兼顾安然与机能?电商网站HTTPS优化摸索与实践
  5. 经由过程HTTP协定做Web缓存

      推荐阅读

      大数据影响经济生活 是AI的基石

    【沙龙】51CTO诚邀您9月23号和多位技巧大年夜咖一路聊智能CDN的优化之路,抓紧时光哦! 谈到AI就必须谈大年夜数据,谈到大年夜数据就得谈云计算。在今天ABC(人工智能AI、大年夜数据Bigdada>>>详细阅读


    本文标题:HTTP2总结及简单实践总结

    地址:http://www.17bianji.com/lsqh/37583.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)