虽然我们生活在一个宽带无处不在、4/5G 险些全覆盖的时期,但网站加载缓慢还是常态,就算我们打开一个以文本为中央的新闻网站,都可能须要至少 30 秒才能开始阅读。
毕竟在内容膨胀时期,一张照片就能轻易超过 1MB 大小,许多网站为了显示几段文本,还会单独加载至少 10MB 的 JS 和自定义字体。

对此,对优化和极简主义充满激情亲切的资深 Web 开拓 Nathaniel 见告我们,你该当让你的网页尽力掌握在 14KB 以内,而且纵然对付以富媒体为中央的网站,这条 14KB 的规则可能仍旧值得遵照。
如果 14KB 不敷以用于终极布局,则须要优先考虑“首屏”字节,可以用发送给访问者的前 14KB 数据来渲染一些有用的东西,减少用户还没有开始阅读就流失落掉的机会。

网页越小,加载速率就越快——这一点都不奇怪。

html网页大小资深 Web 开辟的经验之谈为什么你开辟的网页不该该年夜于 14KB React

但令人感到惊异的是,14KB 网页的加载速率比 15KB 要快得多——可能快 612 毫秒——而 15KB 和 16KB 网页之间的加载速率差异微乎其微。

这是 TCP 慢启动算法导致的。
本文将先容这个算法、它的事理以及为什么你该当关注它。
但首先我们须要快速过一遍一些根本知识。

TCP 是什么

传输掌握协议(Transmission Control Protocol,TCP)是一种利用 IP 协议可靠地发送数据包的方法——有时被称为 TCP/IP。

当浏览器向你的网站(或图像或样式表)发出要求时,它会利用 HTTP 要求。
HTTP 建立在 TCP 之上,一个 HTTP 要求常日由许多 TCP 数据包组成。
IP 只是一个将数据包从互联网上的一个位置发送到另一个位置的系统。
IP 没有检讨数据包是否成功到达目的地的方法。

对付网站来说,确保所有的数据到达要求端是非常关键的,否则我们可能会由于丢失数据包无法得到完全的网页。
但在网络的其他运用处景中,这一点并不那么主要——比如流媒体直播视频。

TCP 是 IP 的扩展,浏览器和网站做事器通过它见告对方哪些数据包已经成功到达。

做事器发送一些数据包,然后等待浏览器已经收到数据包的相应(这叫确认或 ACK),然后它连续发送更多的数据包——或者如果它没有收到 ACK,将再次发送相同的数据包。

什么是 TCP 慢启动

TCP 慢启动是一种算法,做事器用它来确定一次可以发送多少数据包。

当浏览器第一次连接到做事器时,做事器无法知道它们之间的带宽是多少。
带宽是指在单位韶光内网络可以传输的数据量。
常日以比特/秒(b/s)为单位。
我们可以用管道来作类比——把带宽想象成每秒从管道流出多少水。

做事器不知道网络连接可以处理多少数据——以是它先发送少量且安全的数据——常日是 10 个 TCP 数据包。
如果这些数据包成功地到达网站访问者,他们的打算机返回确认(ACK),表示数据包已经被收到了。
然后,做事器发送更多的数据包,但这一次它将数据包的数量增加了一倍。

这个过程会不断重复,直到数据包丢失,做事器没有收到 ACK。
(此时,做事器会连续发送数据包,但速率较慢)。

这便是 TCP 慢启动的要点——在现实当中,虽然算法各不相同,但这是它的基本事理。

那么 14KB 这个数字是怎么来的

大多数 Web 做事器的 TCP 慢启动算法都是从发送 10 个 TCP 数据包开始的。

TCP 数据包最大长度为 1500 字节。
这个最大值不是由 TCP 规范设置的,它来自于以太网标准。

每个 TCP 数据包的标头占了 40 个字节,个中 16 个字节用于 IP,其余 24 个字节用于 TCP。

这样每个 TCP 数据包还剩下 1460 个字节。
10 x 1460 = 14600 字节,或大约 14KB!

因此,如果你能把网站的网页——或网页的关键部分——压缩到 14KB,就可以为访问者节省大量的韶光——他们和网站做事器之间的来回韶光。

一个数据来回能有多糟糕?但人们非常没有耐心——一个数据来回可能会出奇地长,详细多长取决于延迟……延迟是指数据包从源传输到目的地所花费的韶光。
如果带宽是每秒钟可以通过管道的水的数量,那么延迟便是一滴水进入管道后从另一端流出所花费的韶光。

下面是一个关于延迟有多糟糕的例子。

卫星网络

卫星网络是由环抱地球轨道的卫星供应的,在人烟稀少的地区、石油钻井平台、游轮以及飞机上,人们可以利用这种网络。

为相识释这种糟糕的延迟,我们想象一群在石油钻井平台事情的兄弟把骰子忘在了家里,他们须要通过 missingdice.com(少于 14KB)来玩《龙与地下城》游戏。

