我创建了一个非常简单的网页:
<html>
<body>
foo bar
<img src="img1.png"/>
<img src="img2.png"/>
<img src="img3.png"/>
Hello world
</body>
</html>
每个图像都是一个 900 字节大小的简单彩色正方形(每个图像可装入一个 TCP 数据包)。
然后我使用 wireshark 记录 TCP 数据包,我预计只有一个连接/流,但实际上有 3 个。第一个请求 HTML 文件,获得响应,然后请求 img1.png,并获得其响应。其他 2 个连接分别获得 img2 和 img3。其他 2 个连接是在第一个连接完成之前建立的。
我认为 HTTP 1.1 不需要多个 TCP 连接?为什么浏览器不直接使用第一个连接呢?这样肯定更省钱?
我在 Safari、Chrome 和 Firefox 上尝试过,结果都相同。
答案1
现代浏览器使用多线程,因此使用多个线程从页面获取和处理各种元素/资源。
这样做是为了可以并行下载和处理资源,从而(可能/大概)使整体速度更快。
因此,不要:
Download -> Process -> Display -> Download -> Process -> Display -> Download -> Process -> Display
获取并显示三幅图像,是Download -> Process -> Display
同时发生三件事。
这样,就可以处理和显示一种资源,而不必等待其他资源先完成。
想象一下,有 2 个小图像和 1 个大图像。两个小图像将立即显示,而无需等待大图像完成,因此可以更快地传递内容。