View on GitHub

Yinjie - GitHub.io

Welcome to the Yinjie's notes

HTTP/2 调查测试总结

HTTP/2 上线前期调研断断续续也有一段时间了,到此算是告一段落,所得到一些结论在这里给可能涉及到此项目的人分享一下。

HTTP/2 客户端兼容性问题

这这里先提供一个终端浏览器 H2 兼容性测试的小站点:
www.h2statistics.ml (笔者原创^_^)

HTTP/2 是由 SPDY 协议发展过来的,因各种历史遗留原因,H2 加上其前身 SPDY ,市面上能看到的版本由低到高大致有4个: spdy2 spdy3 spdy3.1 http/2,这个时候,你就要考虑客户端的兼容性问题了。

在上面提供的站点里,你会看到当前的终端(浏览器)能够支持的最高协议版本。

采样统计结果

以下是目前为止对所做采样调研的统计图
HTTP/2 终端兼容性统计图

兼容性说明

在这里要注意一下几个情况:

  • 再说一遍,你所看到的是高最协议版本,不可能向上兼容
  • 向下兼容情况:目前来看,支持 HTTP/2 的一定支持 SPDY3 与 SPDY3.1,但不一定支持 SPDY2 (如 Chrome、FF、IE)
  • 同浏览器,同版本在不同终端设备上有可能支持的情况也不一样
  • webview 请参考自身的浏览器,但不一定完全准确
  • 微信最新版本支持 SPDY3.1

总结

如上图所示,SPDY3.1 的支持率已经达到 50%,再加上 HTTP/2 支持浏览器也可以支持 SPDY3.X 的比率,总共对 SPDY3.1 的支持率应该可以达到 75% 左右。这对实际部署 H2 服务器的协议选择提供了一个有效的数据支持。

HTTP/2 服务端兼容性情况

http/2 的正式版本刚发出不到一年时间,虽然之前就已经有各大 server 都已开始支持,详情见 H2 支持 server 一览表。 但所支持的 H2 版本有所差别,支持的方式也略有不同。

在看了上面的浏览器兼容性情况后,你肯定会想到一个问题,浏览器支持的情况不尽相同,那服务端怎么处理,服务端能够自动降级吗?

以下以 nodejs 和 nginx 为例,大致说一下服务端的支持情况以及协议降级的方案。

测试的服务端

nginx

nginx 从 1.5.10 到最新的稳定版 1.8.5,都可以支持到 SPDY3.1,但不会支持正式的 H2 协议,所以想体验新协议的人只能去找开发版,而且是大于 1.9.5 的版本才行。

笔者是在 1.8.5 和 1.9.8 上进行了测试。
1.8.5 只支持 SPDY3.x,这个倒也算正常,但 1.9.8 也是只支持 HTTP/2,不会做 SPDY 的降级处理,会直接降为 HTTP1.1,这个就有点不太厚道了。

nodejs

nodejs 有专门的 HTTP/2 与 SPDY 模块,两者在降级的问题上解决的都非常优秀。以 SPDY@3.2.0 为例,会支持spdy2 spdy3 spdy3.1 http/2四个协议,通过 ALPN/NPN 与浏览器进行协商所用哪种协议进行传输。甚至可以设定所部署哪几种协议,非常人性化。

部署方案建议

在选择哪种协议的问题上,以目前已经全面部署 H2/SPDY 的一线站点为参照案例来看,国内外还是很有差别的。

国外的完美部署方案

国外因为没有太多的非主流浏览器,浏览器的碎片化程度不高,对于浏览器的支持情况还是很理想的:

2015-8 全国浏览器占有率

所以如 Google、facebook 等大站都选择最正式的 HTTP/2 协议做为最高协议,然后依次降级。

对于如何很好有降级,目前已经有较成熟的接入端的分发服务器的方案,可以在接入端进行 NPN 的协商,再分发给支持特定协议的服务器,这里提供一篇文章,大家有兴趣可以参考:
基于 HAProxy 的简单 SPDY 协议处理方案

国内的”重点照顾”方案

国内的浏览器情况。。。你懂的~~~ !-_-

所以以 百度淘宝 为例,都直接选择的是 SPDY3.1 协议进行部署,这样可以照顾到大多数的国内浏览器的支持情况,不支持的就自然降到 HTTP/1.1,这样在实施上简单不少,切中要点,也几乎没有损失,可以很平滑的过渡。笔者也建议如此。



总之,HTTP/2 是目前唯一的 HTTP 协议发展趋势,它给整个互联网带来的优化还是很明显(具体分析可看笔者之前的 HTTP/2 简介)。

再者 HTTPS 也越来越普及的环境下,为何不趋势把 HTTP/2 也搞定呢。