>백엔드 개발 >PHP 튜토리얼 >면접관이 질문했습니다. TCP 연결은 몇 개의 HTTP 요청을 보낼 수 있습니까?

면접관이 질문했습니다. TCP 연결은 몇 개의 HTTP 요청을 보낼 수 있습니까?

藏色散人
藏色散人앞으로
2023-02-22 12:00:253832검색

다음과 같은 고전적인 인터뷰 질문이 있었습니다. 브라우저에 URL을 입력하고 페이지가 표시되는 과정에서 어떤 일이 발생합니까?

준비한 대부분의 학생들이 대답할 수 있다고 생각하지만 계속해서 질문한다면 수신된 HTML에 수십 개의 이미지 태그가 포함되어 있다면 어떤 방식으로, 어떤 순서로, 몇 개의 연결이 설정되는지, 어떤 프로토콜이 사용되는지 다운로드한 것은 어떻습니까?

면접관이 질문했습니다. TCP 연결은 몇 개의 HTTP 요청을 보낼 수 있습니까?

이 문제를 이해하려면 먼저 다음 다섯 가지 질문을 해결해야 합니다.

1. 서버와 TCP 연결을 설정한 후 HTTP 요청이 완료된 후 최신 브라우저의 연결이 끊어 집니까? 어떤 상황에서 연결이 끊어지나요?

2. 하나의 TCP 연결은 몇 개의 HTTP 요청에 대응할 수 있나요?

3. TCP 연결에서 HTTP 요청을 함께 보낼 수 있나요?(예: 요청 3개를 함께 보내고 응답 3개를 함께 수신)

4. 때때로 페이지를 새로 고칠 때 SSL 연결을 다시 설정할 필요가 없는 이유는 무엇입니까?

5. 브라우저에는 동일한 호스트가 설정하는 TCP 연결 수에 제한이 있나요?

첫 번째 질문

최신 브라우저는 서버와 TCP 연결을 설정한 후 HTTP 요청이 완료된 후 연결이 끊어지나요? 어떤 상황에서 연결이 끊어지나요?

HTTP/1.0에서는 서버가 HTTP 응답을 보낸 후 TCP 연결을 끊습니다. 그러나 각 요청은 TCP 연결을 다시 설정하고 연결을 끊기 때문에 비용이 너무 많이 듭니다. 따라서 표준에 설정되어 있지 않더라도 일부 서버에서는 Connection: keep-alive 헤더를 지원합니다. 즉, 이 HTTP 요청을 완료한 후에는 HTTP 요청에 사용되는 TCP 연결을 끊지 마십시오. 이것의 장점은 연결을 재사용할 수 있고 나중에 HTTP 요청을 보낼 때 TCP 연결을 다시 설정할 필요가 없다는 것입니다. 연결이 유지되면 SSL의 오버헤드도 피할 수 있습니다. 짧은 시간 안에 www.github을 두 번 방문했습니다. .com의 시간 통계:

면접관이 질문했습니다. TCP 연결은 몇 개의 HTTP 요청을 보낼 수 있습니까?

첫 번째 방문에는 초기 연결 및 SSL 오버헤드가 있습니다.

면접관이 질문했습니다. TCP 연결은 몇 개의 HTTP 요청을 보낼 수 있습니까?

초기 연결 및 SSL 오버헤드가 사라졌음을 나타냅니다. 동일한 TCP 연결이 사용됩니다.

지속적 연결: TCP가 유지되므로 연결의 이점이 너무 많습니다. HTTP/1.1은 연결 헤더를 표준에 작성했으며 요청에 연결: 닫기가 표시되지 않는 한 기본적으로 지속적인 연결을 활성화합니다. 브라우저와 서버 간의 TCP 연결은 일정 시간 동안 유지되며 요청이 완료되면 연결이 끊어집니다.

첫 번째 질문에 대한 대답은 다음과 같습니다. 기본적으로 TCP 연결이 설정되고 연결이 끊어지지 않습니다. 요청 헤더에 Connection: close를 선언하면 요청이 완료된 후 연결이 닫힙니다.

두 번째 질문

하나의 TCP 연결은 몇 개의 HTTP 요청에 대응할 수 있나요?

첫 번째 질문을 이해하면 이 질문에는 이미 답변이 있습니다. 연결이 유지되면 TCP 연결은 여러 HTTP 요청을 보낼 수 있습니다.

세 번째 질문

TCP 연결에서 HTTP 요청을 함께 보낼 수 있나요?(예를 들어 세 개의 요청을 함께 보내고 세 개의 응답을 함께 수신하는 경우)?

HTTP/1.1 문제가 있습니다. 단일 TCP 연결은 동시에 하나의 요청만 처리할 수 있습니다. 즉, 두 요청의 수명 주기는 처음부터 끝까지 동일할 수 없습니다. TCP 연결은 겹칠 수 없습니다.

HTTP/1.1 사양에서는 이 문제를 해결하기 위해 파이프라이닝을 지정하고 있지만 브라우저에서는 이 기능이 기본적으로 꺼져 있습니다.

먼저 파이프라이닝이 무엇인지 살펴보겠습니다. RFC 2616은 다음과 같이 규정합니다.

A client that supports persistent connections MAY "pipeline" its requests (i.e., send multiple requests without waiting for each response). A server MUST send its responses to those requests in the same order that the requests were received. 一个支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应)。收到请求的服务器必须按照请求收到的顺序发送响应。

표준이 이렇게 설정되는 이유는 대략적으로 한 가지 이유를 추측할 수 있습니다. HTTP/1.1은 텍스트 프로토콜이므로 반환되는 콘텐츠는 다음과 같습니다. 어떤 요청이 전송되는지 구별할 수 없으므로 순서가 일관되어야 합니다. 예를 들어, 서버에 두 개의 요청(GET/query?q=A 및 GET/query?q=B)을 보내고 서버가 두 개의 결과를 반환하는 경우 브라우저는 응답이 어떤 요청에 해당하는지 확인할 방법이 없습니다. 응답 결과.

