포트 이해 : 여러 브라우저 탭이 동시에 통신하는 방법은 무엇입니까? [닫은]


18

나는 오늘 포트 통신이 어떻게 작동하는지 근본적으로 이해하지 못한다는 것을 깨달았습니다.

포트 80에서 수신 대기하는 웹 서버 인스턴스를 실행하면 포트 80을 통해 통신하는 다양한 브라우저 탭의 많은 요청에 응답 할 수 있습니다.

그러나 포트 충돌로 인해 포트 80에서 수신 대기하는 두 개의 서버 인스턴스를 시작할 수 없습니다.

나는 이것을 실제로 생각하지 않고 항상 주어진 것으로 간주했습니다 (항상 하나의 프로세스 만 특정 시간에 특정 포트에 바인딩 할 수 있습니다)-여러 프로세스가 포트 80에서 통신하지 않습니까? (예 : 브라우저에서 실행중인 각 탭?)

답변:


24

기본적으로 한 번에 하나의 프로세스 만 포트에서 청취 할 수 있습니다 (기술적으로는 하나의 소켓이 청취 전용). 그러나 포트는 데이터를 전송하는 많은 소켓을 처리 할 수 ​​있으며 소켓은 로컬 IP / 포트와 원격 IP 주소 / 원격 포트의 조합입니다. 이런 식으로, 서버가 LISTENing하는 동안 들어오는 연결을 수락하면 해당 대화 전용의 새 소켓을 열고 처리를 다른 것으로 전달한 다음 LISTENing으로 돌아갑니다.

자세한 내용은 여기를 참조하십시오 .


실제로 동일한 포트에서 여러 프로세스를 수신 대기 할 수 있습니다. 예를 들어 여러 udp 판독기를 사용하면 커널 수준에서로드 밸런싱을 수행 할 수 있습니다. 먼저 청취를 위해 소켓을 연 다음 분기하고 recv()각 프로세스에서 시도하십시오 .
viraptor

5
@viraptor : 사실이지만 UDP는 연결이 없기 때문에 실제로 "듣기"와 "받기"사이에는 차이가 없습니다.
Adam Robinson

TCP와 동일한 아이디어가 작동하며 청취 소켓과 accepting ()이있는 프로세스를 분기합니다.
viraptor

실제로 소켓 은 통신을위한 하나의 "종점"입니다. 연결된 소켓 이 로컬 IP / 포트와 원격 IP / 주소 / 원격 포트의 조합 이라는 것을 의미한다고 생각합니다 . socket 이라는 단어 가 너무 자주 사용되어 실제 설명이 무엇인지 알아 내기가 어려웠습니다.
westoque

14

브라우저는 컴퓨터의 임의의 높은 (예 :> 1024) 포트에서 원격 서버의 포트 80에 연결됩니다. 따라서 컴퓨터에서 포트 충돌이 없습니다.

많은 탭을 사용하여 동일한 원격 서버에 연결하는 경우 (또는 서버에 연결하는 사용자가 많은 경우) 모두 동일한 포트로 이동하여 동일한 프로세스 (예 : 사이트의 웹 서버)에 의해 서비스됩니다.


2
이것이 정답입니다. TCP 연결의 양쪽 끝에 포트 번호가 있습니다. 관련된 두 컴퓨터는 연결 웹 사이트 : 80 <-> browser : 12397과 다른 연결 웹 사이트 : 80 <-> browser : 22958을 구별 할 수 있습니다.
pjc50

7

포트 80에서 수신 대기하는 서버는 여러 프로세스를 처리 할 수 ​​없습니다. 더 오랜 세월의 간단한 TCP 데몬은 한 번에 하나의 연결 만 처리 할 수있었습니다. netcat특정 포트에서 수신 대기하는 것과 같은 프로그램을 사용하여이 동작을 에뮬레이트 하고 두 대의 컴퓨터를 연결하려고 시도 할 수 있습니다. 하나는 들어오고, 다른 하나는 연결하지 않고 튀어 나옵니다. 이 데몬은 대부분 쓸모가 없으므로 더 이상 볼 수 없습니다.

