2011-09-05 2 views
9

Firefox를 사용하고 있지만 브라우저에서 일반적으로 어떻게 결정하는지 알고 싶습니다.브라우저가 여러 요청에 대해 TCP 연결을 다시 사용하려고 할 때 어떤 상황입니까?

짧은 시간 내에 동일한 URL에 두 번 액세스하면 브라우저가 두 요청에 대해 동일한 TCP 연결을 다시 사용하려고 시도합니다 (이것을 keep-alive라고 함). 그러나 두 개의 다른 URL에 액세스 할 때 (은 여전히 ​​동일한 서버) 브라우저 은 각 요청에 대해 새 연결을 열어보기로 결정합니다. 분명히 브라우저는 URL 당 1 연결 정책을 사용하지 않습니다.

긴 폴링을 사용하는 웹 서비스를 구현하려고하기 때문에이 질문을하고 있습니다. 사용자가 동일한 브라우저의 여러 탭에서이 서비스를 열어 볼 수도 있습니다. 그러나 keep-alive를 사용하면 두 번째 긴 폴링 요청은 브라우저가 두 소켓을 모두 같은 소켓에 밀어 넣으려고하기 때문에 첫 번째 포트가 완료 될 때까지 전송되지 않습니다 (Firefox에서 적어도). 서비스를 설계했습니다. 브라우저가 파이프 라이닝을 구현한다고하더라도 HTTP가 첫 번째 요청에 응답하기 전에 두 번째 요청에 응답 할 수있는 방법이 없습니다. HTTP에서 순서대로 응답을 완료해야하기 때문입니다.

답변

6

HTTP/1.1을 사용하는 경우 기본적으로 TCP 연결은 다시 사용할 수 있도록 열어 둡니다. 이는 요청 당 새 연결을 시작하는 것보다 나은 성능을 발휘하기위한 것입니다. 연결은 재사용 될 수 있습니다 그러나 연결은 언제든지 당사자 중 하나에 의해 종료 될 수 있습니다.

HTTP1.1과 영구 연결 부분을 읽어야합니다.

귀하의 경우에는 첫 번째 응답 후 다음 요청이 으로 전송되기 때문에 HTTP 파이프 라이닝 (광범위하게 지원되지 않음)을 사용하지 않고 있습니다.

브라우저에 연결 풀이 있고 호스트 이름별로 다시 사용합니다. 일반적으로 브라우저는 여러 호스트 이름에 대해 단일 연결을 재사용하지 않아야합니다. 호스트 이름이 실제로 동일한 IP 주소로 확인 되더라도 말입니다.

대부분의 브라우저에서 사용자는 서버 당 영구 연결 수를 구성하거나 무시할 수 있습니다. 대부분의 최신 브라우저는 기본적으로 6입니다. 파이어 폭스가 이라면 실제로는 이미 연결이 활성화되어 있기 때문에 두 번째 요청을 차단하는 것이입니다. 이것은 Firefox의 버그이며 버그 추적 시스템에 보관해야합니다. 그러나 그러한 버그가 존재한다면 많은 사이트가 손상된 것을 볼 수있을 것입니다.

+0

파이어 폭스에 서버에 두 번째 요청을 보내지 만 첫 번째 요청이 끝날 때까지 기다려서 연결을 다시 사용할 수 있기 때문에 실제로 요청을 보내지 않는다고 생각합니다. 이것은 기능이 아니라 버그입니다. – Mark

+0

아마도 동일한 URL의 경우 동일한 연결을 사용하려고 시도하지만 URL의 경우 풀의 다른 연결을 선택하려고합니까? – Mark

+0

테스트가 2 개의 동시 HTTP 요청을 동일한 URL로 보내면 "직렬화"되거나 2 개의 다른 TCP 연결을 통해 보낼 수 있습니다. 하지만 파이프 라인을 보지 못하고 있습니다. 어떻게 될지, 구현에 따라 달라집니다. 브라우저는 풀에서 연결을 재사용하거나 새로운 연결을 통해 두 번째 요청을 보낼 수 있습니다. 두 접근법은 HTTP가'stateless' 프로토콜이기 때문에 정확합니다. 구현 내용이 이러한 세부 사항에 달려 있다면 IMHO가 있습니다. 디자인에 결함이 있습니다. 달성하고자하는 것에 대해 더 많이 작성해야 할 수도 있습니다. – Cratylus