사용 가능한 Port 범위

port번호는 0 ~ 65535번까지 사용할 수 있습니다.

 일반적으로 unsigned short의 2바이트 정수형을 사용합니다.
 port번호는 서비스번호라고도 합니다. 
 그래서 /etc/services라는 파일에 등록하여 서비스명으로 port번호를 찾아서 사용할 수 있습니다.
 getservbyname(3) 함수등으로 서비스명으로 port번호를 읽을 수 있습니다.
 /etc/services 파일에 port번호를 등록하면 
 그 시스템에 사용하는 prot번호를 중복되어 오류가 나는 것을 방지하여 채번할 수 있습니다.  

 

port 번호 사용 영역

port번호는 사용할 수 있는 영역이 정해져 있습니다.

 0 ~ 1023 : well-known port번호 영역입니다.
   이 영역의 port번호는 UNIX/LINUX에서 root 권한으로만 port를 열 수 있습니다.
   예약영역이라고 보면 됩니다.

 1024 ~ 49151번: 등록된 포트 (registered port)
   이 영역은 주로 서버 소켓으로 사용하는 영역입니다.

 49152 ~ 65535번 : 동적 포트(dynamic port)
   이 영역은 client가 connect(2)시 
   또는 bind(2)없이 server socket을 생성했어 listen(2)할 경우에 자동으로 할당되는 영역입니다.
   server socket에서 자동할당하면, 
   client에게 할당된 port번호를 알릴방법이 있어야하기 때문에 서버 소켓은 prot번호를 정합니다. 

 

동적 포트영역은 서버 소켓 포트로 사용금지

서버 socket을 생성할 때에 동적 포트 영역의 번호를 bind(2)하여 사용할 수도 있습니다.
 그러나 이 경우에는 심각한 장애가 발생할 수 있습니다. 

 예전에 실제로 발생한 오류인데, 서버소켓을 50000번대로 할당하여 사용하는 프로그램이 있었습니다.
 이 프로그램을 실행하기 전에 여러 프로그램들이 기동하면서, 
     수백개의 프로그램이 Oracle DB서버와 접속을 하였습니다.
 이 때에, oracle db에 접속한 프로그램이 connect(2)하면서 동적영역의 
     port번호를 먼저 선점하여 실행하였습니다.

 뒤에 실행한 이 서버 프로그램이 port번호가 사용중이라는 오류와 함께 기동이 되지 않았습니다.
 이 경우에는 장애로 이어집니다.

 따라서, 동적 포트(dynamic port)영역은 서버 소켓용 port로 절대 사용금지하기 바랍니다. 

 


see also :  TCP/IP 통신 프로그램   Socket 통신 관련 Library  

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

Tag , , ,

댓글을 달아 주세요