본문 바로가기

네트워크/개념

[Network] - 소켓에 동일한 포트 번호 할당

소켓 프로그래밍 공부를 하면서 매우 헷갈리는 것이 있다.

 

 

문제 - 소켓에는 동일한 포트번호를 할당 가능한가?

 

 

현재 읽고 있는 책에서는 불가능하다고 한다.

그 이유인 즉슨, 포트 번호는 하나의 운영체제 안에서 소켓을 구분하는 목적으로 

사용되기 때문에 하나의 운영체제 내에서 동일한 퐅트번호를 둘 이상의 소켓에 할당 할 수 없기 때문이다.

 

 

데이터 전송 시에 동일한 포트번호를 사용하는 소켓이 둘 이상 존재하면 데이터를 어느 소켓을 통해 송신을

할지 운영체제 로서는 알 길이 없기 때문이다.

 

 

확실히 맞는 말이다. 그러나 문제는 이게 아니다.

소켓과 포트에 대해 알아보기 위해 구글에 검색을 하면 이런 글들도 많다.

 

일반적으로 동일한 포트에서 수십 수만개의 소켓을 생성 할 수 있기때문에

서버에서는 매우 많은 수의 클라이언트가 접속 하더라도 손쉽게 처리 가능하다.

 

 

이 말도 맞는 말 같다.

근데 여기서 문제가 발생한다.

 

 

문제 - 그래서 동일한 포트에 소켓을 여러개 생성할 수 있다는 것인가?

 

 

이 궁금증을 해결하기 위해 구글에 아무리 검색을 해봐도 명쾌한 해답이 안나온다.

각각의 관점에서 보면 이해가 되나, 이 둘은 분명히 모순된다.

하지만 그 어떤 사이트, 블로그에도 이에대해 명확히 정리를 안해준다. 진짜 돌아버리는줄 알았다.

 

 

 

결론은 둘다 맞는 말이다.

https://stackoverflow.com/questions/11129212/tcp-can-two-different-sockets-share-a-port

 

TCP: can two different sockets share a port?

This might be a very basic question but it confuses me. Can two different connected sockets share a port? I'm writing an application server that should be able to handle more than 100k concurrent

stackoverflow.com

 

 

 

스택 오버플로에 이미 나와 같은 고민을 가진 사람들이 꽤 있었나 보다.

답변이 꽤 많이 달렸는데, 날 이해 시켜준 것은 Jeremy Friesner 라는 사람이 작성한 답변이었다.

 

 

That's a common intuition, but it's incorrect. A connected socket is not assigned to a new/dedicated port. The only actual constraint that the TCP stack must satisfy is that the tuple of (local_address, local_port, remote_address, remote_port) must be unique for each socket connection. Thus the server can have many TCP sockets using the same local port, as long as each of the sockets on the port is connected to a different remote location.

 

 

나름대로 이해를 해보자면. 서버는 한개의 리스닝 소켓을 이용해서 수신 대기를 하고, 클라이언트 접속이 들어올 때마다 새로운 소켓을 생성하여그것을 클라이언트와 연결하도록하고, 리스닝 소켓은 계속 클라이언트의 접속을 받을 수 있도록 대기한다. 일종의 문지기 역할이다. (이것은 소켓 프로그래밍을 하면서 배우는 내용이다.)

 

 

이 연결들은 서버측 소켓과 클라이언트 소켓의 쌍으로 저장되어 식별이 가능하다.예를 들어 (서버소켓IP:서버측port <-> 클라이언트소켓IP:클라이언트측:port) 이런 식으로 말이다.그래서 서버소켓의 IP와 port가 같은 소켓 일지라도 클라이언트측 IP와 port가 다르므로 서버에서는 어떤 클라이언트로 데이터를 주고 받을 지 구분이 가능하다는 것이다.

 

 

즉, 한개의 리스닝 소켓을 이용해 수신 대기를 한다. -> 소켓에 동일한 포트 번호는 할당 불가능

서버에서 여러개의 소켓을 생성 -> 하나의 포트에서 여러 소켓을 생성하여 클라이언트와 통신

 

 

이게 둘다 맞는 말인거다. 

포트번호당 하나의 소켓만 생성 가능하다는 것은 (서버소켓IP:서버측port <-> 클라이언트IP:클라이언트측:port)네가지가 전부 같은 경우를 의미하는 것이고, 서버에서 동일한 포트의 소켓을 여러개 생성하여 클라이언트와 통신을 한다는 것은 통신을 하는 클라이언트 측IP, port가 다르기 때문에 뒤의 두 값이 다른경우를 의미한다.

 

 

답변에 달린 댓글에 이에대한 정리를 한번 더 해주었다.

 

 

You can only have one TCP socket listening on a port, but you can have multiple connected TCP sockets simultaneously using that port for sending and receiving data. (these would be the sockets returned by accept() on the listening socket) 

 Apr 2, 2021 at 5:26

 

 

내가 이해한 것을 정리한 내용의 글이다. 너무나도 명쾌하다.

역시 스택오버 플로. '내가 하는 고민들은 이미 누군가 해봤다.' 이거 진짜 맞는 말 인거 같다.

'네트워크 > 개념' 카테고리의 다른 글

[Network] - 로드 밸런싱(Load Balancing)  (0) 2024.02.02
[Network] - Overlapped IO vs Nonblocking IO  (0) 2023.02.18
[Network] - Session  (0) 2023.02.15
[Network] - 멀티 프로세싱 서버  (0) 2022.03.04
[Network] - Nagle 알고리즘  (0) 2022.02.25