기기간 시간 동기화 방법

by Sophia Lee / 2016. 04. 29. [07:58]

게임을 개발하다 보면, "두 기기 간의 시간 동기화를 하는 방법"이 필요할 때가 있습니다.

이것에 대해서 알아 봅시다.

 

두 기기의 시간을 동기화하는 것은 일반적으로 round trip latency (RTT)를 이용하는 방법입니다.

 

기기 A,B가 있다고 있다고 칩시다.

 

* A->B: A의 시스템 시간을 보낸다.[1]

* B->A: [1]을 그대로 보낸다.

 

A에서는 A의 시스템 시간에서 [1] 안의 시간을 빼면 RTT를 얻게 됩니다.

이제,

 

* A->B: RTT[2]와 A의 현재 시간[3]을 보낸다.

 

이렇게 하면 됩니다. B에서 A의 현재 시간을 얻고 싶으면,

 

* A의 현재 시간 = [3] + [2]/2

 

를 계산하면 됩니다.

 

NTP도 이와 비슷한 방식으로 작동합니다.

컴퓨터 네트워크의 특징상 RTT는 한번만 측정한다고 정확하다고 말할 수 없습니다. 매번 RTT는 조금씩 틀리기 때문입니다. 무선 네트워크에서는 크게 틀리는 경우도 있습니다.

따라서 여러번 잰 후 최근 것의 평균을 내는 것이 더 정확합니다.

 

참고로, 프라우드넷(proudnet.com)에서 다양한 시간 동기화 함수를 제공합니다. 

 

* CNetClient.GetIndirectServerTimeMs

* CNetClient.GetP2PServerTimeMs

* CNetClient.GetServerTimeMs

 

프라우드넷은 서버 뿐만 아니라 P2P 연결된 다른 클라이언트와의 RTT를 얻는 기능도 제공합니다.

CNetClient와 CNetServer의 GetLastPing와 GetRecentPing 함수를 이용해서 말이죠.

4. 개발 이야기