http - 为什么 HTTP/1.1 建议保守地打开连接?

标签 http tcp connection

对于 HTTP/1.0,过去每个域的建议限制为 2 个连接。最近的 HTTP RFC 放宽了这个限制,但仍然警告在打开多个连接时要保守:

According to RFC 7230, section 6.4, "a client ought to limit the number of simultaneous open connections that it maintains to a given server".

更具体地说,除了 HTTP/2,如今,浏览器在使用 HTTP/1.1 时将每个域限制为 6-8 个连接。根据我的阅读,这些准则旨在缩短 HTTP 响应时间并避免拥塞。

有人可以帮助我了解如果按域打开许多连接,拥塞和响应时间会发生什么情况吗?这听起来不像是 HTTP 服务器问题,因为它们可以处理的连接量似乎是一个实现细节。上面的解释好像是关于TCP性能的?对于 HTTP 客户端为何限制每个域的连接数,我找不到更准确的解释。

最佳答案

这样做的主要原因是服务器端的资源。

假设您有一台运行 Apache 的服务器,默认有 256 个工作线程。想象一下,该服务器正在托管一个包含 20 个图像的索引页面。现在假设有 20 个客户端同时连接并下载索引页面;这些客户端中的每一个在获取页面后关闭这些连接。

由于他们每个人现在都将建立连接来下载图像,您可能会看到连接呈指数增长(或者我想是乘法增长)。考虑一下如果每个客户端都配置为同时建立最多 10 个并行连接以优化带有图像的页面显示,会发生什么情况。这使我们很快达到 400 个同时连接。这几乎是 Apache 可用工作进程数量的两倍(同样,默认情况下,使用预 fork )。

对于服务器,必须平衡资源才能满足最可能的负载,但客户端通过限制连接来极大地帮助解决这个问题。如果每个客户端都能自由地与服务器并行建立 100 多个连接,我们将很快对大量主机进行 DoS 攻击。 :)

关于http - 为什么 HTTP/1.1 建议保守地打开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53597611/

相关文章:

.net - 使用 HttpListener 时如何确保 http 请求是本地的

javascript - Javascript 中 XML HTTP 请求的问题

grails - Groovy SQL 数据源连接处理,withTransaction

php - 将脚本从 mysql 转换为 mysqli 或 PDO

android - 问题 : Android's isConnected() used to get current state of WiFi often returns false even when the device is connected

swift - (Swift) 如何检查内容编码是否为 gzip

java - 在他们登录我的网站/应用程序后,我如何请求 Facebook 权限?

ruby-on-rails - 在 RoR 中,如何从 "Failed to open TCP connection ... (general SOCKS server failure)"错误中恢复?

Python。从 6 字节字符串中打印 mac 地址

javascript - 与Node.js的长连接,如何减少内存使用,防止内存泄漏?还与 V8 和 webkit-devtools 相关