ProudNet의 UDP 혼잡 제어 기능

by Sophia Lee / 2015. 08. 20. [06:08]

프라우드넷을 쓴 게임 중 하나가 2011년에 중국에서 문제를 일으켰다는 사건이 화제가 되었던 적이 있습니다. (관련 링크문제의 현상은 P2P나 C/S간 UDP 통신량이 지나치게 많을 때 클라이언트-서버간 TCP 연결이 중간에 끊어져 버리는 것이었습니다. 이 문제의 근본 원인은 과도한 UDP 사용량이 불러일으킨 인터넷 블랙아웃 현상이었습니다. 이것을 해결하려면 UDP 통신량이 블랙아웃을 일으키지 않을 만큼 사용량을 낮추어야 합니다. 당시에는 그 문제를 해결하기 위한 많은 노력을 했고, 이를 해결하는 기술이 지금의 프라우드넷으로 이어지고 있습니다.

여기 두 단말기가 있습니다. 클라이언트-서버 관계일 수도 있고 클라이언트-클라이언트 즉 P2P 관계일 수도 있습니다. 두 단말기 간에는 UDP 통신과 TCP 통신이 같이 사용되고 있습니다.

 

 

 

두 단말기간 데이터 통신량을 증가시키겠습니다. 그러면 두 단말기 간에 있는 네트워크 장치(라우터나 방화벽 등)에는 처리량이 증가하기 시작합니다. 이때 일부 네트워크 장치들은 특정량 이상의 데이터 통신을 모두 처리하지 않고 슬슬 버리기 시작합니다. TCP는 스스로 이를 감지합니다. 그래서 송신 단말기의 내부에서는 보낼 데이터가 블러킹이 일어나는 대신 통신량이 증가하지 않습니다. (정확히 말하자면 한계선 즈음에서 오르락 내리락 합니다.) 

그러나 UDP는 그러한 감지를 할 수 없습니다. 따라서 데이터는 블러킹이 안 일어나지만 통신량이 끝없이 증가합니다. 그리고 두 단말기 간의 네트워크 장치는 지나치게 쏟아지는 UDP 패킷을 처리하지 못하고 버리기 시작하는데 이때 TCP를 위한 패킷도 덩달아 버려집니다. 이것이 Windows OS 기준으로 20초 이상 계속되면 TCP 연결이 끊어집니다.

 

중국의 인터넷 환경은 한국과 달리 네트워크 장치의 처리량 한계에 쉽게 부딪힙니다.

TCP는 네트워크 장치에서 패킷을 버리는 것을 감지하면 스스로 통신량을 줄인다고 했습니다. 이를 혼잡제어(congestion control)이라고 말합니다. 그렇다면 이 문제를 해결하기 위해서는 UDP 신 또한 혼잡 제어 기능이 있으면 되겠죠. 하지만 TCP의 혼잡제어 기능은 ARQ 알고리즘에 근거하여 만들어져 있는데 이를 UDP에 그대로 적용하기에는 무리가 따릅니다. 반대 방향으로의 트래픽량이 많이 증가하는 등의 문제가 있습니다.

프라우드넷에 사용되는 UDP 용 혼잡제어 기능을 소개하겠습니다. 이는 다음과 같이 작동합니다.

1. 송신자 측에서는 일단 마음껏 데이터를 보냅니다.

2. 수신자 측에서는 받은 데이터의 패킷 유실율과 데이터 수신 속도를 측정합니다. 이를 일정 시간마다 송신자에게 회신합니다. 

3. 송신자 측에서는 회신된 데이터를 근거로 데이터 송신 속도를 제한합니다. 만약 패킷 유실이 전혀 없으면 제한 없이 보냅니다. 만약 패킷 유실율이 높아지면 송신자가 회신 준 실제 데이터 수신 속도를 감안해서 송신 속도를 제한합니다.

 

 

프라우드넷의 UDP 혼잡제어를 간단히 소개해 드렸습니다. 상기 기술은 넷텐션의 국내외 등록 특허(2014년 출원, 2015년 등록됨)입니다. 

한편, 프라우드넷의 P2P 통신에서는 UDP로 일반 메시지를 주고 받는 기능 말고도, reliable UDP 계층을 통해 TCP처럼 신뢰성 통신을 할 수 있는 기능도 따로 있습니다. 여기에는 위의 기법이 아닌, TCP와 비슷한 방법으로 혼잡 제어를 하고 있습니다.

프라우드넷의 UDP 혼잡제어 기능은 꽤 많이 검증되었지만, 아직까지도 전세계 모든 네트워크에서의 검증이 완벽하다고 자신하지는 않습니다. 더 나아지는 모습을, 앞으로도 많이 지켜봐 주세요.

4. 개발 이야기