웹 서버와 같은 것은 포트에서 직접 듣고 있습니다. 명심해야 할 것은 운영 체제의 소켓 라이브러리 위에 있다는 것입니다. 새로운 연결이 이루어지면 소켓 라이브러리는 새로운 소켓을 웹 서버 소프트웨어로 전달합니다. 이때 웹 서버 소프트웨어에는 몇 가지 옵션이 있습니다.

한 가지 가능성은 동일한 프로세스에서 소켓 객체를 새 스레드로 전달하는 것입니다. 이 소켓을 통해 통신 할 때마다이 스레드가 처리합니다. 부모 프로세스는 주어진 시간에 어떤 스레드가 활성화되어 있는지를 중재합니다.

또 다른 가능성은 새로운 프로세스를 시작하고 소켓 객체를 프로세스로 전달한다는 것입니다. 내가 이해하는 것처럼, 이제는 이러한 자식 프로세스와 대상 간의 통신을 중재하는 운영 체제의 소켓 시스템에 달려 있습니다. 상위 프로세스는 여전히 중단 된 프로세스 종료 및 다른 프로세스 간 통신과 같은 프로세스를 제어 할 수 있습니다.

이 중 더 효율적인 방법은 운영 체제에 따라 다릅니다. IIRC, Apache는 어느 모드에서나 실행할 수 있습니다.

본질적으로 소켓 라이브러리는 웹 서버에 병렬 처리 수준을 제공합니다. 새로운 연결을 수락하면서 동시에 데이터를 전송하는 여러 개의 동시 연결을 처리 할 수 ​​있습니다.

로드 시간을 향상시키기 위해 웹 서버에 여러 번 연결을 시도 할 수있는 브라우저의 경우 브라우저 쪽에도 병렬 처리가 적용됩니다. 이는 훌륭하고 훌륭한 것입니다. 브라우저는 페이지가로드 될 때 페이지 상태를 추적하며, 여러 번의 연결 시도는 프로세스의 일부입니다.


여러 가지 방법으로 옳은 것에 대해 +1 :)
Michael Lowman

2

효과적으로, 스트림 소켓에는 두 가지 "유형"이 있습니다. 하나에는 와일드 카드 "다른 쪽 끝"이 있고 다른 쪽 끝에는 특정 호스트 : 포트가 있습니다.

두 개의 소켓이 동일한 "this end"와 "other end"식별자를 가질 수는 없습니다. "들어오는"소켓 (수신 연결 허용)은 와일드 카드 "다른 쪽 끝"이있는 소켓이므로 한 번에 하나씩 만 존재할 수 있습니다. 연결이 도착하면, accept다른 쪽 끝을위한 호스트 : 포트 튜플이있는 소켓을 반환하면서 연결 이 완료됩니다.


1

귀하의 질문은 Cisco CCNA보다 몇 년 전에 나 자신을 상기시킵니다.

먼저, 여러 개의 HTTP 연결을 설정한다고해서 반드시 브라우저에서 연 탭 수와 관련이있는 것은 아닙니다. 예를 들어 광고 또는 Google 웹 로그 분석 코드가 포함 된 사이트를 방문하면 하나의 탭에만 있음에도 불구하고 여러 사이트에 연결됩니다.

어쨌든 브라우저가 웹 서버와 통신 할 때 웹 서버로 전송되는 트래픽의 대상 포트는 포트 80이고 소스 포트는 임의의 숫자입니다. 소스 포트는 웹 서버가 사용자에게 다시 통신해야하는 포트를 알려주는 것입니다. http로 설정된 각 연결에는 컴퓨터에서 자체 포트가 열려 있습니다. 몇 개의 웹 사이트를 열어 둔 상태에서 netstat를 실행하면 즉시 무슨 뜻인지 알 수 있습니다.

당신은 웃을지도 모르지만 책은 TCP / IP의 기초를 얻는 훌륭한 방법입니다. 그것은 많은 도움이되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.