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

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

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

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

Background: мои пользователи могут делать XmlHttpRequests с веб-страницы на сервер, запрашивая сервер для запуска команд ssh на удаленных хостах. Если удаленные хосты не работают, команда ssh занимает несколько минут, чтобы потерпеть неудачу, в конечном итоге препятствуя моим пользователям выполнять любые дальнейшие команды.

8 ответов


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

IE6, IE7 - имеют ограничение два. IE8 - 6, Если у вас есть широкополосный доступ-2 (если это dial up).


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


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

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

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


по данным IE 9-Что изменилось? в блоге HttpWatch IE9 по-прежнему имеет ограничение на подключение 2 при использовании VPN.

использование VPN все еще Clobbers IE 9 производительность

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

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


Я написал один файл AJAX tester. Наслаждайтесь!!! Просто потому, что у меня были проблемы с моим хостинг-провайдера

<?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. Когда тест завершен, вы можете увидеть, заняло ли это половину, заняло ли третье, заняло ли четверть и т. д. общего времени, вычитая, какой был параллелизм при вызовах на сервер. Это не строго и не точно, но приятно видеть в режиме реального времени, как завершаются вызовы ajaxs (видя входящий крест). И очень простой сдержанный скрипт для показа основ ajax.
Конечно, это предполагает, что серверная сторона не вводит никаких дополнительных ограничений.
Предпочтительно использовать в сочетании с firebug net panel (или эквивалентом Вашего браузера)


написал свой тест. протестировал код на 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 в разное время. (aka: flushing)

Я замечаю на своем узле.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();
});

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

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

могу я спросить, почему вы хотите сделать так много запросов? Есть веские причины для браузеров ограничивает количество запросов к одному домену. Вам будет лучше, если вы будете связывать запросы, если это возможно.