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

358

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

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

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

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

Майкл Гундлах
источник
Размышляя о вашей ситуации, какова возможность пинговать удаленный шланг, чтобы увидеть, вверх или вниз? Это не ответит на ваш вопрос, но это может быть лучший рабочий процесс.
Боб
1
Спасибо, Боб, это один из двух подходов, которые я планировал исправить, - я подумал упомянуть об этом в Вопросе, но решил, что это не по теме. (Другой подход заключается в том, чтобы сервер, которым я управляю, прервал тайм-аут запросов ssh.)
Майкл Гундлах,
1
Я думаю, что у вас в значительной степени есть свой ответ ... более чем безопасно предполагать, что Safari и Chrome поддерживают как минимум 2, так что вы всегда можете принять 2.
Rex M
1
Используя Chrome 2.0.172.28 в Windows Vista, я получил 6 одновременных подключений.
Каллум
2
Я только что нашел эту страницу stevesouders.com/blog/2008/03/20/…, которая дает еще несколько цифр и обсуждение этого вопроса.
Дэвид Джонстон

Ответы:

143

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

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

боб
источник
4
Нет, ограничения наложены на домен. Таким образом, вы можете получить FF до 12 соединений, если у вас есть поддомен в дополнение к вашему сайту.
Боб
1
Поэтому, если я вас понимаю, FF ограничивает все запросы (одним доменом) до 6, а не только XmlHttpRequests для одного домена. И другие браузеры делают то же самое с разными ограничениями. Правильный?
Майкл Гундлах
1
О, да, если у вас есть страница с тысячей изображений, она будет загружать их группами по шесть. Я считаю, что большинство других популярных браузеров работают так же.
Боб
7
Ух ты. Это хороший трюк. Это также объясняет, почему серверы листов для картографических движков создают несколько поддельных поддоменов (обычно что-то вроде maps1.whever.com, maps2.whever.com, maps3.whever.com) для ускорения процесса.
Meawoppl
2
@AMember, браузер постоянно поддерживает максимальное разрешенное количество одновременных ajax. Попробуйте мой ответ ниже, если вы хотите увидеть в действии
Луис Сиквот
103

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

Кевин Хакансон
источник
3
К сожалению, это не выглядит отдаленно актуальным
Дейв Лоуренс
@DaveLawrence Я только что проверил, и полный набор данных, кажется, содержит Chrome 60 и 61, что довольно актуально.
Саймон Ист
24

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

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
brianegge
источник
15
-1. ОП сказал without having my users modify their browser settings. Кроме того, это не практично, так как это нужно делать каждому клиенту.
Razort4x
23
Тем не менее, это очень полезная вещь, связанная с этой проблемой. Возможно, это было бы лучше опубликовано в комментарии, чем в качестве ответа?
Дж. Д. Смит,
7

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

xmorera
источник
6

Согласно IE 9 - Что изменилось? в блоге HttpWatch IE9 все еще имеет ограничение на 2 соединения при использовании VPN.

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

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

К сожалению, на IE 9 VPN-подключения влияют так же:

Кевин Хакансон
источник
6

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

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

Луис Сиквот
источник
так что я подтверждаю, FF3 запускает до шести одновременных запросов
Луис Сиквот
Можете ли вы объяснить, что вы сделали здесь? Что такое г и ш? Печать экрана анализа результатов будет высоко ценится
Рой Намир
4

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

Обновить

Я заметил, что теперь у вас может быть до 2х запросов, если вы одновременно используете 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();
});

Бесконечный
источник
Это говорит 19 на моем, это сломано?
PauAI
Firefox Developer Edition 57.0b12 сообщает 2.
AnthonyB
0

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

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

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

CBP
источник
1
Мои XmlHttpRequests не могут отправляться в другие домены, как вы предлагаете, из-за одной и той же политики происхождения. (Возможно, это аргумент в пользу использования jsonp для решения этой проблемы.) Эта страница представляет собой панель управления для многих компьютеров; таким образом, запрос создается при выполнении запроса пользователем.
Майкл Гундлах