文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

我这几天在 Twitter 上发布了这么一条信息,可是却让大家非常不高兴:

事实上互联网很多事情都让人心烦。“太不公平了”,这些人哭喊道。“你在比较苹果和橙子吗?”,他们狂嚎着!

是的,这不公平,互联网也不公平。但今天的网络就是如此,虽然你可能不喜欢,但这就是游戏规则。当进行性能测试时,我才不关心什么公不公平,我只关心一件事:

我想要更快!

Ricky Bobby - I Wanna Go Fast

让我们花一点时间来进入这个“如何”快的环节。这是我在推文中进行测试的 HTTP 结果:

这图片是我们这几天已经在网络上很熟悉了,看起来有点眩晕。下面是对 HTTPS 的测试结果:

第 1 段(可获 2 积分)

哇嗷~~  棒极了,HTTPS 很快,而 HTTP 弱爆了,就这么多!

好吧,让我们来讨论一下“不公平”的地方。HTTPS 测试更快是因为它使用了 HTTP/2 ,嘘~ 而 HTTP 测试用的是 HTTP/1.1。反对者非常不爽,因为他们认为应该比较相同协议版本下的安全以及不安全场景下的测试结果。现在我们使用老的协议来测试,但是 下面是使用更新协议做这个测试的问题:

HTTP/2 is only supported over HTTPS

嘿,看看,每个支持 HTTP/2 的浏览器都会标注一个 2 字,这意味着:

第 2 段(可获 2 积分)

只能通过 TLS 支持 HTTP2 (https)

换一句话说,如果你想要更快就必须使用安全协议,而不是清楚的发送内容并进行接收处理,因为浏览器不支持。而 HTTP/2 可以通过多路复用在一个 TCP 链接上异步的发起一堆二进制流的请求。下图表示在老版本协议上加载图片的区别:

而新版本协议是这样的:

看明白了吗?老的版本是一种传统的瀑布流的请求和响应模式,而新协议同时发起异步请求。这也就是为什么我们在前面的动画中看到的新版本协议中图片是大批量出现的原因。

第 3 段(可获 2 积分)

现在反对者估计会哀叹这个测试不切实际,因为你在一个页面里加载了 360 个小图片。但是这重要吗?就算是 36 张图片,使用多路复用的方式仍然要更快。或者今天大量的图片、CSS 和 JS 以及其他网页里加载的内容混杂在一起会更符合实际场景。它们都会受益于 HTTP/2 带来的更好的性能,其中一些表现可能比这里的测试结果更好;这 360 张小图片的体积加起来就 620K 大小而整个网页是 2.3 兆。如果你对这个结果持保守意见的话,还可以阅读 somewhere in the order of 100 requests too 这篇文章。

第 4 段(可获 2 积分)

当然 Web 服务器也必须支持 HTTP/2,不过 IIS 还不支持 (Windows Server 2016 版本的 IIS 10 将支持 HTTP/2) ,但你可以使用 CloudFlare 服务来封装一下(就好像我的这个博客), CloudFlare 可以通过新协议来输出其缓存的内容。CloudFlare 同时也提供了一些基于 HTTPS 的页面速度比较的测试:

CloudFlare HTTP/2 Test

这种简单的方法就算是源站不支持 HTTP/2 也没关系,你依然可以获得超快的 HTTP/2 速度。来看看它具体是如何工作的:我有一个网站运行在 cloudflareonazure.com ,我在之前的文章 Getting Started with CloudFlare Security Pluralsight course 中有介绍(别担心,这个网站内容混杂,这是我故意的,但这不是本文的重点)。这是一个 Azure 的网站只支持 HTTP/1.1。现在让我们进入 Chrome 开发者工具,在网络窗口的列头部位置点击鼠标右键打开协议列:

第 5 段(可获 2 积分)

Showing the protocol on requests in Chrome

同时我也打开了域名列,这样我们就可以更清楚的看到:

我们请求托管在 Azure 上不支持 HTTP/2 协议的的主机,将返回 h2 表明基于 HTTP/2 的 HTTPS。这是因为 CloudFlare 提供对 HTTP/2 的支持。所以如果 CloudFlare 需要从并不支持 HTTP/2 的源上拉取内容,那么对 CloudFlare 来说在连接上仍然是一个瓶颈,不过很多请求不是来自于源站。我这个博客的 2/3 的流量直接来自于 CloudFlare 的缓存,这就使得访问接近于 HTTP/2 ,与完全使用 HTTP/1.1 的网站有着明显的差别。

第 6 段(可获 2 积分)

最后,那些希望生活在网络是公平的幻觉下的人,以及非在 HTTP/1.1 协议下让 HTTP 和 HTTPS 针锋相对从而产生一个完全不同的结果的人应该去阅读一下 Is TLS Fast Yet 这篇文章。即使在老的协议版本上,“加密是缓慢的” 论调也已经过时了。实际上,该死的,如果你真的想要在 HTTP/1.1 下测试不同协议的话,来看看怎么回事吧:

第 7 段(可获 2 积分)

HTTP vs HTTPS with HTTP/1.1

我在打开 Fiddler 的情况下运行(不支持 HTTP/2,虽然可以通过请求头来设置支持),但仍然很快。多测试几次,结果会有所波动(但在连接质量上差异很小),但你找不到确凿的证据证明在 HTTP/1.1 上 HTTPS 有多慢。

这是一个简单的用来测试 “HTTP 和 HTTPS 下哪个更快”的方法,我不想要公平,我想要快!如果你想要快,就使用基于 HTTP/2 的 HTTPS 吧。

第 8 段(可获 2 积分)

文章评论

CY2
这对服务器的性能也提出了巨大挑战啊