[ajax] 인기있는 브라우저에서 몇 개의 동시 AJAX (XmlHttpRequest) 요청이 허용됩니까?

Firefox 3에서 답은 도메인 당 6입니다. 같은 도메인에 대한 7 번째 XmlHttpRequest (모든 탭에서)가 시작 되 자마자 다른 6 개 중 하나가 완료 될 때까지 대기합니다.

다른 주요 브라우저의 숫자는 무엇입니까?

또한 사용자가 브라우저 설정을 수정하지 않고도 이러한 한계를 극복 할 수있는 방법이 있습니까? 예를 들어, jsonp 요청 수 (XmlHttpRequest 객체 대신 스크립트 태그 삽입을 사용하는)에 제한이 있습니까?

배경 : 내 사용자는 웹 페이지에서 서버로 XmlHttpRequests를 만들어 서버가 원격 호스트에서 ssh 명령을 실행하도록 요청할 수 있습니다. 원격 호스트가 다운되면 ssh 명령이 실패하는 데 몇 분이 걸리므로 사용자가 추가 명령을 수행하지 못하게됩니다.



답변

동시 연결 수를 늘리기 위해 사용할 수있는 한 가지 트릭은 다른 하위 도메인에서 이미지를 호스팅하는 것입니다. 이들은 별도의 요청으로 취급되며 각 도메인은 동시 최대로 제한됩니다.

IE6, IE7-한도는 2입니다. 광대역이있는 경우 IE8은 6입니다 (전화 접속 인 경우).

a

답변

에서 네트워크 결과 Browserscope는 당신에게 모두 줄 것이다 호스트 당 연결최대 연결 인기있는 브라우저. “실제로”사용자에 대한 테스트를 실행하여 데이터를 수집하므로 최신 상태로 유지됩니다.


답변

IE6 / IE7을 사용하면 레지스트리에서 동시 요청 수를 조정할 수 있습니다. 각각 4 개로 설정하는 방법은 다음과 같습니다.

[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는 VPN을 통한 연결 제한이 여전히 2입니다.

VPN 스틸 클로버 IE 9 성능 사용

우리는 이전에 PC가 VPN 연결을 사용할 때 IE 8에서 최대 동시 연결 수의 축소에 대해보고했습니다. 이는 브라우저 트래픽이 해당 연결을 통과하지 않은 경우에도 발생했습니다.

불행하게도 IE 9는 같은 방식으로 VPN 연결의 영향을받습니다.


답변

단일 파일 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 (또는 다른 수)의 동시 아약스 요청을 처음 누르면 자바 스크립트에 의해 시작되지만 알려진 바와 같이 브라우저에 의해 스풀링됩니다. 또한 서버에 병렬로 요청됩니다 (특정 수로 제한됩니다.이 질문의 사실입니다). 여기서 요청은 임의 지연 (w에 의해 설정 됨)으로 서버 측에서 해결됩니다. 시작 시간에 모든 아약스 호출을 해결하는 데 필요한 모든 시간이 계산됩니다. 테스트가 완료되면 전체 시간의 절반, 3 분의 1, 4 분의 1 등이 소요되어 서버 호출에 대한 병렬 처리가 차감되는지 확인할 수 있습니다. 이것은 엄격하거나 정확하지는 않지만 실시간으로 ajaxs 호출이 어떻게 완료되는지 확인하는 것이 좋습니다 (수신 크로스 참조). 그리고 아약스 기본을 보여주는 매우 간단한 자체 포함 스크립트입니다.
물론 이것은 서버 측에 추가 제한이없는 것으로 가정합니다.
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 변경 이벤트를 트리거 할 수있는 대부분의 웹 사이트에서 작동합니다. (일명 : 플러싱)

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

최신 정보

xhr과 fetch api를 동시에 사용하는 경우 최대 2x 요청을 할 수 있습니다.

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


댓글 달기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다