一般的なブラウザではいくつの同時AJAX(XmlHttpRequest)リクエストが許可されますか?


358

Firefox 3では、答えはドメインごとに6つです。同じドメインに対して(任意のタブで)7番目のXmlHttpRequestが起動するとすぐに、他の6つのうちの1つが完了するまでキューに入れられます。

他の主要なブラウザの数はいくつですか?

また、ユーザーがブラウザ設定を変更せずにこれらの制限を回避する方法はありますか?たとえば、jsonpリクエスト(XmlHttpRequestオブジェクトではなくスクリプトタグインジェクションを使用)の数に制限はありますか?

背景:ユーザーはWebページからサーバーにXmlHttpRequestsを作成し、リモートホストでsshコマンドを実行するようサーバーに要求できます。リモートホストがダウンしている場合、sshコマンドが失敗するまでに数分かかり、最終的にユーザーがそれ以上コマンドを実行できなくなります。


あなたの状況を考えると、リモートホースをpingして、それがアップまたはダウンしているかどうかを確認することの実現可能性は何ですか?これはあなたの質問に答えませんが、これはより良いワークフローであるかもしれません。
ボブは

1
ボブに感謝します。これは、この問題を修正するために計画していた2つのアプローチの1つです。質問でそれについて言及することを検討しましたが、トピックから外れていると判断しました。(別のアプローチは、私が制御するサーバーにssh要求をタイムアウトさせることです。)
Michael Gundlach

1
私はあなたが常に2を取ることができるので、あなたはかなり多く、それが2以上でのSafariとChromeのサポートを想定し、より安全でよりです...あなたの答えを持っていると思う
レックスM

1
Windows VistaでChrome 2.0.172.28を使用して、6つの同時接続を取得しました。
Callum

2
私はこのページstevesouders.com/blog/2008/03/20/…を見つけました。これは、さらにいくつかの数字とこれに関する議論を提供します。
David Johnstone、

回答:


143

同時接続の数を増やすために使用できる1つのトリックは、別のサブドメインからイメージをホストすることです。これらは個別のリクエストとして扱われ、各ドメインが同時最大数に制限されます。

IE6、IE7-2つの制限があります。ブロードバンドを使用している場合、IE8は6-2(ダイヤルアップの場合)です。


4
いいえ、制限はドメインに課されます。したがって、サイトに加えてサブドメインがある場合、技術的には最大12接続までFFを取得できます。
ボブ

1
したがって、私があなたを理解している場合、FF は(単一ドメインへの)すべての要求を6に制限ます-単一ドメインへのXmlHttpRequestsだけではありません。また、他のブラウザも同じことを行いますが、制限は異なります。正しい?
マイケルガンドラハ

1
そうそう、あなたが1000枚の画像を含むページを持っているなら、それはそれらを6つのグループでダウンロードします。私は他のほとんどの主流のブラウザが同じように動作すると信じています。
ボブは

7
ワオ。これは良いトリックです。これは、マップエンジンのタイルサーバーが多くの偽のサブドメイン(通常、maps1.whatever.com、maps2.whatever.com、maps3.whatever.comなど)を作成して高速化する理由も説明します。
meawoppl 2013年

2
@AMember、ブラウザーは常に許可されている同時ajaxの最大数を並行して維持します。実際に見たい場合は、以下の私の答えを試してください
Luis Siquot

103

Browserscopeでのネットワーク結果は、ホスト名ごとの接続数と一般的なブラウザーの最大接続数の両方を提供します。データは、「実際に」ユーザーにテストを実行することによって収集されるため、最新の状態に保たれます。


3
残念ながら、これはリモートで最新の状態にはなりません
Dave Lawrence

@DaveLawrence私がチェックしたところ、完全なデータセットにはChrome 60と61が含まれているようです。
Simon East

24

IE6 / IE7を使用すると、レジストリ内の同時リクエストの数を調整できます。それぞれを4に設定する方法は次のとおりです。

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