首先,他们中的一个用手机发出一个网页要求……

手机将要求发送到钻井平台的 WiFi 路由器,路由器将数据发送给平台上的卫星天线,我们假设这可能须要 1 毫秒韶光。

然后,卫星天线将数据发送到地球轨道上方的卫星。

常日,这是通过在地球表面上方 35786 公里处运行的轨道卫星实现的。
光速为 299792458 米/秒,以是信息从地球发送到卫星须要 120 毫秒。
然后,卫星将信息传回地面吸收站,这又须要 120 毫秒。

然后,地面站必须将要求发送到位于地球任意位置的做事器(当光通过光纤电缆传输时,速率会降至每秒 200000000 米)。
如果地面站和做事器之间的间隔即是纽约到伦敦之间的间隔,那么大约须要 28 毫秒,如果地面站和做事器之间的间隔即是纽约到悉尼之间的间隔,则须要 80 毫秒——以是我们姑且定一个 60 毫秒的数字(这个数字便于打算)。

然后,做事器须要处理要求,这可能须要 10 毫秒,然后做事器再次将它发送出去。

回到地面站,进入太空,回到卫星天线,然后回到无线路由器,再得手机上。

手机 -> WiFi 路由器 ->卫星天线 ->卫星 -> 地面站 -> 做事器 -> 地面站 -> 卫星 -> 卫星天线 -> WiFi 路由器 -> 手机

如果我们算一下,便是 10 + ( 1 + 120 + 120 + 60 ) x 2 = 612 毫秒。

这是每次来回额外的 612 毫秒——大概这看起来不是很永劫光,但你的网站可能只是为了获取第一个资源就须要许多个来回。

其余,HTTPS 在完成第一个来回之前须要额外的两次来回——这使延迟达到了 1836 毫秒!

对付生活在陆地上的人,延迟又是若何的

卫星网络彷佛是一个极度的例子——我选择它作为例子是由于它能够充分解释了网络延迟这个问题——但对付生活在陆地上的人来说,延迟可能比这更糟糕,缘故原由有很多。

2G 网络的延迟常日在 300 毫秒到 1000 毫秒之间;3G 网络的延迟可以在 100 毫秒到 500 毫秒之间;喧华的移动网络——比如在一个非常拥挤的地方,比如音乐节;处理大流量的做事器;其他一些不好的东西。

不稳定的网络连接也会导致数据包丢失——导致须要另一个往返来获取丢失的数据包。

理解了 14KB 法则,接下来可以做些什么

当然,你该当让你的网页尽可能的小——你爱你的访客,你希望他们愉快。
将每个页面的大小掌握在 14KB 以内是一个不错的主张。

这 14KB 可以是压缩数据——以是实际上可以对应大约 50KB 的未压缩数据——这已经非常年夜方了。
要知道,阿波罗 11 的制导打算机只有 72KB 内存。

去掉自动播放的视频、弹出窗口、Cookie、Cookie 横幅、社交网络按钮、跟踪脚本、JavaScript 和 CSS 框架,以及所有其他人们不喜好的垃圾——你可能就能实现 14KB 法则。

假设你已经尽力将所有内容掌握在 14KB 以内,但仍旧做不到——但 14KB 法则仍旧很有用。

你可以用发送给访问者的前 14KB 数据来渲染一些有用的东西——例如一些关键的 CSS、JS 和解释如何利用你的运用程序的前几段文本。

须要把稳的是,14KB 法则包含了 HTTP 标头——这些是未压缩的(纵然是 HTTP/2 的第一个相应),也包含图片,以是你该当只加载在页面上方的内容,并保持它们最小,或者利用占位符,让访问者知道他们在等待一些更好的内容。

关于这个法则的一些把稳事变

14KB 法则更像是一种履历之谈,而不是打算的基本法则。

一些做事器已经将 TCP 慢启动初始窗口从 10 个数据包增加到 30 个;有时做事器知道它可以从更大数量的数据包开始传输,由于它利用 TLS 握手来建立一个更大的窗口;做事器可以缓存路由可管理的数据包数量,并不才一次连接时发送更多的数据包;还有其他须要把稳的地方——这里有一篇文章更深入地磋商关于为什么 14KB 法则并不总是这么回事(https://www.tunetheweb.com/blog/critical-resources-and-the-first-14kb/)。

HTTP/2 和 14KB 法则

有一种不雅观点认为,在利用 HTTP/2 时,14KB 法则不再适用。
我已经读了所有我能读到的关于这个问题的东西,但我还没有看到任何证据表明利用 HTTP/2 的做事器已经停滞利用 TCP 慢启动(从 10 个数据包开始)。

HTTP/3 和 QUIC

与 HTTP/2 类似,有一种不雅观点认为 HTTP/3 和 QUIC 将废除 14KB 法则——事实并非如此。
实际上,QUIC 仍旧建议利用 14KB 法则。

原文链接:

https://endtimes.dev/why-your-website-should-be-under-14kb-in-size/