Сколько одновременных запросов AJAX (XmlHttpRequest) разрешено в популярных браузерах?

В Firefox 3 ответ 6 на домен: как только 7-й XmlHttpRequest (на любой вкладке) в тот же домен уволен, он ставится в очередь до тех пор, пока не закончится один из остальных 6.

Каковы числа для других основных браузеров?

Кроме того, существуют ли способы ограничения этих ограничений, если мои пользователи не изменяют настройки браузера? Например, существуют ли ограничения на количество jsonp-запросов (которые используют <тег > w370 > , а не объект XmlHttpRequest)?

Справочная информация. Мои пользователи могут сделать XmlHttpRequests с веб-страницы на сервере, попросив сервер выполнить команды ssh на удаленных хостах. Если удаленные хосты опущены, команда ssh занимает несколько минут, чтобы не сработать, в конечном итоге не позволяя моим пользователям выполнять какие-либо дополнительные команды.

Ответ 1

Один трюк, который вы можете использовать для увеличения количества параллельных подключений, - это размещение ваших изображений из другого поддомена. Они будут обрабатываться как отдельные запросы, каждый из которых будет ограничен одновременным максимумом.

IE6, IE7 - имеют предел в два. IE8 - 6, если у вас широкополосная связь - 2 (если она установлена).

Ответ 2

Результаты сети в Browserscope предоставят вам как Подключения на имя хоста, так и Макс. соединения для популярных браузеров. Данные собираются путем запуска тестов на пользователя "в дикой природе", поэтому он будет оставаться в курсе событий.

Ответ 3

В IE6/IE7 можно настроить количество одновременных запросов в реестре. Здесь, как установить его по четыре каждый.

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

Ответ 4

Я написал один тестер 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>

Edit:
r означает время ожидания строки и w.
Когда вы сначала нажимаете кнопку запуска 80 (или любой другой номер) параллельного запроса ajax, запускаются javascript, но, как известно, они буферизуются браузером. Также они запрашиваются на сервере параллельно (ограниченным определенным числом, это факт этого вопроса). Здесь запросы решаются на стороне сервера со случайной задержкой (устанавливается w). В момент запуска вычисляется все время, необходимое для решения всех вызовов ajax. Когда тест закончен, вы можете увидеть, заняло ли оно половину, заняло третье место, заняло четверть и т.д. Всего времени, вычитая, что было parallelism при звонках на сервер. Это не является строгим или точным, но приятно видеть в реальном времени, как завершаются вызовы ajaxs (видя входящий крест). И очень простой автономный script, чтобы показать основы ajax.
Конечно, это предполагает, что серверная сторона не вводит никаких дополнительных ограничений.
Предпочтительно использовать в сочетании с сетевой панелью Firebug (или эквивалентом браузера)

Ответ 5

В соответствии с IE 9 - Whats Changed? в блоге HttpWatch, у IE9 все еще есть ограничение на соединение 2 при использовании VPN.

Использование производительности VPN по-прежнему Clobbers IE 9

Ранее мы сообщали об уменьшении максимального значения количество параллельных подключений в IE 8, когда ваш компьютер использует VPN-соединение. Это произошло, даже если браузер трафик не прошел соединение.

К сожалению, на IE 9 влияет VPN соединения таким же образом:

Ответ 6

Я только что проверил www.browserscope.org, а с IE9 и Chrome 24 вы можете иметь 6 одновременных подключений к одному домену и до 17 к нескольким.

Ответ 7

Написал мой собственный тест. проверял код на 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();
});

он работает для большинства веб-сайтов, которые могут запускать событие изменения readystate в разное время. (ака: промывка)

Я заметил на моем сервере 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 и fetch 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();
});

Ответ 8

Я считаю, что существует максимальное количество одновременных HTTP-запросов, которые браузеры будут делать в том же домене, который находится в порядке 4-8 запросов в зависимости от пользовательских настроек и браузера.

Вы можете настроить свои запросы для перехода в разные домены, что может быть или не быть выполнимо. Ребята из Yahoo сделали много исследований в этой области, о которых вы можете прочитать (здесь). Помните, что каждый добавленный новый домен также требует поиска DNS. Ребята из YSlow рекомендуют от 2 до 4 доменов для достижения хорошего компромисса между параллельными запросами и поисками DNS, хотя это касается времени загрузки страницы, а не последующих запросов AJAX.

Могу ли я спросить, почему вы хотите сделать так много запросов? Имеются веские причины для того, чтобы браузеры ограничивали количество запросов в том же домене. По возможности вам будет проще связывать запросы.