http2.x新特性
HTTP/2的主要设计思想,源自于Google的SPDY协议。是互联网工程任务组(IETF)对谷歌提出的SPDY协议进行标准化才有了现在HTTP/2。下面介绍HTTP/1.x
和HTTP/2.x
一、多路复用的单一长连接
1.单一长连接
在HTTP/2.x
中,客户端向某个域名的服务器请求页面的过程中,只会创建一条TCP连接。即使这个页面可能包含上百个资源。
而之前HTTP/1.x
则是会创建多条TCP连接去请求资源。单一的连接是HTTP/2.x
的主要优势,单一的连接能减少TCP握手带来的时延(如果是建立在SSL/TLS上面,HTTP/2.x
能减少很多不必要的SSL握手)
另外,TCP协议有滑动窗口
,和慢启动
。慢启动的意思是每次建立连接后,数据先是慢慢的传,然后滑动窗口慢慢变大,才能较高速地传。当这条连接的滑动窗口刚刚变大,HTTP/1.X
就创个新连接传数据(这就好比人家HTTP2一直在高速上一直开着,你HTTP1.x是一辆公交车走走停停)。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。
所以咯,HTTP/2.x
中用一条单一的长连接,避免了创建多个TCP连接带来的网络开销,提高了吞吐量。
2.多路复用
HTTP2虽然只有一条TCP连接,但是在逻辑上分成了很多stream。先记住这个特性
image图片来源:http://www.360doc.com/content/16/0120/09/30136251_529253725.shtml
以前的HTTP/1.X
在多个请求的情况下,是串行执行的这样在效率上是不足的。
而在HTTP/2.X
则不同,下面就介绍以下,多路复用是怎么做到的。
我们可以想象一个场景,在高速路上的收费站,为了提高效率是不是一个收费站有很多个门供驶过的汽车进行收费的?
HTTP2把要传输的信息分割成一个个二进制帧。首部信息会被封装到HEADER Frame,相应的request body 就放到DATA Frame,一个帧可以想象成是一辆汽车,只要给这些汽车编上号码,让一号车走一号门,二号车走二号门,就可以把不同的http请求或者响应区分开来,但是,这里要求同一个请求或者响应的帧必须是有序的,要保证FIFO(先进先出),但是不同的请求或者响应帧可以相互穿插。
以上流程就是HTTP2的多路复用,这样做可以充分的利用了网络带宽,也提高了并发度。
更进一步,HTTP/2.x
还能对这些流(车道)指定优先级,优先级能动态改变,就比如说把CSS和JS文件设置的比图片的优先级更高,这样代码可以更快的下载下来,并且运行。
二、头部压缩和二进制格式
http1.x
一直都是plain text,对此我只能想到一个优点,便于阅读和debug。但是,现在很多都走https,SSL也把plain text变成了二进制,那这个优点也没了。
于是HTTP2
搞了个HPACK压缩来压缩头部,减少报文的大小。HPACK把报文中常见的字段名和值变成一个索引index,也就是维护了一张静态索引表。例如把method:GET
对应成索引表中index为2的一个值。但头部还有一些不确定的东西,比如user-agent对应的浏览器名字。
所以它也维护了一个动态的索引表,静态表索引值为2-61 ,这时候数据传输过程中发现一个user-agent Mozilla/5.0
,那就把这个追加到动态索引表值为62的地方,这次开始就用62替代这个user-agent Mozilla/5.0
,所以这个动态索引表是在数据传输过程中逐步建立的,静态索引表是写死的。
此外,对于资源路径这种完全不确定的东西,HPACK就采用Huffman编码来压缩,这样三管齐下,头部内容就能大幅减少。可以看看下面的HPACK示意图
image头部需要压缩的原因
因为一些重复的东西在每个http请求里面都有,例如method:GET
。当一个客户端从同一个服务器请求一些资源的时候,这些请求看起来几乎是一致的。而这些大量一致的东西正好值得被压缩
另外,HTTP1.1
请求的大小变得越来越大,有时甚至会大于TCP窗口的初始大小,这会严重拖累发送请求的速度。因为他们需要等待带着ACK的响应报文回来以后,才能继续被发送。尤其是当http请求内容超过TCP报文最大报文大小时,会被分成几个TCP报文,这时候如果压缩,能减少TCP报文个数,就能减少几个RTT(往返延时)时间了
需要注意的是,头部压缩也带来CPU消耗,而且如果刚好头部能被装到一个TCP报文里面,那么压缩的意义其实并不大。而且大部分响应报文的body会比header大很多,这时候压缩头部也显示有点多余。
服务端推送Server Push
这个功能又被称为:"缓存推送"。主要的思想是,当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端
这个功能帮助客户端将Z放进缓存以备将来之需。服务器推送需要客户端显式的允许服务器提供该功能。即使如此,客户端依然能自主选择是否需要中断该推送流。当客户端不需要的时候,可以通过发送一个RST_STREAM
帧来中止。
最后再说一下为什么HTTP2能去掉SSL在HTTP1.X
上的开销
1.单一的长连接,减少SSL握手的开销
2.头部被压缩,减少了数据传输量
3.多路复用能大幅提高传输效率,不用等待上一个请求的响应
4.不用像http1.x
那样把多个文件或者资源弄成一个文件或者资源,这时候,缓存就能更容易命中。
总结:HTTP2利用了单一的长连接和多路复用的特性,提高了网络的吞吐量,并且又用了HPACK压缩对报文头部压缩,减少报文的数据量。从而提升了前后端请求数据的性能
原文https://cloud.tencent.com/developer/article/1004874
参考文章: https://www.jianshu.com/p/f44b930cfcac
网友评论