Wie viele gleichzeitige AJAX-Anforderungen (XmlHttpRequest) sind in gängigen Browsern zulässig?

358

In Firefox 3 lautet die Antwort 6 pro Domain: Sobald eine 7. XmlHttpRequest (auf einer beliebigen Registerkarte) für dieselbe Domain ausgelöst wird, wird sie in die Warteschlange gestellt, bis eine der anderen 6 beendet ist.

Wie lauten die Nummern für die anderen gängigen Browser?

Gibt es auch Möglichkeiten, diese Grenzwerte zu umgehen, ohne dass meine Benutzer ihre Browsereinstellungen ändern? Gibt es beispielsweise Beschränkungen für die Anzahl der JSONP-Anforderungen (die die Skript-Tag-Injektion anstelle eines XmlHttpRequest-Objekts verwenden)?

Hintergrund: Meine Benutzer können XmlHttpRequests von einer Webseite an den Server senden und den Server auffordern, ssh-Befehle auf Remote-Hosts auszuführen. Wenn die Remote-Hosts nicht verfügbar sind, dauert es einige Minuten, bis der Befehl ssh fehlschlägt, sodass meine Benutzer möglicherweise keine weiteren Befehle mehr ausführen können.

Michael Gundlach
quelle
Wenn Sie über Ihre Situation nachdenken, wie ist es möglich, den Fernschlauch anzupingen, um festzustellen, ob er oben oder unten ist? Dies wird Ihre Frage nicht beantworten, aber dies kann ein besserer Workflow sein.
Bob
1
Danke Bob, das ist einer der beiden Ansätze, die ich geplant hatte, um dieses Problem zu beheben. Ich dachte darüber nach, es in der Frage zu erwähnen, entschied aber, dass es nicht zum Thema gehört. (Ein anderer Ansatz besteht darin, dass der Server, den ich kontrolliere, das Zeitlimit für die SSH-Anforderungen
Michael Gundlach
1
Ich denke, Sie haben so ziemlich Ihre Antwort ... es ist mehr als sicher anzunehmen, dass Safari und Chrome mindestens 2 unterstützen, also können Sie immer 2 annehmen.
Rex M
1
Mit Chrome 2.0.172.28 unter Windows Vista habe ich 6 gleichzeitige Verbindungen.
Callum
2
Ich habe gerade diese Seite stevesouders.com/blog/2008/03/20/… gefunden, die ein paar weitere Zahlen und eine Diskussion darüber enthält.
David Johnstone

Antworten:

143

Ein Trick, mit dem Sie die Anzahl der gleichzeitigen Verbindungen erhöhen können, besteht darin, Ihre Bilder von einer anderen Subdomäne zu hosten. Diese werden als separate Anforderungen behandelt. Jede Domain ist auf das gleichzeitige Maximum beschränkt.

IE6, IE7 - haben ein Limit von zwei. IE8 ist 6, wenn Sie ein Breitband haben - 2 (wenn es sich um eine Einwahl handelt).

Bob
quelle
4
Nein, die Grenzen sind der Domain auferlegt. Sie könnten also technisch gesehen FF bis zu 12 Verbindungen erhalten, wenn Sie zusätzlich zu Ihrer Site eine Subdomain hätten.
Bob
1
Wenn ich Sie verstehe, beschränkt FF alle Anforderungen (auf eine einzelne Domain) auf 6 - nicht nur XmlHttpRequests auf eine einzelne Domain. Und andere Browser machen dasselbe mit anderen Grenzen. Richtig?
Michael Gundlach
1
Oh ja, wenn Sie eine Seite mit tausend Bildern haben, werden diese in Sechsergruppen heruntergeladen. Ich glaube, die meisten anderen Mainstream-Browser funktionieren genauso.
Bob
7
Beeindruckend. Das ist ein guter Trick. Dies erklärt auch, warum Kachelserver für Map Engines eine Reihe von gefälschten Subdomains erstellen (normalerweise so etwas wie maps1.whatever.com, maps2.whatever.com, maps3.whatever.com), um die Dinge zu beschleunigen.
Meawoppl
2
@AMember, der Browser behält parallel seine maximal zulässige Anzahl gleichzeitiger Ajax. Versuchen Sie meine Antwort unten, wenn Sie in Aktion sehen möchten
Luis Siquot
103

Die Netzwerkergebnisse bei Browserscope geben Ihnen sowohl Verbindungen pro Hostname als auch Max. Verbindungen für gängige Browser. Die Daten werden durch Ausführen von Tests für Benutzer "in freier Wildbahn" erfasst, damit sie auf dem neuesten Stand bleiben.

Kevin Hakanson
quelle
3
Leider sieht das nicht aus der Ferne aktuell aus
Dave Lawrence
@ DaveLawrence Ich habe es gerade überprüft und der vollständige Datensatz scheint Chrome 60 und 61 zu enthalten, was ziemlich aktuell ist.
Simon East
24

Mit IE6 / IE7 kann die Anzahl der gleichzeitigen Anforderungen in der Registrierung angepasst werden. Hier erfahren Sie, wie Sie jeweils vier festlegen.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
Brianegge
quelle
15
-1. OP sagte without having my users modify their browser settings. Es ist auch nicht praktisch, da man dies auf jedem Client tun müsste.
Razort4x
23
Dies ist jedoch im Zusammenhang mit diesem Problem sehr nützlich. Vielleicht wäre es besser in einem Kommentar als als Antwort gepostet worden?
JD Smith
7

Ich habe gerade bei www.browserscope.org nachgefragt und mit IE9 und Chrome 24 können Sie 6 gleichzeitige Verbindungen zu einer einzelnen Domain und bis zu 17 zu mehreren herstellen.

xmorera
quelle
6

Laut IE 9 - Was hat sich geändert? Im HttpWatch-Blog hat IE9 über VPN immer noch ein Verbindungslimit von 2.

Verwenden eines VPN blockiert immer noch die Leistung von IE 9

Wir haben bereits über die Reduzierung der maximalen Anzahl gleichzeitiger Verbindungen in IE 8 berichtet, wenn Ihr PC eine VPN-Verbindung verwendet. Dies geschah auch dann, wenn der Browserverkehr nicht über diese Verbindung ging.

Leider ist IE 9 von VPN-Verbindungen auf die gleiche Weise betroffen:

Kevin Hakanson
quelle
6

Ich habe einen AJAX-Tester für eine einzelne Datei geschrieben. Geniesse es!!! Nur weil ich Probleme mit meinem Hosting-Anbieter hatte

<?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>

Bearbeiten:
r bedeutet Zeile und w Wartezeit.
Wenn Sie zum ersten Mal die Starttaste 80 (oder eine andere Anzahl) der gleichzeitigen Ajax-Anforderung drücken, werden diese über Javascript gestartet, aber bekanntlich werden sie vom Browser gespoolt. Außerdem werden sie parallel zum Server angefordert (auf eine bestimmte Anzahl beschränkt, dies ist die Tatsache dieser Frage). Hier werden die Anfragen serverseitig mit einer zufälligen Verzögerung (festgelegt durch w) gelöst. Zur Startzeit wird die gesamte Zeit berechnet, die zum Lösen aller Ajax-Anrufe benötigt wird. Wenn der Test abgeschlossen ist, können Sie sehen, ob er die Hälfte, den dritten, ein Viertel usw. der Gesamtzeit in Anspruch genommen hat, abzüglich der Parallelität bei den Aufrufen an den Server. Dies ist weder streng noch präzise, ​​aber es ist schön, in Echtzeit zu sehen, wie Ajax-Anrufe abgeschlossen werden (siehe eingehendes Kreuz). Und ist ein sehr einfaches, in sich geschlossenes Skript, das die Grundlagen von Ajax zeigt.
Dies setzt natürlich voraus, dass die Serverseite kein zusätzliches Limit einführt.
Verwenden Sie es vorzugsweise in Verbindung mit dem Firebug Net Panel (oder dem Äquivalent Ihres Browsers).

Luis Siquot
quelle
Ich bestätige also, dass FF3 bis zu sechs gleichzeitige Anfragen startet
Luis Siquot
Kannst du bitte erklären, was du hier gemacht hast? Was ist r und w?
Druckbildschirm
4

Schrieb meinen eigenen Test. getestet den Code auf Stackoverflow, funktioniert gut sagt mir, dass Chrome / FF 6 kann

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();
});

