소켓 프로그래밍 2 - Client와 Port Range
프로그래밍 2022. 6. 21. 08:51앞의 글에서 서버 측의 Listen 까지의 과정을 살펴보았습니다.
서버가 Port 하나를 열고 Listen하고 있는 상태에서 Client는 연결 요청할 수 있습니다.
Client 가 서버와 연결되는 과정을 보겠습니다.
Client Connection
Client도 우선 Socket을 생성합니다.
그리고 그림에서는 Connect API를 호출하도록 되어 있습니다.
Server는 자신의 Address 와 Port 정보등을 구조체에 담아서 bind 함수에 넘기고 호출하였습니다.
Client역시 Server의 Address 와 Port를 구조체에 담고 이번에는 connect 함수를 호출하였습니다.
그런데... Client는 왜 bind가 없는 것일까요?
사실은 Client역시 binding 을 하고 있고 그 과정이 Connect 실행시에 암묵적으로 진행될 뿐입니다.
Server는 bind 과정에서 Port가 이미 사용중인지 아닌지에 대한 확인이 필요하고 만약 사용중인 상태이면 예외 처리를 해야합니다. 그래서 bind 함수의 명시적인 호출이 필요하게 됩니다.
Server의 Port는 구분되는 번호로 하나씩 할당이 되어야 하는데 만약 다른 software가 미리 점유하고 있으면 문제가 되겠지요.
그런데 Client 는 Port 확인이 필요없습니다.
Client는 Port가 자동으로 할당되기 때문입니다.
Dynamic Port Range
Google에 dynamic port range를 검색해 보면 "49152 to 66535" 가 가장 먼저 나옵니다.
dynamic port range라는 의미는 "동적 포트 범위" 이니 글자 그대로 입니다.
Client Socket이 Connect 를 할때에 자동으로 할당되는 port 가 있는데 그 범위가 49152 ~ 66535 라는 의미 입니다.
netstat 로 확인해 보면...
위 netstat 결과는 Address:Port(로컬 주소), Address:Port(외부 주소) , 상태 로 이해하시면 되겠습니다.
192.168.219.105:139 0.0.0.0:0 LISTENING // 이것은 내 PC의 서버가 139 port 를 열고 있다는 의미입니다.
그런데 아래 쪽
192.168.219.105:49413 52.139.250.253:443 ESTABLISHED 이 의미하는 것은...
내 PC의 어떤 Client software가 내 PC의 port 49413을 열고 원격 서버 52.139.250.253 주소의 443 port에 접속했다는 의미입니다.
내 PC의 동적 포트 범위 내의 값이 사용 되었으니까요. 즉, Client Socket은 동적 포트 범위 내의 port를 자동으로 할당받게 됩니다.
Well-known Port, Registered Port
0 ~ 1023 까지는 Well-known port에 해당합니다. 이미 범용적으로 잘 알려진 protocol을 사용하는 서버 solution들이 사용하게 되어 있습니다.
자세한 내용은 Wiki를 참조하세요.
https://ko.wikipedia.org/wiki/TCP/UDP%EC%9D%98_%ED%8F%AC%ED%8A%B8_%EB%AA%A9%EB%A1%9D
그러면 Well-know port 와 Dynamic port 범위를 제외한 나머지 1024 ~ 49151 까지가 바로 Registered port 입니다.
그러니까 HTTP나 FTP 이런 잘 알려진 protocol의 software가 아니라면 Server software는 registered port 범위의 port를 지정해야 합니다.
주의할 점
그럼 Server는 Dynamic port range의 port를 사용하면 안되나요? 라고 질문할 수도 있겠죠.
당연히 됩니다. 개발자 마음이지요.
그런데 Server가 Dynamic port range의 port를 사용하면 어떤 일이 발생할까요?
어떤 개발자가 ABC라는 Software 서버를 만들었다고 가정하고 Port 49413 (동적 port 범위) 할당해서 동작을 시켜보니... 개발 중에는 잘 동작하였는데.... 가끔씩 안되는 경우가 발생할 수 있습니다.
컴퓨터가 booting 중에 서버 software 들을 동작시킬 수 있고 또 booting 중에 이 서버에 Client들이 자동으로 붙을 수 있습니다. 실제로 Window나 Linux 등에서도 Booting 중에 발생하는 동작입니다.
이 경우에 서버에 연결되는 Client 들 중 하나가 port 49413 을 할당 받는 경우가 우연히 생기면....
개발자가 만든 ABC 서버는 binding에 실패하게 됩니다. 이미 사용중인 port 라고 오류가 뜨게 됩니다.
이런 오류는 실제로 많이 발생하는 경우이기 때문에 Socket으로 직접 개발하는 Server 개발자는 특별히 유의해야 합니다.
이제 Accept 과정이 남았네요.
TO BE CONTINUED...
'프로그래밍' 카테고리의 다른 글
소켓 프로그래밍 4 - Data Boundary (0) | 2022.06.23 |
---|---|
소켓 프로그래밍 3 - Accept (0) | 2022.06.22 |
소켓 프로그래밍 1 - binding (0) | 2022.06.19 |
DI, DIP 그리고 IOC (0) | 2022.06.15 |
조제프 푸리에(Joseph Fourier) (1) | 2022.06.15 |