在Firefox 3中,答案是每个域6个:只要触发同一个域的第7个XmlHttpRequest(在任何选项卡上),它就会排队,直到其他6个完成为止。

其他主要浏览器的数字是多少?

此外,是否有办法绕过这些限制而不让用户修改浏览器设置?例如,jsonp请求(使用脚本标记注入而不是XmlHttpRequest对象)的数量是否有限制?

背景:我的用户可以从web页面到服务器进行xmlhttprequest,要求服务器在远程主机上运行ssh命令。如果远程主机宕机,ssh命令会在几分钟后失效,最终阻止用户执行任何进一步的命令。


当前回答

我相信浏览器会对同一个域并发http请求的最大数量,根据用户的设置和浏览器的不同,请求的顺序是4-8个。

您可以设置请求到不同的域,这可能是可行的,也可能是不可行的。雅虎的人在这个领域做了很多研究,你可以在这里读到。请记住,您添加的每个新域也需要DNS查找。YSlow的人建议在2到4个域之间实现并行请求和DNS查找之间的良好妥协,尽管这主要关注页面的加载时间,而不是后续的AJAX请求。

我能问一下你为什么要提这么多要求吗?浏览器限制同一域的请求数量是有充分理由的。如果可能的话,最好将请求捆绑在一起。

其他回答

编写我自己的测试。在stackoverflow上测试了代码,工作良好,告诉我chrome/FF可以做6

var change = 0;
var simultanius = 0;
var que = 20; // number of tests

Array(que).join(0).split(0).forEach(function(a,i){
    var xhr = new XMLHttpRequest;
    xhr.open("GET", "/?"+i); // cacheBust
    xhr.onreadystatechange = function() {
        if(xhr.readyState == 2){
            change++;
            simultanius = Math.max(simultanius, change);
        }
        if(xhr.readyState == 4){
            change--;
            que--;
            if(!que){
                console.log(simultanius);
            }
        }
    };
    xhr.send();
});

它适用于大多数可以在不同时间触发就绪状态改变事件的网站。(又名:冲洗)

我注意到在我的node.js服务器上,我必须输出至少1025字节来触发事件/刷新。否则事件会在请求完成时立即触发所有三个状态,下面是我的后端:

var app = require('express')();

app.get("/", function(req,res) {
    res.write(Array(1025).join("a"));
    setTimeout(function() {
        res.end("a");
    },500);
});

app.listen(80);

更新

我注意到,你现在可以有多达2x的请求,如果你同时使用xhr和获取api

var change = 0; var simultanius = 0; var que = 30; // number of tests Array(que).join(0).split(0).forEach(function(a,i){ fetch("/?b"+i).then(r => { change++; simultanius = Math.max(simultanius, change); return r.text() }).then(r => { change--; que--; if(!que){ console.log(simultanius); } }); }); Array(que).join(0).split(0).forEach(function(a,i){ var xhr = new XMLHttpRequest; xhr.open("GET", "/?a"+i); // cacheBust xhr.onreadystatechange = function() { if(xhr.readyState == 2){ change++; simultanius = Math.max(simultanius, change); } if(xhr.readyState == 4){ change--; que--; if(!que){ document.body.innerHTML = simultanius; } } }; xhr.send(); });

增加并发连接数量的一个技巧是将映像驻留在不同的子域。这些将被视为单独的请求,每个域将被限制为并发的最大值。

IE6, IE7 -有两个限制。IE8是6,如果你有宽带- 2(如果是拨号上网)。

Browserscope的网络结果将为您提供每个主机名的连接数和流行浏览器的最大连接数。数据是通过对“野外”用户运行测试来收集的,因此它将保持最新。

我相信浏览器会对同一个域并发http请求的最大数量,根据用户的设置和浏览器的不同,请求的顺序是4-8个。

您可以设置请求到不同的域,这可能是可行的,也可能是不可行的。雅虎的人在这个领域做了很多研究,你可以在这里读到。请记住,您添加的每个新域也需要DNS查找。YSlow的人建议在2到4个域之间实现并行请求和DNS查找之间的良好妥协,尽管这主要关注页面的加载时间,而不是后续的AJAX请求。

我能问一下你为什么要提这么多要求吗?浏览器限制同一域的请求数量是有充分理由的。如果可能的话,最好将请求捆绑在一起。

一个迁移到http 2.0的好理由

使用http2.0,每台主机的最大连接数实际上是无限制的:HTTP/2是否提高了每台主机的连接限制?