Firefox와 같은 여러 탭을 지원하는 웹 브라우저에서 다른 웹 사이트 도메인으로 이동하는 다른 탭은 각 도메인에 대해 전용 포트를 사용합니까?
또는 브라우저가 모든 탭과 모든 도메인을 관리하기 위해 단일 포트를 사용합니까?
Firefox와 같은 여러 탭을 지원하는 웹 브라우저에서 다른 웹 사이트 도메인으로 이동하는 다른 탭은 각 도메인에 대해 전용 포트를 사용합니까?
또는 브라우저가 모든 탭과 모든 도메인을 관리하기 위해 단일 포트를 사용합니까?
답변:
예, 그렇습니다.
다음은 Windows 7에서 현재 Firefox 연결 (9 개의 열린 탭이 있음)을 보여주는 예입니다.
노트:
로컬 포트가 모두 다르다는 것을 알 수 있습니다.
원격 포트는 일반적으로 80 (HTTP), 443 (HTTPS) 또는 8080 (HTTP Alternate)입니다.
HTTP
에 TCP 및 UDP 포트 번호 목록 중 일부.웹 페이지를 렌더링하는 전체 프로세스는 아래에 설명되어 있습니다. 특히 5, 6, 13 및 15 단계 (굵게 표시됨)를 참조하십시오.
일반적으로 단일 웹 페이지를 렌더링 할 때는 여러 개의 연결을 사용하지만 모두 동일한 원격 주소로 연결되는 것은 아닙니다.
웹 페이지에는 종종 다른 곳에서 호스팅되는 리소스 (자바 스크립트 파일 등)가 포함되기 때문입니다.
동일한 웹 사이트 (예 : stackoverflow.com) 에 대한 여러 연결 에는 다른 로컬 포트가 있습니다 (다른 페이지를 렌더링하는 다른 탭에서 별도의 연결이기 때문에).
노트 :
웹을 서핑 할 때 어떤 일이 일어날 지 생각해 본 적이 있습니까? 보이는 것처럼 간단하지 않습니다.
- 선호하는 브라우저에서 주소 표시 줄에 URL을 입력합니다.
- 브라우저는 URL을 구문 분석하여 프로토콜, 호스트, 포트 및 경로를 찾습니다.
- HTTP 요청 (프로토콜 일 가능성이 가장 높음)을 형성합니다.
- 호스트에 도달하려면 먼저 사람이 읽을 수있는 호스트를 IP 번호로 변환해야하며 호스트에서 DNS 조회를 수행하여이를 수행합니다.
- 그런 다음 사용자 컴퓨터에서 지정된 포트 (대부분 포트 80)의 해당 IP 번호로 소켓을 열어야합니다.
- 연결이 열리면 HTTP 요청이 호스트로 전송됩니다
- 호스트는 지정된 포트에서 수신 대기하도록 구성된 서버 소프트웨어 (대부분 Apache)에 요청을 전달합니다.
- 서버는 요청을 검사하고 (대부분의 경로 만) 요청을 처리하는 데 필요한 서버 플러그인을 시작합니다 (사용하는 서버 언어, PHP, Java, .NET, Python?에 해당)?
- 플러그인은 전체 요청에 액세스하고 HTTP 응답 준비를 시작합니다.
- 응답을 구성하기 위해 데이터베이스에 액세스 할 가능성이 높습니다. 요청의 경로 (또는 데이터)에있는 매개 변수를 기반으로 데이터베이스를 검색합니다.
- 플러그인이 추가하기로 결정한 다른 정보와 함께 데이터베이스의 데이터는 긴 텍스트 문자열 (아마도 HTML)로 결합됩니다.
- 플러그인은 해당 데이터를 일부 메타 데이터 (HTTP 헤더 형식)와 결합하고 HTTP 응답을 브라우저로 다시 보냅니다.
- 브라우저는 응답을 받고 응답에서 HTML (95 % 확률로 깨짐)을 구문 분석합니다.
- DOM 트리는 깨진 HTML로 만들어졌습니다.
- HTML 소스에있는 각각의 새 자원 (일반적으로 이미지, 스타일 시트 및 JavaScript 파일)에 대해 서버에 새 요청이 작성됩니다. 3 단계로 돌아가서 각 자원에 대해 반복하십시오.
- 스타일 시트가 구문 분석되고 각각의 렌더링 정보가 DOM 트리에서 일치하는 노드에 첨부됩니다.
- 자바 스크립트가 파싱 및 실행되고 DOM 노드가 이동하고 스타일 정보가 그에 따라 업데이트됩니다.
- 브라우저는 DOM 트리 및 각 노드의 스타일 정보에 따라 화면에 페이지를 렌더링합니다.
- 화면에 페이지가 나타납니다
- 전체 프로세스가 너무 느려서 짜증이납니다.
웹 사이트에 대한 각 연결은 일반 HTTP의 경우 기본 대상 TCP 포트 80, HTTPS의 경우 443 인 다른 소켓을 사용합니다. 소켓이 고유하려면 소스 IP 주소, 소스 TCP 포트, 대상 IP 주소 및 대상 TCP 포트의 조합이 달라야합니다.
동일한 컴퓨터에서 동일한 웹 사이트에 여러 개의 연결이있는 경우 (웹 사이트에서 하나의 IP 주소 만 사용한다고 가정) 다른 소스 TCP 포트를 사용해야합니다. 이러한 방식으로 각 연결은 고유합니다.
그러나 HTTP 1.1부터는 모든 연결이 지정된 기간 동안 지속됩니다 (달리 선언되지 않는 한). 즉, 동일한 웹 사이트에서 여러 리소스 (예 : css / js 파일)를 요청하면 브라우저에서 동일한 연결을 다시 사용할 수 있습니다. 브라우저에 동일한 웹 사이트의 인스턴스가 여러 개인 경우에도 마찬가지입니다.
Windows에있는 경우 netstat -no -p TCP
명령은 브라우저의 소켓을 포함하여 모든 활성 TCP 소켓 및 해당 프로세스 ID를 표시합니다.
유닉스 / 리눅스 (이 경우 데비안)를 사용하는 경우 netstat -ntp
또는 ss -t
명령을 사용할 수 있습니다 .
netstat -n
Linux 및 Mac OS를 포함한 대부분의 운영 체제에서 작동합니다.
netstat -n -o
어떤 프로세스가 어떤 연결을 생성했는지 확인할 수 있습니다 . 또는 SysInternal의 tcpview 를 실행 하여 프로세스 이름 및 아이콘과 함께 GUI에서 목록을 볼 수 있습니다 .
다른 웹 사이트에 대한 탭과 관련하여 튜플 {로컬 IP, 로컬 포트, 대상 IP, 대상 포트} 가 고유 한 한 TCP에는 로컬 포트가 달라야 할 것이 없습니다 . 동일한 웹 사이트에 대한 탭의 경우 상황이 훨씬 복잡합니다.
다른 클라이언트 소프트웨어와 마찬가지로 브라우저는 동일한 대상에 대한 발신 연결마다 다른 로컬 포트를 사용합니다. 일반적으로 이미지, CSS, JavaScript 등과 같은 임베드 된 자원을 가져 오기 위해 특정 웹 사이트에 대한 다중 연결을 형성합니다. 또한 재사용을 위해 해당 연결을 풀링합니다.
그것은 동일한 웹 사이트에 다른 탭은 별개의 사용 여부를 말할 수 없습니다 , 연결 (A) 일반적으로 탭 당 하나의 연결이 어쨌든 없기 때문에, 그리고 (b) 타이밍 및 인증에 따라 연결이 될 수있다 탭 사이에서 재사용 연결을 식별 할 수 없으므로 로컬 포트를 식별 할 수도 없습니다.
먼저, 브라우저는 연결에 다음 전략 중 하나를 사용할 수 있습니다.
연결 풀을 사용하고 연결을 다시 사용하는 것이 합리적인 가정이지만 브라우저에서 어떤 전략을 사용할지 알 수있는 방법이 없습니다.
둘째, TCP 작동 방식에 따라 모든 연결에 대한 소스 포트와 대상 포트가 있습니다. 소스와 대상 주소 / 포트 쌍이 연결을 정의합니다.
항상 [1] 용도 공지 (그것의 광고 된 어드레스에서 수신 된) 서버에 연결하도록 포트 (예컨대 80 또는 443)를, 그러나 다른 포트는 임의로 선택된다. 따라서 어느 쪽에서 연결을 보느냐에 따라 하나 또는 여러 개의 가능한 포트가 있습니다.
따라서 동일한 탭은 끝에 여러 개의 다른 포트를 사용할 수 있지만 일반적으로 다른 탭 이있을 수 있습니다 (연결이 풀링되고 다른 탭의 다른 리소스가 동일한 서버에서로드 된 경우) 동일한 포트를 사용할 수 있습니다.
이 질문 에는 "보통"의 경우 발신이 명시 적으로 언급 되어 있으므로 포트 번호는 포트가 어느 탭에 있는지 또는 두 개의 가능한 포트 (80 및 443) 중 하나에 관계없이 동일합니다. 물론 URL에 다른 포트 (예 : 8080)를 명시 적으로 요청할 수 있습니다. 그래도 드물다.