liqiang 的博客.

HTTP/2 的简单知识

Word count: 1,235 / Reading time: 5 min
2018/07/10 Share

最近看到了些关于 HTTP/2 的资料,想来 HTTP/2 从 Google 想搞 SPDY 以来也是有好些个年头的,不知道现在的情况如何。于是乎,带着一些好奇心就开始进行了一些探索,然后,发现结果还算令人满意。在我访问了大部分网站中,有部分或者全局使用了 HTTP/2,至于怎么发现的,后面我会介绍一个工具;然而,好些网站的部分使用并不是网站主自己想使用,而是引用了一些 CDN 或者站外内容引用而让我觉得有使用的感觉,这是从供应方的角度去看的。

另外一个方面就是使用方,作为一个网站,其价值可能更多得还是来自于浏览器的访问,当然你也可以说当前网络状况是超过 60% 的流量都是爬虫,但是,这些爬虫产生的价值可能不是供应方所需要的。因此,我也了解了一下截止到目前(2018-07-10) 为止,对 HTTP/2 提供支持的浏览器,现在的情况是这样的:

根据 caniuse.com这个网站的统计数据, 截止到当前状态,包括移动端和 PC 端的用户,已经有将近 84% 的用户使用的浏览器是支持 HTTP/2 了,当然,我没有去细究这份数据的来源以及统计的样本集,但是,这至少可以窥得一斑,现在是时候来了解一下 HTTP/2 了!

HTTP/2 是啥

从 Wiki 中的介绍可以看到,HTTP/2 是 HTTP 的第 2 版,在之前我们常用的 HTTP 版本是 HTTP/1.1,同时也是很多 Web 服务器默认使用的版本。那么为什么会出现 HTTP/2 呢?主要原因我认为有这么几个:

  • HTTP 的速度慢,例如解析一个 HTML 页面之后,解析到有额外的引用 CSS/JS 之类的需要单独请求,并且一般浏览器都有请求并发上限(最近一个遇到比较坑的情况就和这有关)
  • HTTP 的文本是明文,这虽然有利于使用 CURL 之类的工具调试,但是对于网络和服务端来说带来了额外的负载,同时还有安全性也是一个考虑点。
  • HTTP 的头部结构和数据结构的不合理,例如头部都是以换行作为分割,这些旧的机制有些不合时宜了。

于是乎,有些新的东西需要被推出来,但是,一开始这却不是 HTTP/2,而是 Google 家一直在推荐的 SPDY(speedy)。

SPDY

现在打开一些网站你甚至于还可以看到 SPDY 协议,这个东西是 Google 为了克服 HTTP1.1 而设计的一套通信协议,同时也是后面 HTTP/2 的基石。SPDY 最初的设计理想是为了降低延迟,其实可以理解成为了解决我上面说的 HTTP1.1 的第一条缺点,而采用 TCP 通道。

与 HTTP1.1 相比,SPDY 新增的特性有(摘抄 Wiki):

  • 实现无需先入先出的多路复用【Fix 1】
  • 为简化客户端和服务器开发的消息—帧机制【Fix 2】
  • 强制性压缩(包括HTTP头部)【Fix 3】
  • 优先级排序【Fix 1】
  • 双向通讯

HTTP/2

随着协议的推进,权威队伍 IETF 觉得该做点实事了,于是 HTTP/2 的进程就加快了,最终在 2015 年标准正式发表。现在已经被大多数浏览器所支持。但是,要说到 HTTP/2 就得说一下 HTTP/2 有多个不同的版本,其实区别在于当我们默认使用 HTTP/1.1 访问时,服务器会和浏览器交流说服务器已经支持 HTTP/2 了,被使用的方式分别有:

  • h2c:非加密的 HTTP/2,可以通过 HTTP/1.1 响应 Upgrade 来使用
  • h2-ALPN:加密的 HTTP/2,通过 TLS 的 ALPN 扩展来完成 HTTP/1.1 到 HTTP/2 的响应
  • h2-NPN:加密的 HTTP/2,通过 TLS 的 NPN 扩展来完成 HTTP/1.1 到 HTTP/2 的响应(被抛弃,见Talking HTTP/2

在现在浏览器实现中,大部分的浏览器都声称只实现基于加密的 HTTP/2,同时,因为谷歌的带队放弃 NPN,现在被支持比较广泛的也就剩 h2-ALPN 了。

查看网站 HTTP/2 支持的工具

其实在 Chrome 的扩展商店中有个应用可以提醒你当前浏览的网站是否支持 HTTP/2,这个扩展的名字是:HTTP/2 and SPDY indicator。当你访问的网站支持 HTTP/2 时,它的显示是这样的:

如果你访问的网站是没有支持的,那么你看到的样子是这样的:

变透明了。OK,这就是关于 HTTP/2 的一些简单理解。

CATALOG
  1. 1. HTTP/2 是啥
  2. 2. SPDY
  3. 3. HTTP/2
  4. 4. 查看网站 HTTP/2 支持的工具