写点什么

HTTP/2 总结

用户头像
guoguo 👻
关注
发布于: 2020 年 07 月 10 日

百科定义

HTTP/2 (原名HTTP/2.0)即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。HTTP 2.0在2013年8月进行首次合作共事性测试。在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。DANE RFC6698允许域名管理员不通过第三方CA自行发行证书。

HTTP/2 的特点

Header压缩

在HTTP/1.x中,HTTP请求包含了状态行、请求/响应头、请求体。而其中请求体一般通过gzip压缩或本身传输的就是压缩后的二进制文件,但是状态行和请求/响应头是没有经过压缩的,传输的是文本信息。

而随着Web服务功能越来越复杂,请求也越来越多,像一些不怎么变化的UserAgent、Cookie等信息每次都要重复的传输,造成网络带宽和流量等资源的浪费。

在HTTP/2中提出了,使用HPACK来压缩头部。



头部的压缩需要在支持HTTP/2的服务端和浏览器之间:

  1. 维护一份相同的静态字典(Static Table),包含常见的头部名称,以及特别常见的头部名称与值的组合。

  2. 维护一份相同的动态字典(Dynamic Table),可以动态地添加内容。

  3. 持基于静态哈夫曼码表的哈夫曼编码(Huffman Coding)。



在编码时,它们直接用一个index编号代替,例如:method:GET是2,这些在一个静态表定义。静态表的定义如下,总共61个Header Name,点击URLhttps://tools.ietf.org/html/rfc7541#appendix-A查看所有静态表的定义。



例如,:method: GET 就是一个静态变量,直接使用2。对于动态的内容,例如 cookie: xxxxxxxxx,添加到动态字典中,这样后续整个键值对就可以使用一个字符表示了。

对于静态、动态字典中不存在的内容,还可以使用哈夫曼编码来减小体积。HTTP/2 使用了一份静态哈夫曼码表(详见),也需要内置在客户端和服务端之中。

多路复用

在HTTP/1.x中,有时并发多个TCP请求来提升性能,但是必须得使用多个TCP连接。

请求的过程是这样的:

浏览器请求 url -> 解析域名 -> 建立 HTTP 连接 -> 服务器处理文件 -> 返回数据 -> 浏览器解析、渲染文件

每次请求都需要建立一次 HTTP 连接,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,而且逻辑上是非必需的。为了解决这个问题, HTTP 1.1 中提供了 Keep-Alive,允许我们建立一次 HTTP 连接,来返回多次请求数据。

但是,HTTP 1.1 基于串行文件传输数据,因此这些请求必须是有序的,所以实际上我们只是节省了建立连接的时间,而获取数据的时间并没有减少。另外,大部分浏览器最大并发请求数6左右,那么假如Tomcat设置最大并发数300,那么服务器能承受的最大并发数就是50。



HTTP/2 对同一域名下所有请求都是基于流,也就是说同一域名不管访问多少文件,也只建立一路连接。同样Tomcat的最大连接数为300,因为有了这个新特性,最大的并发就可以提升到300,比原来提升了6倍。

HTTP/2 通过允许客户端和服务端把HTTP消息分解成独立的帧,交错传输,然后在另一端组装。

二进制帧层

HTTP/2 不改变HTTP既有的语义,HTTP 方法、状态码、URI 及首部字段等,而提升请求的性能,降低延迟提升吞吐量。

性能提升的核心在于二进制帧层.它指HTTP消息在客户端和服务端如何封装和传输。

与HTTP1.x的采用的换行符分隔文本不同,HTTP/2 消息被分成很小的消息和frame,然后每个消息和frame用二进制编码。客户端和服务端都采用二进制编码和解码。

HTTP 2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。

服务端推送

网站的加载过程

a) 首先浏览器请求主页面index.html,服务端响应内容;

b) 获取到主页应答,浏览器开始解析主页的html标签,发现构建DOM树还需要CSS, GIF, JS等资源;

c) 发起针对CSS,GIF,JS的内容请求;

d) 获取并解析JS和CSS等内容, 然后继续请求依赖资源。



无服务器推送的数据交互

浏览器和服务器的交互过程,横轴代表时间轴,每个虚线区间是1个RTT。红色竖线表示DOM 加载完成的时间。从图中可知,虽然存在并发传输, 但主页index.html和依赖的资源common.css、0684a8bf.css、comb.nowrap.0b772fee.js等总体上是顺序的,等待资源响应的时间减慢了主页面加载速度。并发传输并不能提高串行解析的资源访问体验。



使用服务器推送的数据交互

JS/CSS资源基本可以和HTML资源同步到达,浏览器可以“无延时”获取JS/CSS资源,客户端的延时最多可以减少一个RTT。

参考

《深入浅出:HTTP/2》

https://www.cnblogs.com/confach/p/10141273.html

《HTTP/2 多路复用技术分享》

https://www.jianshu.com/p/ff8f0bd78942

《HTTP/2之服务器推送(Server Push)最佳实践》

https://www.cnblogs.com/qcloud1001/p/9370493.html



用户头像

guoguo 👻

关注

还未添加个人签名 2017.11.30 加入

还未添加个人简介

评论

发布
暂无评论
HTTP/2 总结