HTTP/2初印象
HTTP/2是什么?
众所周知,互联网的基础是网络,网络中最主要的协议即是TCP/IP协议族
。而在此之上,承载了绝大部分网络应用的、可能是最重要的应用层协议(OSI模型
)当属——HTTP协议
。目前使用最为广泛的是HTTP/1.1
版本,回头看看RFC2616(Hypertext Transfer Protocol -- HTTP/1.1)
文档的提出已经是千禧年前了。为了与时俱进,以更好的促进互联网世界的繁荣,走向更高、更快、更强,业界大佬们终于鼓捣出了HTTP/2
,即HTTP协议
的2.0版本。那么,到底什么是HTTP/2
呢?这里引援一下官方网站的原文:
HTTP/2 is a replacement for how HTTP is expressed “on the wire.” It is not a ground-up rewrite of the protocol; HTTP methods, status codes and semantics are the same, and it should be possible to use the same APIs as HTTP/1.x (possibly with some small additions) to represent the protocol.
The focus of the protocol is on performance; specifically, end-user perceived latency, network and server resource usage. One major goal is to allow the use of a single connection from browsers to a Web site.
The basis of the work was SPDY, but HTTP/2 has evolved to take the community’s input into account, incorporating several improvements in the process.
总得来说,HTTP/2
主要目的就是改善原有协议一直以来被人诟病的性能问题,其主要由以下两个RFC组成:
RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2);
RFC 7541 - HPACK: Header Compression for HTTP/2;
HTTP/2做了些什么?
那么,为了提升1.1协议的性能,我们来看看HTTP/2
到底做了些什么。
多路复用(Multiplexing)
简单概括一下,多路复用就是在单次的TCP传输过程中进行多次请求,从而在不增加请求数的情况下增加了并发量,从而提高性能。
Paste_Image.png如上图所示,左边的1.1协议请求三个文件
index.html
styles.css
script.js
分别发起了三次请求,每次完成对一个文件的请求。而右边的4 5 6三个节点所展示的就是在一次传输过程中同时请求了styles.css
script.js
两个文件。通过这种方式,可以明显的看到timeline的缩短,大大减少了页面的载入时间。这样说来,以后我们前端对
css
文件,js
文件等的合并打包操作变的不再那么必要了。Hooray~
二进制分帧(Binary Framing)
正如上文引用所述,HTTP/2
并非是对现有的1.1协议进行操翻重写,现有的方法、状态码、语义等等都依然保持一致,从而避免了巨大的迁移成本。实现这个效果很重要的一点就是Binary Framing
。接着上图:
如上图,在原有协议模型中,HTTP
依附于TCP
之上(对HTTPS
而言则是TLS
),HTTP/2
则是在其间加上了一个二进制分帧层。原有的报文首部被拆分封装到首部分帧中,内容(payload)则被封装到数据分帧中,这样以便于实现单连接多资源的效果。
首部压缩(Header Compression)
在互联网发展过程中,由于我们对cookie
的使用越来越频繁,以及出于授权、验证等目的在HTTP
头部增加了大量的内容,致使报文头部愈发臃肿。现有的1.1协议中是不支持首部压缩的,故在之前谷歌搞出来的SPDY
和这里介绍的HTTP/2
都增加了对首部进行压缩的操作,以减少网络中传输数据的冗余度,在同等信道传输的情况下增加了信息量。
上文提及的两篇RFC文档中,第二篇即是介绍HTTP/2
的首部压缩算法HPACK
,有关算法的具体内容此处就不再赘述。
服务端推送(Server Push)
正如这项特性名称所述,是服务端向客户端推送的一种机制。这让笔者不得不想到了websocket
。此两者区别在于,前者致力于减少时延,服务端只能根据客户端的请求返回额外的Push流,此流需要和正常的响应处于同一个TCP
连接中,所以也就要求Push的资源和主页面由同一个服务端输出;而后者主要致力于提供一种客户端与服务端的双向通信机制,提供了一系列的API以便使用。在使用场景上存在一定的重叠,具体会怎么发展和在业务场景中进行抉择还有待观察。
Talk is cheap, ...
好了,说了这么多,那么HTTP/2
到底比起现有1.1协议能带来多大的提升呢?「Akamai」提供了 HTTP/1
和HTTP/2
的对比,大家可以用自己的浏览器测试一下。
在笔者的电脑及网络环境下,可以看到使用新协议带来的加载速度提升是十分可观的,差不多是旧协议的20%。
那么,问题来了,现在的环境下,
HTTP/2
的兼容性到底怎么样呢?
Paste_Image.png
可以看到,在PC端,新式浏览器的近期版本已经能够支持
HTTP/2
;而移动端支持尚不足,这也跟移动端设备换代及系统内核更新速度有关。鉴于我国的实际使用环境,IE 6/7/8/9尚有市场空间,国产浏览器又裹足不前,新协议的大规模使用尚有待时日。但在科技日新月异的今天,我们有理由相信大家对于更好产品体验的追求比然会加速技术的迭代速度,使得下一个时代更快到来。
参考资料:
官方网站: https://http2.github.io/
知乎大神们的回答:https://www.zhihu.com/question/34074946
HTTP/2 资料汇总: https://imququ.com/post/http2-resource.html