为什么 HTTP/2 比普通 HTTPS 慢?

Why HTTP/2 is slower than plain HTTPS?

我正在评估我的网站从 HTTP2 获得的性能和奇怪的结果 - 欧洲的网站是从美国加载的:

我从 Chrome 的网络监视器中截取了屏幕截图,看起来 HTTP/2 大多数资源都是一个接一个地加载,而不是像普通 SSL 那样并行加载。

为了测试,我使用 Apache 2.4.17 (Win32) 涵盖的 Web 应用程序作为代理(应用对 SSL 和 HTTP/2 协议的支持)。客户端浏览器是 Chrome 46.0.2490.86 on Windows 7.

捕获到的网络请求如下。简短的摘要: 1. 第一个-是HTML页 2. 下一组 - 6 个请求 - 直接在 HTML 中声明的资源 3. 其余 - 通过脚本动态添加的资源(document/head 中的 'script' 和 'link/css' 标签)。

图片左边是HTTP/2, 右侧 - 同一员工通过纯 SSL(http2_module 已关闭)。


更新:我测试了"something else"什么支持HTTP/2作为反向代理。这是来自 http://nginx-win.ecsds.eu - fork of original nginx 'for windows'. HTTP/2 in original nginx is only available in commercial version, therefore I could not try it. And it looks like there are no other servers implementation of HTTP/2 + reverse proxy available for windows, or I just couldn't find them (list here and here).

的 nginx 1.9.7.1 Kitty

我在 Kitty 上得到的结果更具误导性 - 没有像 Apache 中那样的 'sequential load' 资源,但 HTTP/2 上的传输速率比普通 SSL 慢两倍。最终结果是 - HTTP/2 比普通 SSL 慢得多。下面是所有的并排。

综上所述,我只能假设性能在很大程度上取决于实现,而当前可用的实现表现得很奇怪,无法得出关于 HTTP/2 的任何一致结论。

所以,最后我的决定是 - HTTP/2 本身没有问题,当前可用的实现有问题。

  • Apache HTTPD 2.4.17 / Win32 - 有一些奇怪的'sequential load'效果
  • nginx Kitty - 提供异常缓慢的传输速率
  • 官方免费软件 nginx 没有内置 http2 模块

但是

两者都显示了预期的性能。这是在 'the question' 中执行的相同测试的屏幕截图,但 Apache 反向代理托管在此处另一个人的 linux 计算机上。

看看这个,它是从 Taobao.org 开发的 nginx 的修改版本,并被全球速卖通和许多其他繁忙的网站使用。它开箱即用地支持 HTTP2,以及一些仅在商业 nginx 中可用的其他功能,如上游控制。

http://tengine.taobao.org/

我们是 运行 最新的 nginx http/2

nginx version: nginx/1.9.10
built with OpenSSL 1.0.2e 3 Dec 2015
TLS SNI support enabled

我们也有同样的观察。我们正在记录 $request_time 和 $upstream_time。尽管 upstream_time 与协议无关,但总体 request_time 不同:

# grep ' 443 ' access.log|grep 'HTTP/1.1'| cut -d ' ' -f 3,4 | awk '{r+=; u+=} END {print r/NR; print u/NR}'
0.0116887   # HTTP/1.1 request_time in seconds
0.00673473  # HTTP/1.1 upstream_time in seconds

# grep ' 443 ' access.log|grep 'HTTP/2.0'| cut -d ' ' -f 3,4 | awk '{r+=; u+=} END {print r/NR; print u/NR}'
0.0363673   # HTTP/2.0 request_time in seconds
0.00695812  # HTTP/2.0 upstream_time in seconds

因此 http/1.1 的整体请求时间缩短了三倍!由于流的原因,可能有些东西不适用于 request_time 日志记录和 http/2。我真的不知道,但承诺是 http/2 比 http/1.1 快,如果两者都是 运行 在 TLS 上。

但我会进一步调查此事。

HTTP2 更高效,意味着从多连接变为单连接。它也更具响应性,因此优先级更高的请求流将首先响应。

通常情况下,单个连接可用的带宽量是有限制的,因此早期的 HTTP 协议虽然通过建立更多连接、使用大部分网络堆栈来发挥不公平,但如果多个连接可以说已经建立,那么 HTTP1.1 将在获取多个资源方面战胜 HTTP/2。

这一切都深入到每个 tcp 连接的带宽。此外,单一 TCP 连接普遍存在标题阻塞问题,该问题已在 HTTP3 中得到解决,因此目前这是 HTTP2 的另一个缺点

同时请注意,HTTP2 不限制您建立多个连接,目前也没有限制浏览器只能与服务器建立一个 TCP 连接,因此 HTTP2 可以通过超越它的限制来优化原始定义。