HTTP持续连接限制

问题描述:

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持久连接(也称为HTTP保持活动)是使用相同的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"/> 

我的服务器的保活指令开启:正在发生的事情在这里方面的持久连接??优化规则/与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"/> 

感谢

+0

除此之外,它是一个问题,跟随RFC的客户端担心。这对于服务器端的人来说不是问题...... :) – 2011-06-12 08:45:35

+0

DNS别名的窍门并不是针对具有4个图像的简单页面,它更多地用于GIS应用程序(如gmap或openlayers),当大量图像应该并行上传。对于你的服务器KeepAlive设置,你应该只是担心有一个小的keepAlive超时(2或3s而不是15s),以防止你的Web服务器花费他所有的孩子无所事事。 – regilero 2011-06-12 08:57:52

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

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

正如你可以想象的,每个主机2个连接太少。你不能从主机加载一个页面,你有两个从同一主机正在进行的下载!

如果使用连接:keep-alive头部,则在连接的情况下,所有五个图像都将加载到相同的TCP连接上,而不是终止连接并重新制作连接:关闭。

这是效率低下的,因为每次请求图像时必须重新制作三路TCP握手

在HTTP 1.1,所有的连接都保持活力,除非有以下标题另有说明: 连接:关闭

在另一方面,你也有HTTP管线化(见麦克卡隆的答案),这不在发送另一个请求之前等待一个请求返回。这是由firefox实现的(正如你可以在about:config中看到/禁用),但这是与每个主机的最大连接数不同的问题。

另外: 如果你没有使用流水线的持久连接,你将会进行多个连接。在关闭之前发送一个请求。这会因为最大连接限制而阻塞。

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

我没有证据证明这一点,但我强烈怀疑大多数浏览器在他们下载了页面上的所有资源后将关闭所有连接。如果用户点击另一个页面,它将打开新的连接。

这两个连接限制是一个比任何东西更重要的约定。如果想要的话,没有什么能阻止浏览器从第50个开始。然而,在这个级别上,带宽使用率是限制因素,所以大多数浏览器(我怀疑)只限于少数几个连接。

再一次,没有具体的阻止他们,但是有很多连接有回报递减。

+0

同时性的问题是不同的。这是流水线。在同一个TCP握手中,它们仍然会继续运行,以保持活力。 – 2011-06-11 22:00:36

+0

我认为你在这里忽略了一个重要的事实:如果你不是同时下载东西,那么没有超过一个连接的持久性或其他方面的问题! – 2011-06-11 22:01:46

+0

如果您没有使用流水线的持久连接,您将进行多个连接。在关闭之前发送一个请求。这会因为最大连接限制而阻塞。 – 2011-06-11 22:05:51