파이프라이닝 이 아이디어는 좋아 보이지만 실제로는 많은 문제가 있습니다.

  • 일부 프록시 서버는 HTTP 파이프라이닝을 올바르게 처리할 수 없습니다.

  • 올바른 파이프라인 구현은 복잡합니다.

  • 헤드 오브 라인 차단: TCP 연결을 설정한 후 이 연결 중에 클라이언트가 서버에 여러 요청을 지속적으로 보낸다고 가정합니다. 표준에 따르면 서버는 요청이 수신된 순서대로 결과를 반환해야 합니다. 서버가 첫 번째 요청을 처리하는 데 많은 시간을 소비한다고 가정하면 모든 후속 요청은 응답하기 전에 첫 번째 요청이 완료될 때까지 기다려야 합니다. .

따라서 최신 브라우저는 기본적으로 HTTP 파이프라이닝을 활성화하지 않습니다.

그러나 HTTP2는 TCP 연결에서 여러 HTTP 요청을 동시에 완료할 수 있는 멀티플렉싱 기능을 제공합니다. 멀티플렉싱이 얼마나 정확하게 구현되는지는 또 다른 질문입니다. HTTP2 사용의 효과를 살펴볼 수 있습니다.

면접관이 질문했습니다. TCP 연결은 몇 개의 HTTP 요청을 보낼 수 있습니까?

녹색은 요청 시작부터 반환 요청까지의 대기 시간이고 파란색은 응답 다운로드 시간이며 모두 동일한 연결에서 병렬로 완료되는 것을 볼 수 있습니다

그래서 이 질문에도 답이 있습니다 : HTTP/1.1에는 동시에 여러 요청을 보낼 수 있는 Pipelining 기술이 있지만, 기본적으로 브라우저가 꺼져 있기 때문에 이는 불가능하다고 볼 수 있습니다. HTTP2의 멀티플렉싱 기능으로 인해 동일한 TCP 연결에서 여러 HTTP 요청을 병렬로 처리할 수 있습니다.

그렇다면 HTTP/1.1 시대에 브라우저는 어떻게 페이지 로딩 효율성을 향상시킬 수 있을까요? 두 가지 주요 사항이 있습니다.

  • 서버와 설정된 TCP 연결을 유지하고 동일한 연결에서 여러 요청을 순차적으로 처리합니다.

  • 서버와 다중 TCP 연결을 설정합니다.

네 번째 질문

때때로 페이지를 새로 고칠 때 SSL 연결을 다시 설정할 필요가 없는 이유는 무엇입니까?

첫 번째 질문에 대한 토론에서 이미 답변을 찾을 수 있습니다. TCP 연결은 때때로 브라우저와 서버에 의해 일정 기간 유지됩니다. TCP는 재설정할 필요가 없으며 SSL은 자연스럽게 이전 TCP를 사용하게 됩니다.

다섯 번째 질문

브라우저에는 동일한 호스트가 설정한 TCP 연결 수에 제한이 있나요?

당시에는 멀티플렉싱이 없었다고 가정해 보겠습니다. 수십 개의 이미지가 포함된 웹페이지를 받으면 브라우저는 어떻게 해야 할까요? 순차 다운로드를 위해 TCP 연결을 여는 것은 확실히 불가능합니다. 그렇지 않으면 사용자는 반드시 기다려야 합니다. 그러나 HTTP 요청을 보내기 위해 각 사진에 대해 TCP 연결이 열리면 컴퓨터나 서버가 이를 감당하지 못할 수도 있습니다. 1,000장의 사진이 있으면 1000개의 TCP 연결을 열 수 없으며, 컴퓨터가 NAT에 동의하더라도 동의하지 않을 수 있습니다.

그래서 대답은: 그렇습니다. Chrome은 동일한 호스트에 최대 6개의 TCP 연결을 허용합니다. 브라우저마다 약간의 차이가 있습니다.

developers.google.com/web/tools/ch...

다시 원래 질문으로 돌아가서, 수신된 HTML에 수십 개의 이미지 태그가 포함되어 있다면 이러한 이미지는 어떤 방식으로, 어떤 순서로 포함되어 있나요? 연결이 설정되었으며 이를 다운로드하는 데 어떤 프로토콜이 사용되었습니까?

이미지가 모두 HTTPS 연결이고 동일한 도메인 이름 아래에 있는 경우 브라우저는 SSL 핸드셰이크 후 서버와 HTTP2를 사용할 수 있는지 논의하고, 그렇다면 멀티플렉싱 기능을 사용하여 이 연결에서 멀티플렉싱을 수행합니다. 그러나 이 도메인 이름에 나열된 모든 리소스가 반드시 TCP 연결을 사용하여 얻어지는 것은 아니지만 멀티플렉싱이 사용될 가능성은 확실합니다.

HTTP2를 사용할 수 없다면 어떻게 해야 할까요? 또는 HTTPS를 사용할 수 없습니다(실제로는 HTTPS에 HTTP2가 구현되어 있으므로 HTTP/1.1만 사용할 수 있습니다). 브라우저는 호스트에서 여러 TCP 연결을 설정합니다. 연결 수의 최대 제한은 브라우저 설정에 따라 다릅니다. 모든 연결이 요청을 보내는 경우 브라우저는 이러한 연결을 사용하여 요청을 보냅니다. 그런 다음 다른 요청을 기다려야 합니다. #

위 내용은 면접관이 질문했습니다. TCP 연결은 몇 개의 HTTP 요청을 보낼 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제