본문 바로가기
잡다한 문제 해결

한 프로세스가 여러 개의 포트와 동시연결될 수 있을까?

by cuziam 2023. 6. 9.

TCP 연결을 만지작 거리다가 생긴 의문이다.
 
과거에 대학교에서 컴퓨터 네트워크를 배울 때, 교수님이 가르쳐주신 게 있다.
1. 트랜스포트 레이어는 ‘호스트들이 실행하는 프로세스와 프로세스를 논리적으로 연결하는 레이어’이다.
2. 네트워크 레이어가 호스트와 호스트를 연결한다면, 트랜스포트 레이어는 호스트에서 실행되는 프로세스들을 서로 연결해주는 기능을 한다.
3. 두 호스트의 프로세스가 각각 연결되고, 이 프로세스들은 다른 프로세스와 동시에 연결될 수는 없다.
 
이 말을 인터넷에 적용시켜보자. 인터넷은 네트워크 레이어로 IP를 사용하고, 트랜스포트 레이어에 TCP를 사용한다. 데이터 패킷이 IP(네트워크 레이어)에 의해 컴퓨터(호스트)에 전달되면, 그 패킷들을 컴퓨터 내의 프로세스에 분배하는 일은 TCP가 담당한다.
 
한편 TCP에선 패킷들을 분배하기 위해 프로세스 별로 포트번호를 부여한다. 예를 들면, 컴퓨터A의 프로세스1와 컴퓨터B의 프로세스2가 서로 연결되기 위해서는 고유의 ‘포트 번호’를 사용해야한다. 프로세스1과 프로세스2가 연결되면 이 두 프로세스들은 제 3의 프로세스와 동시연결할 수 없다.


 

동일 ip를 가진 원격 포트 하나에 여러 개의 로컬포트가 한 번에 연결되어 있는 것처럼 보인다.

근데 갑자기 의문이 들었다. 웹 서버에서 HTTPS를 사용하는 프로세스는 거의 443번 포트를 이용해서 연결을 받는 것으로 알고있다. 근데 원칙적으로 서버의 443번 포트는 클라이언트의 한 프로세스와 접속하고 있어야 한다. 하지만 실제로 리소스 모니터에 들어가서 보면, 서버의 443번 포트는 여러 개의 클라이언트 포트와 동시 접속하고 있는 것 처럼 보인다. 이게 어떻게 가능할까?
https://stackoverflow.com/questions/1694144/can-two-applications-listen-to-the-same-port

Can two applications listen to the same port?

Can two applications on the same machine bind to the same port and IP address? Taking it a step further, can one app listen to requests coming from a certain IP and the other to another remote IP? I

stackoverflow.com

https://jongmin92.github.io/2019/02/28/Java/java-with-non-blocking-io/

멀티플렉싱 기반의 다중 접속 서버로 가기까지

소켓이란?소켓은 네트워크 상에서 서버와 클라이언트 두개의 프로그램이 특정 포트를 통해 양방향 통신이 가능하도록 만들어주는 추상화된 장치입니다. 메모리의 유저 공간에 존재하는 프로세

jongmin92.github.io

위 링크들에서 해답을 찾았다. 일단 결론만 말하자면, 1process 1port 1connection라는 원칙은 반드시 지켜진다. 다만 멀티 플렉싱 서버 모델로 이루어진 서버에선 하나의 소켓으로 클라이언트의 여러 접속을 한 번에 받아들일 수 있다.
 
좀 더 정확히 말하면 서버 프로세스는 하나의 소켓으로 여러 클라이언트의 연결을 번갈아가며 받아들일 수 있다. 그렇게 함으로써 다수 클라이언트와 접속할 때 충돌을 유연하게 피하는 것이다.
 
충돌을 피하기 위해서 멀티 프로세스 서버 혹은 멀티 스레드 서버를 구현하는 경우도 많지만, 이 방식의 경우 데이터에 대한 오버헤드가 접속 수에 비례해서 커진다는 단점이 생긴다. 또한 포트 수는 0~65565로 한정되어 있으므로, 한 번에 처리할 수 있는 접속의 수도 한계가 있다. 따라서 서버의 경우 시스템 자원을 병렬적으로 처리할 수 있는 멀티플렉싱 기법을 사용하는 경우가 많다고 한다.
 
결론: 서버의 한 프로세스는 클라이언트의 여러 포트들과 동시에 연결할 수는 없다. 하지만 충돌을 방지하는 선에서 여러 포트를 번갈아가며 사용할 수는 있다.
 
+충돌을 어떻게 방지하는 지는 위에 첨부한 링크에서 두 번재 참고. 네트워크 연결에서 흔히 쓰는 기법이다.