Http持久连接限制

时间:2011-06-11 21:44:01

标签: http connection keep-alive

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.

[..]

我特别不确定“应该”......它有什么意义?为什么?

我知道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"/>

谢谢

2 个答案:

答案 0 :(得分:2)

客户端可以使用多个连接并行下载资源。例如,在您的示例中,它可能决定在两个连接上同时下载image1.gifimage2.gif。如果我们假设image1.gif首先完成,那么它将在该连接上排队image3.gif。等等。

我没有这方面的证据,但我强烈怀疑大多数浏览器会在下载页面上的所有资源后关闭所有连接。如果用户点击其他页面,则会打开新连接。

两个连接限制是一种约定。如果想要的话,没有什么能阻止浏览器打开50。但是,在这个级别,带宽使用是限制因素,因此大多数浏览器(我怀疑)将自己局限于少数几个连接。

同样,没有具体的阻止它们,但是有很多连接的回报减少。

答案 1 :(得分:1)

不要太认真地对待“应该”。 IE在某些时候用于仅允许2个同时连接。即使在那时,也可以选择删除限制(通过“黑客”)。

目前,在大多数浏览器(包括firefox,safari)中,限制为8。 IE8每个主机限制有6个连接。

可以想象,每台主机有2个连接太少。您无法从主机加载页面,您有来自同一主机的2个持续下载!

如果您正在使用连接:keep-alive标头,则所有五个图像都将加载到同一TCP连接上,而不是终止连接并重新创建它,以防连接:关闭。

这是低效的,因为每次请求图像时都必须重新构建三向TCP握手

在HTTP 1.1下,除非另有说明,否则所有连接都将保持活动状态: 连接:关闭

另一方面,您还有HTTP Pipelining(请参阅Mike Caron的回答),它不会在发送另一个请求之前等待一个请求返回。这是由firefox实现的(你可以在about:config中看到/禁用),但这与每个主机的最大连接数不同。

此外: 如果您没有使用流水线操作的持久连接,那么您将建立多个连接。在关闭前一个请求之前发送一个请求。由于最大连接限制,这将阻止。