15
-1。OPは言ったwithout having my users modify their browser settings。また、各クライアントでこれを行う必要があるため、実用的ではありません。
Razort4x 2013

23
それでも、この問題に関しては、知っておくと非常に便利です。おそらくそれは答えとしてよりもコメントで投稿された方がいいでしょうか?
JD Smith


6

IE 9によると–何が変更されましたか?HttpWatchブログでは、VPN経由のIE9にはまだ2つの接続制限があります。

VPNの使用は依然としてInternet Explorer 9のパフォーマンスを低下させる

以前に、PCがVPN接続を使用する場合のIE 8の同時接続の最大数の縮小について報告しました。これは、ブラウザのトラフィックがその接続を経由しない場合でも発生しました。

残念ながら、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>

編集: もちろん、これはサーバー側が余分な制限を導入していないことを前提としています。 できれば、Firebugネットパネル(またはブラウザの同等のもの)と組み合わせて使用​​します。
rは行およびw待機時間を意味します。
最初に開始ボタン80(または他の任意の数)を押すと、同時ajax要求がjavascriptによって起動されますが、既知のように、ブラウザーによってスプールされます。また、それらはサーバーに並行して要求されます(特定の数に制限されています。これがこの質問の事実です)。ここで、要求はサーバー側でランダムな遅延(wによって確立)で解決されます。開始時に、すべてのajax呼び出しを解決するために必要なすべての時間が計算されます。テストが終了すると、合計時間の半分、3分の1、4分の1などがかかったかどうかを確認できます。これにより、サーバーへの呼び出しの並列処理が差し引かれます。これは厳密でも正確でもありませんが、ajax呼び出しがどのように完了したかをリアルタイムで確認するのに適しています(着信クロスを参照)。そして、ajaxの基本を示す非常にシンプルな自己完結型スクリプトです。


そのため、FF3は最大6つの同時リクエストを起動します
Luis Siquot、2011

ここで何をしたか説明してもらえますか?rとwとは何ですか?分析結果の画面を印刷していただければ
幸いです

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

さまざまなタイミングでreadystate changeイベントをトリガーできるほとんどのWebサイトで機能します。(別名:フラッシング)

node.jsサーバーで、イベント/フラッシュをトリガーするために少なくとも1025バイトを出力する必要があることに気付きました。そうでなければ、イベントはリクエストが完了したときに一度に3つの状態すべてをトリガーするだけなので、ここに私のバックエンドがあります。

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

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

app.listen(80);

更新

xhrとfetch apiの両方を同時に使用している場合は、最大で2倍のリクエストを処理できることに気づきました

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 2016

Firefoxの開発者版57.0b12 2.語る
AnthonyB

0

ブラウザが同じドメインに対して行う同時HTTPリクエストの最大数は、ユーザーの設定とブラウザに応じて4〜8のオーダーであると思います。

別のドメインに移動するようにリクエストを設定することもできますが、それが可能かどうかは不明です。Yahooの人は、あなたが(約読むことができ、この分野の研究の多くは、やったここに)。追加するすべての新しいドメインにもDNSルックアップが必要であることを忘れないでください。YSlowの担当者は、並列リクエストとDNSルックアップの間の適切な妥協点を達成するために2〜4ドメインを推奨していますが、これは後続のAJAXリクエストではなくページの読み込み時間に焦点を当てています。

なぜそんなに多くのリクエストをしたいのですか?ブラウザが同じドメインへのリクエストの数を制限するのには十分な理由があります。可能であれば、リクエストをバンドルすることをお勧めします。


1
Same Origin Policyが原因で、私のXmlHttpRequestsは、提案されているように別のドメインに移動できません。(おそらく、これはjsonpを使用してこの問題を回避するための引数です。)このページは、多くのコンピューターのコマンドアンドコントロールダッシュボードです。したがって、ユーザーが要求した実行ごとに要求が生成されます。
マイケルガンドラハ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.