流行的浏览器允许多少并发AJAX (XmlHttpRequest)请求?

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

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

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

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

200672 次浏览

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

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

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

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

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

在IE6 / IE7中,用户可以调整注册表中的并发请求数量。下面是如何设置为四个。

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004

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

我已经写了一个单文件AJAX测试器。享受它! 只是因为我有问题与我的主机提供商

<?php /*


Author:   Luis Siquot
Purpose:  Check ajax performance and errors
License:  GPL
site5:    Please don't drop json requests (nor delay)!!!!


*/


$r = (int)$_GET['r'];
$w = (int)$_GET['w'];
if($r) {
sleep($w);
echo json_encode($_GET);
die ();
}  //else
?><head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">


var _settimer;
var _timer;
var _waiting;


$(function(){
clearTable();
$('#boton').bind('click', donow);
})


function donow(){
var w;
var estim = 0;
_waiting = $('#total')[0].value * 1;
clearTable();
for(var r=1;r<=_waiting;r++){
w = Math.floor(Math.random()*6)+2;
estim += w;
dodebug({r:r, w:w});
$.ajax({url: '<?php echo $_SERVER['SCRIPT_NAME']; ?>',
data:    {r:r, w:w},
dataType: 'json',   // 'html',
type: 'GET',
success: function(CBdata, status) {
CBdebug(CBdata);
}
});
}
doStat(estim);
timer(estim+10);
}


function doStat(what){
$('#stat').replaceWith(
'<table border="0" id="stat"><tr><td>Request Time Sum=<th>'+what+
'<td>&nbsp;&nbsp;/2=<th>'+Math.ceil(what/2)+
'<td>&nbsp;&nbsp;/3=<th>'+Math.ceil(what/3)+
'<td>&nbsp;&nbsp;/4=<th>'+Math.ceil(what/4)+
'<td>&nbsp;&nbsp;/6=<th>'+Math.ceil(what/6)+
'<td>&nbsp;&nbsp;/8=<th>'+Math.ceil(what/8)+
'<td> &nbsp; (seconds)</table>'
);
}


function timer(what){
if(what)         {_timer = 0; _settimer = what;}
if(_waiting==0)  {
$('#showTimer')[0].innerHTML = 'completed in <b>' + _timer + ' seconds</b> (aprox)';
return ;
}
if(_timer<_settimer){
$('#showTimer')[0].innerHTML = _timer;
setTimeout("timer()",1000);
_timer++;
return;
}
$('#showTimer')[0].innerHTML = '<b>don\'t wait any more!!!</b>';
}




function CBdebug(what){
_waiting--;
$('#req'+what.r)[0].innerHTML = 'x';
}




function dodebug(what){
var tt = '<tr><td>' + what.r + '<td>' + what.w + '<td id=req' + what.r + '>&nbsp;'
$('#debug').append(tt);
}




function clearTable(){
$('#debug').replaceWith('<table border="1" id="debug"><tr><td>Request #<td>Wait Time<td>Done</table>');
}




</script>
</head>
<body>
<center>
<input type="button" value="start" id="boton">
<input type="text" value="80" id="total" size="2"> concurrent json requests
<table id="stat"><tr><td>&nbsp;</table>
Elapsed Time: <span id="showTimer"></span>
<table id="debug"></table>
</center>
</body>
< p > 编辑: < br > R表示行,w表示等待时间
当你最初按下开始按钮80(或任何其他数字)的并发ajax请求是由javascript启动,但众所周知,他们是假脱机的浏览器。另外,它们被并行地请求到服务器(限制在一定数量,这就是这个问题的事实)。在这里,请求在服务器端以随机延迟(由w建立)解决。在开始时,计算解决所有ajax调用所需的所有时间。当测试完成时,您可以看到它是否花费了总时间的一半、三分之一、四分之一等,减去了对服务器调用的并行度。这不是严格的,也不是精确的,但是很好地实时看到ajax调用是如何完成的(看到传入的交叉)。是一个非常简单的自包含脚本,以显示ajax基础 当然,这是假设服务器端没有引入任何额外的限制 最好与firebug net面板(或浏览器的等效面板)一起使用

根据HttpWatch博客上的IE 9 -改变了什么?,当通过VPN时,IE9仍然有2个连接限制。

使用VPN仍然会破坏IE 9的性能

我们之前报道过 关于上限的缩减 IE的并发连接数 8当你的PC使用VPN连接时。 这种情况即使发生在浏览器 交通没有经过那里 连接。< / p >

不幸的是,ie9受到VPN的影响 以同样的方式连接:

我刚刚检查了www.browserscope.org和IE9和Chrome 24,你可以有6个并发连接到一个域,最多17到多个域。

编写我自己的测试。在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();
});

一个迁移到http 2.0的好理由

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