通过浏览器获取并发请求数
Posted
技术标签:
【中文标题】通过浏览器获取并发请求数【英文标题】:Get number of concurrent requests by browser 【发布时间】:2011-11-19 08:34:25 【问题描述】:我正在尝试确定是否值得将图像请求分散到多个子域中。 [这篇文章](链接断开)例如说:
大多数浏览器一次只能发出两个请求,因此浏览器将请求两个文件,下载它们,然后继续下两个。页面需要正确显示的 HTTP 请求或单独组件越多,用户等待的时间就越长。
当他们说大多数时,具体是哪些浏览器?这个数字是否与并发 XMLHttpRequest 的数量有关,每个 this question?
【问题讨论】:
并发请求的限制在浏览器上是可配置的(例如在 Firefox 中是 4 并且设置称为 network.http.pipelining.maxrequests),因此我认为跨域传播图像请求是值得的。我不确定 ajax 请求是否有区别,但我不明白为什么会有所不同。 【参考方案1】:这里有很多事情需要考虑。在大多数情况下,我只会选择一个无 cookie 域/子域来托管您的图像,例如 static.mywebsite.com。理想情况下,静态文件应该由 CDN 托管,但这是另一回事。
首先,IE7 只允许每个主机有两个并发连接。但是今天的大多数浏览器允许的远不止这些。 IE8允许6个并发连接,Chrome允许6个,Firefox允许8个。
因此,例如,如果您的网页只有 6 张图片,那么将您的图片分散到多个子域就毫无意义。
假设您在一个页面上有 24 张图片。好吧,生活中很少有东西是免费的,有这样的事情,比如并行化的死亡。如果您将图像托管在 4 个不同的子域中,那么这意味着理论上每个图像都可以并行下载。但是,这也意味着涉及 3 个额外的 DNS 查找。 DNS 查找可能需要 100 毫秒、150 毫秒,有时甚至更长。这种增加的延迟很容易抵消并行下载的任何好处。您可以通过使用http://www.webpagetest.org/ 测试网站来查看实际示例
当然,最好的解决方案是尽可能使用 CSS sprite 来减少请求的数量。我在this article 和this one 中讨论了这个以及每个请求的固有开销。
更新
Steve Souders 有一篇关于分片域主题的有趣文章...
美国十大网站中的大多数都进行域分片。 YouTube 使用 i1.ytimg.com、i2.ytimg.com、i3.ytimg.com 和 i4.ytimg.com。居住 搜索使用 ts1.images.live.com、ts2.images.live.com、 ts3.images.live.com 和 ts4.images.live.com。这两个网站都是 跨四个域分片。最佳数字是多少? 雅虎! 发布了一项研究,建议至少跨两个分片,但没有 四个以上,域。以上四个,性能实际上会下降。
http://www.stevesouders.com/blog/2009/05/12/sharding-dominant-domains/
但请注意,这是 2009 年写的。2011 年,他发表了评论……
由于较新的浏览器会为每个域打开更多连接,因此可能 最好将数字向下修正。我认为2是一个很好的妥协, 但这只是一种预感。如果一些生产属性运行,那就太好了 确定最佳数量的测试。
您还应该记住,雅虎和亚马逊等大型网站甚至需要进行域分片的主要原因是他们的网站是如此动态。图像附加到动态显示的产品或故事上。因此,对他们来说,尽可能积极地使用 CSS 精灵是不可行的。
然而,像 *** 这样的网站对这类图像很轻,而且它们已经减少了请求的数量,以至于它们不需要进行分片。实现这一目标的一大步是他们使用这个 sprites.png 图像......
http://cdn.sstatic.net/Sites/***/img/sprites.png?v=5
更新 #2
Steve Souders 发布了another update on domain sharding。他重复了我已经提到的大部分内容。但最突出的是 SPDY 以及它将如何影响您的决定。
也许反对域分片的最有力论据是 在 SPDY(以及 HTTP 2.0)的世界中是不必要的。实际上, 域分片可能会损害 SPDY 下的性能。 SPDY 支持 并发请求(提前发送所有请求标头)以及 请求优先级。跨多个域的分片减少 这些好处。 Chrome、Firefox、Opera 和 IE 支持 SPDY 11. 如果您的流量主要由这些浏览器主导,您可能希望跳过域分片。
更新 #3(2018 年 2 月)
正如 Dean 在下面的 cmets 中提到的那样,由于现代浏览器支持 HTTP/2,CSS sprite 现在并没有真正让你买账。但是您必须获得 SSL 证书,设置您的站点以使用 HTTPS,并确保您的 Web 服务器配置为使用 HTTP/2。要么,要么使用已经为您设置了所有这些的 CDN。一旦你完成了所有这些,你就可以跳过 CSS sprites 和域分片。
【讨论】:
跨多个域访问资产时,域是动态确定的(实际上资产都存储在同一位置)? @Jonny - 不,浏览器不会意识到这一点。该域可以是服务器上与另一个域相同的物理文件的别名,甚至可以使用相同的 IP 地址。这很好,并且允许浏览器从两个不同的域并行下载文件。 这里的精灵链接应该是:cdn.sstatic.net/img/favicons-sprite16.png?v=1635743de786 现在吗? 要添加到更新 #2:SPDY 已被弃用,取而代之的是 HTTP/2(尽管它引领了新版本的发展方向)。在迁移到 CDN 之前,请测试您的网站/服务器是否支持 HTTP/2。你可以在这里测试一下是否支持:tools.keycdn.com/http2-test 在 2017 年发表评论,因为 SPDY 和 HTTP/2 之类的东西,精灵现在不太好,可能是一个糟糕的选择;它们增加了代码的复杂性,除非你总是使用精灵中的所有图像,否则你会发送更多的字节。【参考方案2】:google chrome 有 :6,Safari 有 :5,mozilla firefox 有 :8 对同一域的最大并发获取请求。
【讨论】:
感谢您的回答,但最好有来源。以上是关于通过浏览器获取并发请求数的主要内容,如果未能解决你的问题,请参考以下文章