나는 그것에 대해 생각해 본 적이 없지만 지금은 배후에 있는 몇 가지 기본적인 것들에 관심이 있습니다. 1) 웹 서버는 각 요청 후에 연결을 닫습니까? 2) 더 많은 브라우저 창이 열려 있고 일부 웹 서버의 모든 요청 데이터가 있으면 웹 서버는 어떤 연결이 무엇을 요청했는지 인식하기 위해 일종의 표준 소켓 통신을 사용합니까? 3) 무료 포트보다 사용자 수가 더 많으면 어떻게 될까요(예를 들어 66k가 동시에 무언가를 요청하는 경우)
감사해요 :)
답변1
- 요청이 사용하는 HTTP 버전에 따라 다릅니다. HTTP 1.0 연결은 서버가 사용자 에이전트로 응답 전송을 마치면 즉시 닫힙니다. HTTP1.1에는 사용자 에이전트에 응답이 반환된 후에도 소켓 연결을 열린 상태로 유지할 수 있는 keepalives에 대한 지원이 추가되었습니다. 이 경우 사용자 에이전트는 Connection: Keep-Alive HTTP 헤더를 전송하여 열린 연결을 유지하고 싶다는 뜻을 나타내며 더 많은 요청을 보낼 것임을 암시합니다.
- 예. 이것은 기본적인 소켓 기능입니다. 클라이언트는 사용되지 않는(일반적으로 높은) 로컬 포트에서 소켓을 열고 원격 호스트의 특정 대상 포트(예: HTTP의 경우 80)와의 연결을 열려고 시도합니다. 클라이언트가 생성하는 다른 모든 연결은 다른 포트에서 로컬 소켓을 열지만 여전히 원격 호스트의 동일한 포트에서 연결을 시도할 수 있습니다.
- 서버의 리스너 프로세스는 들어오는 여러 요청을 처리하기 위해 작업자 프로세스를 생성하므로 리스너는 들어오는 요청을 자유롭게 처리할 수 있습니다. 대부분의 http 서버에는 처리할 동시 요청 수를 제어하는 구성 옵션이 있습니다.
답변2
1) 일반적으로 각 페이지 요청은 하나의 연결 열기 및 닫기로 제한됩니다.
2) 컴퓨터는 요청할 때마다 소스 포트를 변경합니다. 서버는 IP/소스 포트 조합을 사용하여 어떤 요청이 어떤 호스트에서 왔는지 추적합니다.
3) 서버는 포트 80에서 모든 HTTP 요청에 응답하고 있습니다. 그러나 클라이언트의 경우, 정확히 동시에 1개의 클라이언트에서 66K 요청을 생성할 수 있다면 문제가 발생할 수 있는지 확실하지 않습니다.
답변3
1) Keepalive는 대부분의 최신 웹 서버에서 지원되므로 브라우저가 이를 지원하는 경우 웹 서버는 연결당 하나 이상의 요청을 받아들입니다.
http://en.wikipedia.org/wiki/HTTP_pertant_connection
2) 예, 각 연결은 IP:PORT 쌍인 자체 소켓을 갖습니다.
http://en.wikipedia.org/wiki/TCP_sockets
3) 단일 서버에서 동시에 요청하는 사람이 65,535명이라면 한발 물러서서 자신이 하고 있는 일이 무엇인지 생각해 볼 필요가 있습니다! :) 정말로 운이 좋지 않다면 이 문제에 도달하기 전에 로드 밸런싱이 필요하다고 느낄 것입니다. 더 빨리 발생할 수 있는 문제는 파일 설명자가 부족하다는 것입니다. Bash의 기본값은 1024입니다(Bash 맨페이지의 "ulimit" 참조).