source

일반적인 브라우저에서 동시에 허용되는 AJAX(XmlHttpRequest) 요청 수는 몇 개입니까?

nicesource 2023. 4. 4. 21:26
반응형

일반적인 브라우저에서 동시에 허용되는 AJAX(XmlHttpRequest) 요청 수는 몇 개입니까?

Firefox 3에서는 도메인당 6개입니다.같은 도메인에 대한 7번째 XmlHttpRequest(임의의 탭)가 실행되면 나머지 6개 중 하나가 완료될 때까지 큐잉됩니다.

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

또한 사용자가 브라우저 설정을 변경하지 않고 이러한 제한을 회피할 수 있는 방법이 있습니까?예를 들어, jsonp 요구 수에는 제한이 있습니까(스크립트 태그 주입을 XmlHttpRequest 객체가 아닌 사용).

배경:사용자는 웹 페이지에서 서버에 XmlHttpRequests를 생성하여 리모트호스트에서 ssh 명령어를 실행하도록 서버에 요구할 수 있습니다.리모트 호스트가 다운되어 있는 경우 ssh 명령어가 실패하는 데 몇 분이 걸리기 때문에 사용자는 더 이상의 명령을 실행할 수 없습니다.

동시 연결 수를 늘리기 위해 사용할 수 있는 한 가지 방법은 다른 하위 도메인에서 이미지를 호스팅하는 것입니다.이러한 요청은 개별 요청으로 처리되며, 각 도메인은 동시 최대값으로 제한됩니다.

IE6, IE7 - 제한은 2입니다.IE8은 브로드밴드가 있는 경우 6입니다.2(다이얼 업의 경우).

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에서는 1개의 도메인에 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 의 、 r 의 w 、 r 은 w 、 r 은 w 、 r 은 r r r r r r r
처음에 시작 버튼 80(또는 다른 번호)을 누르면 동시 에이잭스 요청이 Javascript에 의해 시작되지만 알려진 바와 같이 그것들은 브라우저에 의해 스풀됩니다.또한 서버에 병렬로 요구됩니다(특정 수에 한함, 이것이 이 질문의 사실입니다).여기서 요구는 랜덤 지연(w에 의해 확립됨)으로 서버 측에서 해결됩니다.시작 시 모든 Ajax 콜을 해결하는 데 필요한 모든 시간이 계산됩니다.테스트가 끝나면 서버 호출의 병렬성을 차감하여 전체 시간의 절반, 3위, 4분의 1 등을 확인할 수 있습니다.이것은 엄밀하지도 정확하지도 않지만, Ajaxs 콜이 어떻게 완료되는지 실시간으로 확인할 수 있어 좋습니다(착신 크로스 참조).그리고 Ajax의 기본을 보여주는 매우 간단한 자기포함 스크립트입니다.
물론 서버 측에서 추가 제한이 발생하지 않는 것으로 가정합니다.
Firebug net 패널(또는 브라우저와 동등한 것)과 함께 사용하는 것이 좋습니다.

내 시험지를 썼어stackoverflow에서 코드를 테스트하고 정상적으로 동작하며 크롬/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);

갱신하다

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

브라우저가 같은 도메인에 동시 http 요청을 할 수 있는 최대 횟수는 사용자의 설정 및 브라우저에 따라 4~8회 정도라고 생각합니다.

다른 도메인으로 이동하도록 요청을 설정할 수 있습니다.이러한 도메인은 실행 가능할지 여부를 불문합니다.야후는 이 분야에 대해 많은 조사를 했는데, 그 내용은 여기서 보실 수 있습니다.추가하는 모든 새 도메인도 DNS 룩업이 필요합니다.YSlowguy는 병렬 요구와 DNS 검색 간에 적절한 타협을 이루기 위해 2~4개의 도메인을 권장합니다.단, 이는 후속 AJAX 요청이 아닌 페이지의 로딩 시간에 초점을 맞추고 있습니다.

왜 그렇게 많은 요청을 하시는지 여쭤봐도 될까요?브라우저가 요청 수를 동일한 도메인으로 제한하는 데는 충분한 이유가 있습니다.가능하면 번들링 요청을 하는 것이 좋습니다.

A http 2.0으로 이행하는 타당한 이유

http2.0에서는 호스트당 최대 연결 수는 사실상 무제한입니다.호스트별 접속 제한은 HTTP/2에서 증가합니까?

언급URL : https://stackoverflow.com/questions/561046/how-many-concurrent-ajax-xmlhttprequest-requests-are-allowed-in-popular-browse

반응형