NDC16 세 번째 날인 28일, NHN 엔터테인먼트 권오범, 김태경 책임 개발자는 'UDP를 사용해서 게임 서버 만들기'라는 주제로 강연을 진행했다.

두 사람은 현재 NHN엔터테인먼트에서 TOAST Cloud 의 Real-time Multiplayer 서비스를 개발하고 있다. 이번 강연에서는 UDP를 사용해서 실시간 멀티플레이어 게임을 구현할 때, 어떤 지식이 필요한지, TCP 대신 UDP를 사용한 경우 얻을 수 있는 장점뿐만 아니라 암호화, 시간 동기화 등 네트워크 라이브러리를 만들 때 고려해야 할 점에 대해 논했다.


TCP는 범용성을 위해 40년 전에 만들어진 검증된 프로토콜이다. 다만 40년 전에 만들어졌기 때문에 모바일이 현재와 같이 발전된 상황을 예측하지는 못했다. 반면, UDP는 그 자체로는 효율성은 낮다. 하지만 화상채팅을 위한 웹RPC 등을 개발하는데는 용이한 면이 있다.

실제로 UDP는 TCP가 제공하지 못하는 기능을 제공한다. 그 예로 멀티플렉싱이나 정확한 라우트 타이밍 측정 등이 있다. 권오범 개발자는 영화 '뷰티풀마인드'를 예시로 들어 UDP를 설명했다. 영화 속에서 주인공 '존 내쉬'와 친구들이 술집에서 금발의 아가씨를 만나는데, 존 내쉬는 "최선의 선택을 하지 않고 차선의 선택을 한다면 모두의 행복을 극대화할 수 있다"는 말을 한다는 것.

▲ NHN 엔터테인먼트 권오범 책임 개발자

UDP와 TCP의 차이점에 이어 패킷 재전송, 언릴라이어블 시퀀스, 시간동기화 등에 대한 설명이 이어졌다.

밖에 있을때는 LTE 연결되어 있다가 집에 오면 와이파이로 연결된다. 이런 상황에서 UDP는 별도의 설정 없이 와이파이를 문제없이 사용한다. 하지만 40년 전에 스펙이 정의된 TCP는 그렇지 않다.

하지만 사용자가 걸어가는 중간에 신호가 약해지는 음영지역으로 갈 때, 스마트폰의 경우 약한 신호에 매달려서 좀비상태가 되기도 한다. 음영지역에 게속 머물게 되면 네트워크 상황이 안좋아지고 이를 처리하려는 서버에도 과부하가 일어나는 문제가 발생하게 된다. 이런 상황에 보다 유동적으로 대처할 수 있는 것이 UDP라고 그는 말했다.



많은 데이터를 주고받는 게임 서버에서 어떻게 메모리 관리를 효율적으로 할 수 있을까? 이에 대해 김태경 개발자는 "메모리 할당 비용은 결코 저렴하지 않습니다. 미리 메모리를 할당해놓고 재활용하는 것이 좋습니다."라고 설명했다.

▲ NHN 엔터테인먼트 김태경 책임 개발자

하지만 멀티 쓰레드 환경에선 모든 쓰레드가 하나의 메모리 풀을 사용하므로 공유자원에 대한 관리가 필요하고, 이를 위해 락(Lock)을 사용하면 오히려 더 효율적이지 못하게 된다.

이를 해결하기 위해서 각 쓰레드의 TSL(Thread Local Storage)를 이용하면 된다. 하지만 TSL을 사용한다고 해서 모든 문제가 해결되는 건 아니다. 최악의 경우 하나의 메모리 풀에만 객체들이 쌓일 수도 있다. 워커쓰레드에 있는 것들을 다시 네트워크 쓰레드로 돌려주어야 한다. 또 다른 풀을 만들어서 다른 쓰레드에서 받은 객체를 저장하는 것이다.

공유자원 때문에 딜레이드 풀을 썼는데 딜레이드 풀 자체가 공유자원이기에 의미가 없냐고 의구심이 생길 수 있다. 하지만 딜레이드 풀 내부를 큐로 만들 경우 두 쓰레드는 큐의 서로 다른 위치에 접근하게 된다. 이어 그는 '완충지대' 구축의 필요성을 언급했다. 작업 큐를 넣는 것이다. 작업 큐 역시 공유자원이 되기는 하지만, 큐를 컨트롤하는건 복잡한 로직이 들어간 룸에 비해 간단하기 때문이다.


금일 강연을 마치며 그들은 오픈 소스를 공개했다. '헤이스트(Haste)'라는 이름의 비상업적 코드로 5월 중으로 공개될 예정이다. 이에 대해 권오범 개발자는 "많은 분들이 이용해주시고 실력있는 분들이 조언해주셔서 더 나은 오픈 소스를 만들어 갔으면 좋겠습니다."라고 말했다.

권오범, 김태경 책임 개발자가 공개한 오픈 소스 '헤이스트'는 5월 중에 정식으로 공개배포되며, 자세한 내용은 관련 홈페이지를 통해 확인할 수 있다.