HTTP 的现状自万维网诞生以来,网页变得愈加复杂。 非常简单,仅包含文本:没有图像,没有 CSS,没有 JavaScript,只有普通的 HTML。快进到今天,平均每个网页就包含 100 多个下载资源,大小约为 2,500 KB。总传输大小自 以来增长了 250%,这种持续增长没有出现缓和迹象。
图 1. 总传输大小和总请求数 (2012-2017),来源:
工具和变通方案尽管互联网确实能快速提供高度复杂的内容,但出现这样的结果并不是因为 HTTP 1.1 协议(尽管采用了该协议)。在当前版本中,HTTP 无法满足如今的 Web 体验需求。因此,Web 开发人员针对这些性能问题提供了一系列变通方案。让我们来看一些比较流行的工具和它们修补的问题。
线头阻塞HTTP 1.0 仅允许通过一个 TCP 连接发出一个请求。这引发了所谓的 “线头阻塞” 问题,迫使浏览器等待缓慢的响应。HTTP 1.1 通过管道解决了这个问题,管道使浏览器能并行发出多个请求。但是,浏览器供应商很难实现管道,而且大多数浏览器(包括 Firefox)在发布时都会默认禁用该特性。Chrome 甚至完全删除了它。
多个 TCP 连接打开 TCP 连接需要很高的成本,而且我们对客户端应如何使用它们知之甚少。唯一的协议规定是,每个主机最多可以打开 2 个连接。由于只有 2 个 TCP 连接,开发人员为了能够展示一个现代页面需要竞争这两个名额 — 所以他们找到了一种方法来绕过这一限制。
通过使用一种称为域分片(domain sharding)的流行技术,开发人员能创建多个主机,每个主机提供一个网站所需资源的一部分。切分已变得非常普遍,网页加载期间打开的平均 TCP 连接数量也因此达到约 35 个(来源: )。
浏览器供应商不甘示弱,他们也违反了该协议,任意增加浏览器实现中允许的开放连接数量。这有助于并行化各个浏览器中的资源加载,但没有充分利用 TCP 套接字。下表显示了每个主机名允许打开的端口的最高数量,以及最流行的 3 个浏览器在这方面的不同。
表 1. 并行打开的 TCP 连接的最大数量(来源: )浏览器每个主机名的最大并行连接数Chrome24Firefox6Internet Explorer 1211
浏览器实现中的不一致意味着,用户冲浪体验的质量取决于他们选择的浏览器,而不是网站的设计和构思有多精巧。
资源内联和级联为了追求更高性能,Web 应用程序开发人员采用的聪明技巧并不只有域切分。
- 文件串联创建一个包含全部所需资源的大文件。为网站的所有 CSS 创建一个文件,为 JavaScript 创建一个文件,为包含网站图标的图像子画面表创建另一个文件。
- 资源内联将 CSS 和 JavaScript 直接嵌入在 HTML 中,这使得嵌入图像也成为可能。对图像进行 base64 编码,然后在加载网页时进行解码。
这些技术都不可取,尤其是从设计角度讲。在这两种情况下,页面的结构都与样式组合在一起,图像解码也会消耗很多时间。缓存也无法轻松实现。
但是,如果目标只是减少请求的文件数量,那么这些变通方案是成功的。随着文件请求减少,需要打开的 TCP 套接字也会减少。 |