在啥情况下,我的浏览器会尝试为多个请求重用 TCP 连接?

Posted

技术标签:

【中文标题】在啥情况下,我的浏览器会尝试为多个请求重用 TCP 连接?【英文标题】:Under what circumstances will my browser attempt to re-use a TCP connection for multiple requests?在什么情况下,我的浏览器会尝试为多个请求重用 TCP 连接? 【发布时间】:2011-11-10 17:45:37 【问题描述】:

我使用的是 Firefox,但我想知道浏览器通常如何决定这一点。

似乎当我在短时间内访问同一个 URL 两次时,我的浏览器会尝试为这两个请求重新使用 TCP 相同的连接(这称为保持活动状态)。但是,当我访问两个不同的 URL(但仍由同一服务器提供服务)时,浏览器有时会决定为每个请求打开一个新连接。显然,浏览器不使用每个 URL 一个连接的策略。

我问这个是因为我正在尝试实现一个使用长轮询的 Web 服务。我可以想象用户可能希望在同一浏览器的多个选项卡中打开此服务。但是,使用 keep-alive,直到第一个完成(至少在 Firefox 中)才发送第二个长轮询请求,因为浏览器试图将它们都推到同一个套接字中,这是我没想到的设计了服务。即使浏览器实现了流水线,我也无法在响应第一个请求之前响应第二个请求,因为 HTTP 要求我按顺序完成响应。

【问题讨论】:

【参考方案1】:

使用 HTTP/1.1 时,默认情况下,TCP 连接保持打开状态以供重复使用。这是为了获得比每个请求启动新连接更好的性能。连接可以重复使用任何一方都可以随时关闭连接。

您应该阅读HTTP1.1 和关于持久连接的部分。

在您的情况下,它甚至没有使用 HTTP 管道(未得到广泛支持),因为下一个请求是在第一个响应之后 发送的。

浏览器有一个连接池,每个主机名都可以重用它。一般来说,浏览器不应为多个主机名重用单个连接,即使这些主机名实际上解析为相同的 IP 地址。

大多数浏览器允许用户配置或覆盖每台服务器的持久连接数;大多数现代浏览器默认为六个。如果 Firefox 真正 阻塞了第二个请求,因为已经有一个连接处于活动状态,这是 Firefox 中的一个错误,应该在他们的错误跟踪系统中归档。但如果存在这样的错误,我想你会看到很多网站都崩溃了。

【讨论】:

虽然我告诉Firefox第二次向服务器发送请求,但我相信它实际上并没有发出请求,因为它想等待第一个请求完成,以便它可以重新- 使用连接。这是一个功能,而不是错误,对吗? 也许对于相同的 URL,它会尝试使用相同的连接,但对于 URL,它会尝试在池中选择另一个连接? 如果您的测试是向同一个 URL 发送 2 个 concurrent HTTP 请求,您可以看到它们“序列化”或通过 2 个不同的 TCP 连接发送。但是您没有看到它们流水线化。将会发生什么,现在是实现依赖。例如浏览器可能会选择重用池中的连接,或通过新连接发送第二个请求。这两种方法都是正确的,因为 HTTP 是stateless 协议。如果您的实现依赖于这些细节,那么恕我直言你的设计有缺陷。也许你应该写更多关于你想要实现的目标。 还要由服务器来决定是否返回一个 Connection: close(这会强制客户端在后续请求中打开一个新连接)它也会关闭 TCP 连接,强制一个新连接,如果keepalive有时间限制,或者是否达到进程请求数的限制。 @user384706:我已经解决了这个问题。我向同一个 URL 发送了两个请求,因此 Firefox 选择在第一个请求得到响应之前不发送第二个请求。直观地说,这是一个“特性”,因为如果服务器不响应第一个请求,则没有太多理由相信它会响应第二个请求,除非服务器以非传统方式编程 - 这是我的情况。谢谢。

以上是关于在啥情况下,我的浏览器会尝试为多个请求重用 TCP 连接?的主要内容,如果未能解决你的问题,请参考以下文章

OkHttp 会自动重用 HTTP1/1 连接吗?

AppDomain.DoCallback()在啥情况下会失败?

TCP 连接与 HTTP 请求的相关问题

一个TCP 连接可以发送多少个HTTP请求?

在啥情况下会触发jquery ajax中的error?

在啥情况下我们必须使用 localstorage 而不是 cookie? [复制]