为什么您的网页大小应小于 14KB ?

我们都知道网站页面越小加载速度越快,但令人惊讶的是,14kB 页面的加载速度比 15kB 页面快得多,而 15kB 和 16kB 页面之间的差异微不足道。

这是因为 TCP 慢启动算法导致的。本文将介绍它是什么,它是如何工作的,以及为什么你应该关心它。首先我们将快速回顾一些基础知识。

什么是 TCP?

传输控制协议 (TCP) 是一种使用 Internet 协议 (IP) 可靠地发送数据包的方式 - 有时称为 TCP/IP。

当浏览器请求您的网站(或图片或css文件)时,它会使用 HTTP 发出请求。

HTTP 建立在 TCP 之上,一个 HTTP 请求通常由许多 TCP 数据包组成。

就其自身而言,IP 只是一个用于将数据包从 Internet 上的一个位置发送到另一个位置的系统。 IP 无法检查数据包是否已成功到达其目的地。

对于网站而言,知道所有数据都已到达很重要;否则,我们可能会导致网页中的某些部分丢失。在网络的其他用途中,这一点并不那么重要--比如流媒体直播视频。

TCP 是 IP 的延伸,它允许浏览器和您网站的服务器相互告知哪些数据包已成功到达。

服务器发送一些数据包,然后等待来自浏览器的响应,说它已收到数据包(这称为 acknowledgement 或 ACK),然后它会发送更多数据包;或者如果服务器没有收到 ACK,它会再次发送这些数据包。

什么是 TCP 慢启动?

维基百科解释:

慢启动(Slow Start),是传输控制协议(TCP)使用的一种阻塞控制机制。慢启动也叫做指数增长期。慢启动是指每次TCP接收窗口收到确认时都会增长。增加的大小就是已确认段的数目。这种情况一直保持到要么没有收到一些段,要么窗口大小到达预先定义的阈值。如果发生丢失事件,TCP就认为这是网络阻塞,就会采取措施减轻网络拥挤。一旦发生丢失事件或者到达阈值,TCP就会进入线性增长阶段。这时,每经过一个RTT窗口增长一个段。

TCP 慢启动是服务器用来确定一次可以发送多少个数据包的算法。

当浏览器第一次连接到您的服务器时,服务器无法知道它们之间的带宽量。

带宽是每单位时间可以通过网络传输的数据量。通常它以每秒位数 (b/s) 为单位。

您的服务器不知道连接可以处理多少数据,因此它首先向您发送少量且安全的数据,通常是 10 个 TCP 数据包。

如果这些数据包成功到达您网站的访问者,他们的计算机会发回一个确认 (ACK),说明数据包已收到。

然后,您的服务器会发回更多数据,但这一次它会使数据包数量增加一倍。

重复此过程,直到数据包丢失并且您的服务器没有收到 ACK。 (此时服务器会继续发送数据包,但速度较慢)。

这就是 TCP 慢启动的要点。在实际使用中,算法会有所不同,但这基本上就是它的工作方式

那么 14kB 是从哪里来的呢?

大多数 Web 服务器 TCP 慢启动算法从发送 10 个 TCP 数据包开始。

一个TCP 数据包的最大大小为 1500 字节。

这个最大值不是由 TCP 规范设置的,它来自以太网标准

每个 TCP 数据包在其 header 中使用 40 个字节,6 个字节用于 IP,另外 24 个字节用于 TCP

每个 TCP 数据包剩下 1460 个字节。 10 x 1460 = 14600 字节或大约 14kB!

因此,如果您可以将您的网站(或其中的关键部分)调整为 14kB 以内,您可以为访问者节省大量时间,即他们与你的网站服务器之间的一次往返所需的时间。

基于这个规则我们应该做什么呢?

当然,您应该使您的网站尽可能小——您爱您的访问者并且希望他们快乐。将每个页面都放在 14kB 以下是很好的目标。

这 14kB 包括压缩,所以它实际上可能更像是大约 50kB 的未压缩数据。

假设您已尽最大努力想将所有内容缩小到 14kB 一下,但做不到 - 14kB 规则仍然有用。

如果您确保您发送给访问者的前 14kB 数据可用于呈现有用的东西——例如一些关键的 CSS、JS 和解释如何使用您的应用程序的前几段文本。

注意 — 14kB 规则包括未压缩的 HTTP 标头(即使在第一个响应中使用 HTTP/2)—它还包括图像,因此仅加载首屏内容并保持非常小,或使用占位符以便访问者知道它们'正在等待好的东西。

14kB规则的一些注意事项

14kB 规则更像是一条经验法则,而不是计算机的基本法则:

一些服务器已将 TCP 慢启动初始窗口增加到 30 个数据包而不是 10 个

有时服务器知道它可以从更大数量的数据包开始,因为它使用 TLS 握手来建立可以使用的更大窗口。

服务器可以缓存一条连接可以发送的数据包数量,并在下次连接时发送更多数据包。

HTTP/2 和 14kB 规则

有一种观点认为,在使用HTTP/2时,14kB规则不再成立。我已经阅读了所有关于这方面的内容,但我没有看到任何证据表明使用HTTP/2的服务器已经停止使用从10个数据包开始的TCP慢启动。

HTTP/3 和 QUIC

与 HTTP/2 类似,有人认为 HTTP/3 和 QUIC 将取消 14kB 规则——这不是真的。 QUIC 推荐相同的 14kB 规则。