一、HTTP2的前世
在我们所处的互联网世界中,HTTP协议算得上是使用最广泛的网络协议了。HTTP建立之初,主要就是为了将HTML从web服务器传送到客户端的浏览器。但是近几年web发展非常迅速,我们的页面变得复杂起来,有很多动画效果以及ajax等技术获取服务端数据,来丰富我们的页面展示,这些都是基于HTTP协议的。
我们可以看到2015年以前很长一段时间都在使用HTTP1.x的协议,在1.0中比较突出的问题就是连接无法复用和head of line blocking这两个问题。
连接无法复用会导致每次请求都经历三次握手和慢启动,三次握手无疑会增加了大量的延迟时间,尤其在高延迟的场景和移动端更为突出,在1.1之后Connection的默认值就是Keep-Alive,可以用一张图来体现他们的区别:
head of line blocking在第一个请求没有收到回复之前,后续发出的请求只能排队。一旦前一个请求的request因为什么原因没有抵达服务器,或者response因为网络阻塞没有及时返回,影响的就是所有后续请求,这将会导致带宽无法被充分利用。在1.1中运用了管道技术(HTTP Pipelining)来解决这个问题,它把多个HTTP请求放到一个TCP连接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应,同样用一张图来体现他们的区别:
但是pipelining并不能彻底解决holb的问题,比如只有GET,HEAD才能使用,POST不能使用,因为请求之间可能会存在先后依赖关系,并且在server端的response由于遵循FIFO的原则还是要求依次返回,等其它缺陷。
二、HTTP2应运而生
HTTP1.x依然存在一些问题,直到2012年google提出了SPDY的方案,通过多路复用、请求优先级、header压缩等功能来解决http1.x的遗留问题,但是google决定在2016年不再继续支持SPDY开发。就在这个SPDY催化剂的作用下,HTTP2应运而生,而且其实HTTP2就是以SPDY为原型进行讨论和制定的。
三、HTTP2特性
HTTP2作为新版协议,改动了很多细节并且增加了一些新的特性,这里举例几个比较重要的特性:
多路复用:通过多个request共享一个tcp连接的方式,一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的id将request再归属到各自不同的服务端请求里面。这样解决了http1.x holb的问题,降低了延迟同时提高了带宽的利用率。
HTTP1.1和HTTP2的区别可能就是这样了:
请求优先级:多路复用导致所有资源都是并行发送,那么就需要优先级的概念了。把HTTP消息分解为很多独立的帧之后,就可以通过优化这些帧的交错和传输顺序,每个流都可以带有一个31比特的优先值:0 表示最高优先级;2的31次方-1表示最低优先级。服务器可以根据流的优先级,控制资源分配(CPU、内存、带宽),在响应数据准备好之后,优先将最高优先级的帧发送给客户端。
首部压缩:HTTP2会压缩首部元数据,在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键值对,对于相同的头部,不必再通过请求发送。比如对同一资源的轮询请求的场景,所有首部都自动使用之前请求发送的首部,那么首部开销就是零字节。如果首部发生变化了,那么只需要发送变化的数据在Headers帧里面,新增或修改的首部帧会被追加到“首部表”。
二进制分帧:HTTP2在应用层和传输层之间增加了一个二进制分帧层,将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。
并且HTTP2的通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。通过这种单连接多资源的方式,可以更有效地利用TCP连接,减少服务端的压力,内存占用更少,连接吞吐量更大。
服务器推送:服务端推送是一种在客户端请求之前发送数据的机制,HTTP2能通过push的方式将客户端需要的内容预先推送过去,所以也叫“cache push”。客户端如果退出某个业务场景,出于流量或者其它因素需要取消server push,也可以通过发送RST_STREAM类型的frame来做到。
四、HTTP2的今生
HTTP2不会是万金油,但抹了也不会有副作用。作为新版本协议肯定需要一段时间去普及,HTTP本身属于应用层协议,和当年的网络层协议IPV6不同,它离底层协议越远,对网络基础硬件设施的影响就越小。其次HTTP2还考虑了与HTTP1.x的兼容问题,因此在升级新版本的时候并不会带来太多的阻力。HTTP2最大的亮点在于多路复用,这对于浏览器的大型网站来说肯定是福音,同样移动端比如淘宝京东的APP,HTTP请求量非常大,HTTP2带来的性能提升还是非常明显的。下图是官方的一个测试网站,使用了HTTP1.1和HTTP2同时请求数百张图片的时间差距还是非常明显的: