서버의 UDP 포트 사용 방식

클라이언트가 서버에 접속하면 1 개의 TCP 포트가 배정됩니다. 이는 모든 TCP 응용 프로그램의 특징이므로 별로 특이할 것이 없습니다.

ProudNet은 클라이언트와의 연결을 위해 1개의 UDP 포트를 사용합니다. (단, 클라이언트가 UDP 포트를 쓸 수 없는 환경인 경우에는 TCP 포트만을 사용합니다.)

이때 Proud.CNetServer 는 각 클라이언트와의 연결에 대한 UDP 포트 배정 정책을 다음과 같이 구분하고 있습니다.

  • 클라이언트 하나 하나 마다 서로 다른 UDP 포트를 배정하기
  • 모든 클라이언트를 위한 일정 갯수의 미리 준비된 UDP 포트를 배정하기

전자를 per-client assign mode, 후자를 static assign mode라고 지칭하겠습니다.

per-client assign mode에서는 서버에 접속하는 클라이언트 각각은 서로 다른 UDP 포트를 배정받습니다. 서버가 사용할 UDP 포트 번호 목록 외의 임의의 포트 번호가 사용됩니다.

static assign mode에서는 서버가 사용할 UDP 포트 번호 목록 외의 다른 UDP 포트가 사용되는 일은 없습니다. 그리고 서버에 접속하는 각 클라이언트는 서버가 사용할 UDP 포트 번호 목록의 포트 중 하나가 사용됩니다. 즉 두개 이상의 클라이언트가 같은 UDP 포트를 공유하게 됩니다. (이렇게 된다고 해서 두 개 이상의 클라이언트가 메시지 흐름에 문제가 생기는 일은 없습니다.)

일반적으로 Per-client assign mode가 static assign mode보다 더 성능상으로 좋습니다.

  • static assign mode는 클라이언트의 수가 많으면 소량의 UDP socket이 엄청나게 많은 클라이언트와의 통신을 감당해야 하기 때문에 UDP socket의 내부 버퍼량이 딸릴 경우 패킷 로스로 이어질 위험이 있습니다.
  • 그렇다고 해서 UDP socket을 처음부터 너무 많이 준비하면 지나치게 많은 UDP socket을 위한 서버측의 처리 부하로 메모리와 CPU 사용량이 증가할 수 있습니다.
  • static assign mode는 ICMP host unreachable packet에 대한 내성이 약합니다. 따라서 ICMP 관련 방화벽 설정 을 해주어야 합니다.

부득이한 경우가 아닌 이상 per-client assign mode를 쓰는 것을 권장합니다. per-client assign mode를 쓸 경우에는 위와 같은 단점이 없습니다.

하지만 주의 사항이 있습니다. 서버가 사용할 UDP 포트 번호 목록보다 더 많은 수의 클라이언트가 접속할 경우 임의의 UDP 포트가 할당되는데, 이때 할당된 포트가 서버측 방화벽에서 허락되지 않은 번호이면 UDP 통신이 원활하지 못할 수 있습니다.

어떤 서버 방화벽은 outbound 패킷 감지가 있는 경우에 한해 포트 사용을 허용하는 기능이 있습니다. 이를 활용하면 per-client assign mode를 쓰면서도 UDP 포트 허용을 꺼두어도 안전하면서도 원활한 통신이 이루어집니다. 이에 대한 자세한 내용은 DDOS 공격을 버티기 위한 방화벽 설정 을 참고하십시오.

서버가 어떤 assign mode를 쓰게 할 것인지 설정하려면 Proud.CNetServer.Start 호출 시 Proud.CStartServerParameter.m_udpAssignMode 를 설정하면 됩니다. 그리고 서버가 사용할UDP 포트 목록은 Proud.CStartServerParameter.m_udpPorts 에 설정하면 됩니다.

지금까지의 내용을 정리하자면, ProudNet 사용시 assign mode, UDP 포트 목록의 길이, 방화벽 설정의 권장하는 유형은 다음과 같습니다.

권장 수준 assign mode UDP 포트 목록의 길이 방화벽 설정
최고로 권장됨 per-client 0 outbound 패킷 감지시 일시 허용
권장됨 per-client 동시접속자수(예: 40000) UDP 포트 목록에 등록된 번호들을 항상 허용
권장됨 static 동시접속자수의 1/10(예: 4000) UDP 포트 목록에 등록된 번호들을 항상 허용, ICMP host unreachable 차단
위험! 사용하지 말것! per-client 최대 동시접속자에 한참 부족(예: 4000) UDP 포트 목록에 등록된 번호들만 항상 허용
위험! 사용하지 말것! static 상관없음 UDP 포트 허용 범위에 상관없고, ICMP host unreachable을 차단하지 않음