【问题标题】:Http persistent connections limitHttp持久连接限制
【发布时间】:2011-09-13 04:57:29
【问题描述】:
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"/>

谢谢

【问题讨论】:

  • 除此之外,这是一个问题,遵循RFC的客户需要担心。对于服务器端的人来说这不是问题...... :)
  • DNS 别名的诀窍不是针对具有 4 个图像的简单页面,它更多地用于 GIS 应用程序(如 gmap 或 openlayers),当需要并行上传大量图像时。对于您的服务器 KeepAlive 设置,您应该只担心会有一个小的 keepAlive 超时(2 或 3 秒而不是 15 秒),以防止您的网络服务器将所有孩子的时间都花在无所事事上。

标签: http connection keep-alive


【解决方案1】:

不要把“应该”看得太认真。 IE 在某些时候曾经只允许 2 个同时连接。即使在那个时候,也可以选择取消限制(通过“黑客”)。

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

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

如果您使用的是 connection:keep-alive 标头,则所有五个图像都将加载到同一个 TCP 连接上,而不是在 connection:close 的情况下终止连接并重新建立连接。

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

在 HTTP 1.1 下,所有连接都保持活动状态,除非使用以下标头另有说明: 连接:关闭

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

还有: 如果您不使用流水线的持久连接,您将建立多个连接。在关闭前一个请求之前发送一个请求。由于最大连接数限制,这会阻塞。

【讨论】:

    【解决方案2】:

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

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

    两个连接的限制比什么都重要。如果愿意,没有什么可以阻止浏览器打开 50。但是,在这个级别上,带宽使用是限制因素,因此大多数浏览器(我怀疑)将自己限制为少数几个连接。

    同样,没有什么能阻止它们,但是拥有许多连接会导致收益递减。

    【讨论】:

    • 同时性问题不同。那就是流水线。他们仍然会继续,在同一个 TCP 握手上,以防它保持活动状态。
    • 我认为您在这里忽略了一个重要事实:如果您不同时下载内容,那么拥有多个连接(无论是持久连接还是其他连接)都是没有意义的!
    • 如果您不使用流水线的持久连接,您将建立多个连接。在关闭前一个请求之前发送一个请求。由于最大连接数限制,这会阻塞。
    • ???虽然这是真的,但它也与问题无关。打开一个连接,使用它,然后在打开另一个连接之前不关闭它不是“为了提高 HTTP 性能”。如果您打开一个连接并将其重用于所有内容,那么您无需担心限制。因此,我正在解决 OP 最可能关心的问题,即实际使用多个连接的场景
    • @anirudh4444,别傻了。我说的是使用一次连接,然后再也不使用它(而不是关闭它)。如果您不打算使用管道,请不要打开多个连接。相反,如果您确实打开了多个连接,则使用它们!
    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多