Es funktioniert für die meisten Websites, die zu unterschiedlichen Zeiten ein Ereignis zur Änderung des Zustands auslösen können. (aka: Spülen)

Ich stelle auf meinem node.js-Server fest, dass ich mindestens 1025 Bytes ausgeben musste, um das Ereignis / Flush auszulösen. Andernfalls würden die Ereignisse nur alle drei Zustände gleichzeitig auslösen, wenn die Anforderung abgeschlossen ist. Hier ist mein Backend:

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

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

app.listen(80);

Aktualisieren

Ich stelle fest, dass Sie jetzt bis zu 2x Anfragen haben können, wenn Sie gleichzeitig xhr und fetch api verwenden

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();
});

Endlos
quelle
Auf meiner steht 19, ist es kaputt?
PauAI
Firefox Developer Edition 57.0b12 sagt 2.
AnthonyB
0

Ich glaube, es gibt eine maximale Anzahl von gleichzeitigen http-Anfragen, die Browser an dieselbe Domain senden. Diese liegt in der Größenordnung von 4 bis 8 Anfragen, abhängig von den Einstellungen des Benutzers und dem Browser.

Sie können Ihre Anforderungen so einrichten, dass sie zu verschiedenen Domänen wechseln, was möglicherweise machbar ist oder nicht. Die Yahoo-Leute haben in diesem Bereich viel recherchiert, worüber Sie ( hier ) lesen können . Denken Sie daran, dass für jede neue Domain, die Sie hinzufügen, auch eine DNS-Suche erforderlich ist. Die YSlow-Leute empfehlen zwischen 2 und 4 Domänen, um einen guten Kompromiss zwischen parallelen Anforderungen und DNS-Suchvorgängen zu erzielen. Dabei geht es jedoch um die Ladezeit der Seite und nicht um nachfolgende AJAX-Anforderungen.

Kann ich fragen, warum Sie so viele Anfragen stellen möchten? Es gibt gute Gründe dafür, dass die Browser die Anzahl der Anforderungen auf dieselbe Domain beschränken. Wenn möglich, sollten Sie Anfragen besser bündeln.

cbp
quelle
1
Meine XmlHttpRequests können aufgrund der gleichen Ursprungsrichtlinie nicht zu verschiedenen Domänen wechseln, wie Sie vorschlagen. (Möglicherweise ist dies ein Argument für die Verwendung von jsonp, um dieses Problem zu umgehen.) Diese Seite ist ein Befehls- und Steuerungs-Dashboard für viele Computer. Somit wird eine Anforderung pro Ausführung erzeugt, die vom Benutzer angefordert wird.
Michael Gundlach