사용 가능한 포트(Port) 범위
포트(port) 번호는 0 ~ 65535번까지 사용할 수 있습니다.
일반적으로는 unsigned short의 2바이트 정수형을 사용합니다. port번호는 서비스 번호라고도 합니다.
그러므로 /etc/services 경로 파일에 등록하여 서비스명으로 port 번호를 찾아서 사용할 수 있습니다.
getservbyname(3) 함수등으로 서비스명으로 port번호를 읽을 수 있습니다.
/etc/services 경로파일에 port번호를 등록하면 그 시스템에 사용하는 prot번호를 중복되어 오류가 나는 것을 방지하여 매번 할 수 있습니다.
포트(port) 번호 사용 영역
port번호는 사용할 수 있는 영역이 정해져 있습니다.
0 ~ 1023번 : 잘 알려진 port번호 영역입니다.
이 영역의 port번호는 UNIX/LINUX에서 루트(root) 권한으로만 port를 열 수 있습니다.
예약 영역이라고 보면 됩니다.
1024 ~ 49151번 : 등록된 포트 (registered port) 이 영역은 주로 서버 소켓으로 사용하는 영역입니다.
49152 ~ 65535번 : 동적 포트(dynamic port) 이 영역은 client가 connect시 또는 bind 없이 server socket을 생성했어 listen(2)할 경우에 자동으로 할당되는 영역입니다. server socket에서 자동 할당하면, client에게 할당된 port번호를 알릴방법이 있어야 하기 때문에 서버 소켓은 prot번호를 정합니다.
동적 포트(49152 ~ 65535번) 영역은 서버 소켓 포트로 사용 금지
서버 socket을 생성할 때에 동적 포트 영역의 번호를 bind 하여 사용할 수도 있습니다.
그러나 이 경우에는 심각한 장애가 발생할 수 있습니다.
장애가 발생한 하나의 사례를 소개해 드립니다.
서버 소켓을 50000번대로 할당하여 사용하는 프로그램이 있었습니다.
이 프로그램을 실행하기 전에 여러 프로그램들이 기동 하면서, 수백 개의 프로그램이 Oracle DB서버와 접속을 하였습니다. 이때에, Oracle DB에 접속한 프로그램이 connect 하면서 동적 영역의 port번호를 먼저 선점하여 실행하였습니다.
뒤에 실행한 이 서버 프로그램이 포트(port) 번호가 사용 중이라는 오류와 함께 기동이 되지 않았습니다.
이렇게 되는 경우 프로그램 실행이 되지 않으므로 장애로 이어집니다.
따라서 동적 포트(dynamic port) 영역은 서버 소켓용 port로 절대 사용 금지하기 바랍니다.
댓글