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


358

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

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

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

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


상황에 대해 생각할 때, 원격 호스를 ping하여 작동 여부를 확인하는 것은 무엇입니까? 이것은 귀하의 질문에 대답하지는 않지만 더 나은 워크 플로우 일 수 있습니다.
Bob

1
고마워 Bob,이 문제를 해결하려고 계획 한 두 가지 방법 중 하나입니다. 질문에서 언급하는 것을 고려했지만 주제가 맞지 않다고 결정했습니다. (또 다른 방법은 제가 ssh를 요청 시간 초과 제어하는 서버를하는 것입니다.)
마이클 GUNDLACH

1
나는 당신이 거의 대답을 가지고 있다고 생각합니다 ... Safari와 Chrome을 2 이상으로 지원하는 것이 안전하다는 것보다 안전합니다. 따라서 항상 2를 가정 할 수 있습니다.
Rex M

1
Windows Vista에서 Chrome 2.0.172.28을 사용하면 6 개의 동시 연결이 가능합니다.
Callum

2
방금이 페이지 stevesouders.com/blog/2008/03/20/… 을 찾았 습니다. 여기에 몇 가지 더 많은 숫자와 토론이 있습니다.
David Johnstone

답변:


143

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

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


4
아니요, 도메인에 제한이 적용됩니다. 따라서 사이트 외에 하위 도메인이있는 경우 기술적으로 최대 12 개의 연결을 얻을 수 있습니다.
Bob

1
따라서 귀하를 이해하면 FF 는 단일 도메인으로의 XmlHttpRequests뿐만 아니라 모든 요청 (단일 도메인으로)을 6으로 제한 합니다. 그리고 다른 브라우저는 다른 제한으로 동일한 작업을 수행합니다. 옳은?
Michael Gundlach

1
네, 천 개의 이미지가있는 페이지가 있으면 6 개 그룹으로 다운로드됩니다. 대부분의 다른 주류 브라우저는 동일한 방식으로 작동한다고 생각합니다.
Bob

7
와. 이것은 좋은 트릭입니다. 또한지도 엔진 용 타일 서버가 여러 가지 가짜 하위 도메인 (일반적으로 maps1.whatever.com, maps2.whatever.com, maps3.whatever.com)을 생성하여 사물을 가속화하는 이유를 설명합니다.
meawoppl

2
@AMember, 브라우저는 항상 허용되는 최대 동시 아약스 수를 병렬로 유지합니다. 활동을보고 싶다면 아래 답변을 시도해보십시오
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

23
그럼에도 불구하고 이것은이 문제와 관련하여 알아야 할 매우 유용한 것입니다. 아마도 답변보다 의견에 더 잘 게시되었을 것입니까?
JD Smith

7

방금 www.browserscope.org 와 IE9 및 Chrome 24를 사용하여 단일 도메인에 6 개의 동시 연결을 할 수 있으며 최대 17에서 여러 도메인에 연결할 수 있습니다.


6

IE 9 에 따르면 – 변경된 사항은 무엇입니까? HttpWatch 블로그에서 IE9는 VPN을 통한 연결 제한이 여전히 2입니다.

VPN 스틸 클로버 IE 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>

편집 :
r은 행과 w 대기 시간을 의미합니다.
시작 버튼 80 (또는 다른 수)의 동시 아약스 요청을 처음 누르면 자바 스크립트에 의해 시작되지만 알려진 바와 같이 브라우저에 의해 스풀링됩니다. 또한 서버에 병렬로 요청됩니다 (특정 수로 제한됩니다.이 질문의 사실입니다). 여기서 요청은 임의 지연 (w에 의해 설정 됨)으로 서버 측에서 해결됩니다. 시작 시간에 모든 아약스 호출을 해결하는 데 필요한 모든 시간이 계산됩니다. 테스트가 완료되면 전체 시간의 절반, 3 분의 1, 4 분의 1 등이 소요되어 서버 호출에 대한 병렬 처리가 차감되는지 확인할 수 있습니다. 이것은 엄격하거나 정확하지는 않지만 실시간으로 ajaxs 호출이 어떻게 완료되는지 확인하는 것이 좋습니다 (수신 크로스 참조). 그리고 아약스 기본을 보여주는 매우 간단한 자체 포함 스크립트입니다.
물론 이것은 서버 측에 추가 제한이없는 것으로 가정합니다.
Firebug Net Panel (또는 브라우저와 동등한 기능)과 함께 사용하는 것이 좋습니다.


FF3은 최대 6 개의 동시 요청을 시작합니다.
Luis Siquot

여기서 무엇을했는지 설명해 주시겠습니까? r과 w는 무엇입니까? 결과를 분석 인쇄 화면이 많이 주시면 감사하겠습니다
Royi Namir을

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 변경 이벤트를 트리거 할 수있는 대부분의 웹 사이트에서 작동합니다. (일명 : 플러싱)

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


그것은 내 19에 말한다, 깨진?
PauAI

파이어 폭스 개발자 에디션 57.0b12 2. 말한다
AnthonyB

0

브라우저가 동일한 도메인에 대해 최대 동시 HTTP 요청 수가 있다고 생각합니다. 사용자 설정 및 브라우저에 따라 4-8 개의 요청 순서입니다.

다른 도메인으로 이동하도록 요청을 설정할 수 있으며 이는 가능하거나 불가능할 수 있습니다. 야후 사람들은이 분야에 대해 많은 연구를했으며, 여기에서 읽을 수 있습니다 . 추가하는 모든 새 도메인에도 DNS 조회가 필요합니다. YSlow 녀석은 병렬 요청과 DNS 조회 사이의 좋은 타협을 달성하기 위해 2-4 도메인 사이를 권장하지만, 이는 후속 AJAX 요청이 아니라 페이지의 로딩 시간에 초점을 맞추고 있습니다.

왜 그렇게 많은 요청을하고 싶은지 물어봐도 될까요? 브라우저가 동일한 도메인에 대한 요청 수를 제한하는 데에는 충분한 이유가 있습니다. 가능한 경우 번들링 요청을 사용하는 것이 좋습니다.


1
동일한 원본 정책으로 인해 XmlHttpRequests가 제안한대로 다른 도메인으로 이동할 수 없습니다. (아마도 이것은이 문제를 해결하기 위해 jsonp를 사용하는 주장 일 것입니다.)이 페이지는 많은 컴퓨터에 대한 명령 및 제어 대시 보드입니다. 따라서 요청은 사용자가 요청한 실행마다 생성됩니다.
Michael Gundlach
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.