HTTP持久连接限制

4
Clients that use persistent connections SHOULD limit the number of simultaneous
connections that they maintain to a given server. A single-user client SHOULD 
NOT maintain more than 2 connections with any server or proxy.

[..]

我对“SHOULD”一词特别不确定……它的意义是什么?为什么?

我知道HTTP持久连接(也称为HTTP keep-alive)是使用相同的TCP连接发送和接收多个HTTP请求/响应的想法,而不是为每个单独的请求/响应对打开一个新的连接。我知道使用持久连接对于提高HTTP性能非常重要。

  • 2个连接限制每个服务器是否预定义?
  • 何时请求将使用现有连接或获取新连接?

假设我有一个包含以下图像引用的HTML页面:

<img src="http://example.com/image1.gif"/>
<img src="http://example.com/image2.gif"/>
<img src="http://example.com/image3.gif"/>
<img src="http://example.com/image4.gif"/>

我的服务器启用了keep-alive指令:在持久连接方面会发生什么?与2个同时连接每个服务器限制相关的优化规则/技巧是否有效?
<img src="http://example.com/image1.gif"/>
<img src="http://example.com/image2.gif"/>
<img src="http://example2.com/image3.gif"/>
<img src="http://example2.com/image4.gif"/>

thanks


除此之外,这是一个问题,遵循RFC的客户端需要担心。对于服务器端的人来说,这不是一个问题... :) - Anirudh Ramanathan
DNS别名的技巧不适用于只有4张图片的简单页面,它更多地用于GIS应用程序(如gmap或openlayers),当需要同时上传大量图片时。对于您的服务器KeepAlive设置,您只需要担心保持较短的KeepAlive超时时间(2或3秒而不是15秒),以防止您的Web服务器花费所有子进程的时间无所事事。 - regilero
2个回答

2
一个客户端可以使用多个连接并行下载资源。例如,在您的示例中,它可能决定同时在两个连接上下载image1.gifimage2.gif。如果我们假设image1.gif先完成,它将在该连接上排队image3.gif,依此类推。
我没有证据证明这一点,但我强烈怀疑大多数浏览器会在下载页面上的所有资源后关闭所有连接。如果用户点击到另一个页面,它将打开新的连接。
两个连接限制更多是一种约定。没有什么阻止浏览器打开50个连接。然而,在这个水平上,带宽使用是限制因素,所以大多数浏览器(我想)都限制自己只使用几个连接。
同样,没有具体阻止它们,但有许多连接的回报逐渐减少。

同时性的问题是不同的。那就是流水线处理。如果保持连接活动,它们仍将在同一个TCP握手上继续进行。 - Anirudh Ramanathan
我认为你忽略了一个重要的事实:如果你不同时下载东西,那么拥有多个连接(持久或非持久)是没有意义的! - Mike Caron
如果您不使用带管线的持久连接,那么将会创建多个连接。在关闭前一个请求之前发送下一个请求。这将因为最大连接限制而被阻塞。 - Anirudh Ramanathan
虽然这是正确的,但这与问题无关。在打开另一个连接之前不关闭连接就打开连接并使用它并不是“用于提高HTTP性能”的方法。如果您打开一个连接并重复使用它进行所有操作,则无需担心限制。因此,我正在解决OP最可能关注的情况,即实际正在使用的多个连接的情况。 - Mike Caron
你说:打开一个连接,使用它,然后在打开另一个连接之前不关闭它并不是“为了提高HTTP性能”。流水线是提高性能的一种方式。所以...我不同意! - Anirudh Ramanathan
1
@anirudh4444,不要太迟钝。我说的是使用一次连接,然后再也不使用它(而不是关闭它)。如果您不打算进行流水线处理,请勿打开多个连接。相反,如果您确实打开了多个连接,请使用它们! - Mike Caron

1
不要太认真地看待“应该”这个词。IE曾经只允许同时连接2个连接。即使在那时,也有通过“黑客”方式移除限制的选项。
现在,在大多数浏览器(包括Firefox、Safari)中,限制为8。IE8每个主机的连接限制为6。
可以想象,每个主机只有2个连接是太少了。如果您从同一主机下载2个文件,您将无法从该主机加载页面!
如果您使用连接:keep-alive头,则所有5个图像都将在同一个TCP连接上加载,而不是在连接:close的情况下终止连接并重新建立连接。
由于每次请求图像都必须重新进行三次TCP握手,因此效率低下!
在HTTP 1.1下,所有连接都保持活动状态,除非使用以下标头另行说明: Connection:close 另一方面,您还可以使用HTTP管线化(参见Mike Caron的回答),它在发送另一个请求之前不等待一个请求返回。这是由Firefox实现的(可以在about:config中看到/禁用),但这与每个主机的最大连接数是不同的问题。
此外: 如果您没有使用持久连接和管道技术,则将建立多个连接。在关闭上一个连接之前发送一个请求。这将因为最大连接数限制而阻塞。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接