brunch

You can make anything
by writing

C.S.Lewis

by 생계형 개발자 Sep 27. 2024

스타크래프트 맵핵의 원리?

게임 서버 동기화 메커니즘과 네트워크 아키텍처

주의! 맵핵 원리에 대해선 블리자드가 공식 발표한 적이 없습니다. 본 글은 인터넷상 여러 문서를 참고해 맵핵의 원리로 추정되는 부분을 작성한 글이니 재미로 읽어주시기 바랍니다 :) 


네트워크 동기화 기술

이미지를 아신다면 당신은 분명히 아재입니다

스타크래프트, LOL, 워크래프트 같은 RTS(실시간 전략게임) 게임의 경우 플레이어들이 동시에 같은 장면을 바라보고 플레이하게 됩니다. 그런데 유저마다 사용하는 기기도 다르고 네트워크 환경도 다릅니다. 대도시 환경과 깡촌 시골 마을의 인터넷 환경은 인스타 로딩 속도부터 넷플릭스 스트리밍 버퍼링까지 차이가 나는데요, 실시간 게임에선 마치 옆에서 플레이하는 것처럼 끊김 없이 실행됩니다. 이건 어떤 원리로 구현한 걸까요?


멀티 유저 간에 동시성을 지원하는 기술을 네트워크 동기화 기술이라고 합니다. 접속 환경이 다른 유저들이 동시에 같은 화면을 보며 플레이할 수 있도록 지원하는 기술이죠. 게임 동기화 기술에는 LockStep, State Synchronization 같은 기술이 있습니다. Lockstep 은 과거 게임에 많이 사용된 기술입니다. 


2000년대 PC 방을 장악하고 이제 한국 아재들의 신민속놀이라고 불리는 스타크래프트는 Lockstep을 사용해서 구현한 게임으로 알려져 있습니다.


LockStep

LockStep 은 유저들 간의 일관성에 좀 더 초점을 둔 기술입니다. Lockstep 방식은 유저들이 같은 시간대에 동일한 동작을 실행하도록 강제하는 방식입니다. 실행 순서는 다음과 같습니다.


1. 모든 유저가 자신의 명령을 로컬에서 처리하지 않고 다른 게임 플레이어에게 보냅니다. 만약 질럿에게 마린을 공격하라고 명령했다면 로컬 컴퓨터에 명령이 바로 실행되지 않고 나의 명령이 다른 플레이어에게 보내지 죠.


2. 유저는 모든 플레이어의 명령이 도착할 때까지 대기합니다. ‘나’ 또한 다른 유저가 보낸 메시지를 일단 대기합니다.


3. 유저들의 모든 명령이 도착하면, 해당 프레임에서 동기화된 상태로 명령을 실행합니다. 이때 로컬 컴퓨터에 내가 실행한 명령뿐만 아니라 다른 유저가 실행한 명령도 같이 실행됩니다. 만약 다른 유저가 마린에게 스팀팩을 걸었다면 질럿이 공격하면서 동시에 마린의 공격 속도도 높아집니다. 모든 유저의 명령이 동시에 실행되기 때문에 같은 화면을 보게 됩니다.

포럼에 따르면 초당 4개의 요청을 보낸다고 합니다. 1초마다 유저들은 다른 유저들의 4개의 요청을 받고 각자 로컬 환경에 값을 업데이트해주게 되죠. 1초당 4번의 명령이라니. 60 fps에 익숙한 우리에게는 적어 보입니다만 명령이 1초에 4번일 뿐 유닛들이 움직이는 시간 + 오디오 효과를 이용해서 자연스럽게 보이게 됩니다.


모든 유저의 응답을 받고 동시에 처리하기 강한 일관성이 보장됩니다. 그러나 특정 유저가 늦게 명령을 보내는 경우 모든 플레이어 환경에서 게임에 지연이 발생하게 됩니다. 흔히 우리가 랙이 걸린다고 할 때가 이런 경우죠. 종종 Drop Players 창이 활성화되는 경우가 있는데요 이때도 특정 유저가 명령을 보내는데 실패했기 때문에 발생합니다.

State Synchronization


Lockstep의 경우 유저가 많아질수록 단계별로 처리해야 할 명령어가 늘어나고 대기시간도 길어지며 지연이 발생할 가능성이 높습니다. 그래서 리그오브레전드 같은 비교적 최신 RTS 게임은 Lockstep 대신 State Synchronization을 사용하는 추세라고 합니다.


Lockstep 에선 모든 클라이언트가 명령을 받고 동시에 처리했다면 State Synchronization 에선 로컬에선 먼저 명령을 수행한 후에 외부에서 온 상태를 받아서 업데이트해줍니다. 모든 명령이 도착할 때까지 대기하지 않기 때문에 끊김 문제는 발생하지 않습니다. 


대신 다른 유저가 요청을 보내지 않거나 지연되는 경우 일관성 문제가 발생할 수 있습니다. 즉 게임 플레이어가 각자 다른 화면을 보고 있는 케이스가 생길 수 있는 거죠.  게임 제작사에선 일관성 문제를 해결하기 위해 여러 가지 보완 기법을 사용하고 있습니다.


P2P vs Server-Client

P2P는 중개 서버 없이 게임 플레이어들끼리 직접 데이터를 주고받을 수 있는 방식입니다. 서버가 게임 개설, 플레이어 모집, 시작 정도까지만 중개 역할을 하고 나머지는 게임 플레이어들끼리 서로 명령/상태 데이터를 주고받으면서 동시성을 맞추죠.


중개 서버를 거치지 않기 때문에 네트워크 Bandwidth를 잡아먹지 않아 비용 측면에선 유용합니다. 그러나 P2P 방식은 보안적으로 문제가 있습니다. 클라이언트끼리 직접 데이터를 주고받을 때 다른 클라이언트에게 노출하면 안 되는 데이터가 포함되기도 합니다.


여기서 파생될 수 있는 버그가 맵핵입니다.

게임 초반에는 정찰하기 전까지 다른 플레이어의 위치를 알 수 없습니다. 그러나 Lockstep 구조에선 모든 플레이어의 명령이 동시에 실행되다 보니 나의 컴퓨터에는 다른 플레이어가 일꾼들에게 내린 명령이 메모리상 어딘가에는 존재합니다. 위치 정보뿐만 아니라 상대방의 종족 정보도 함께 있죠.


물론 정상적인 클라이언트 프로그램에선 플레이어의 시야가 확보된 공간에서 발생한 명령만 노출되도록 구현했습니다. 그러나 악의적으로 모든 명령이 보이도록 프로그램을 수정했다면 시야가 확보되지 않은 곳에서도 상대방의 위치 정보가 보일 수 있게 됩니다. 이게 바로 인터넷상 보안 전문가들이 추정하는 맵핵의 원리죠.


Server Client 방식은 이런 점을 보완했습니다.

Server-Client 구조에선 서버가 모든 클라이언트로부터 명령을 받고 다시 클라이언트에게 명령을 다시 전달해 줍니다. 이때 서버는 클라이언트의 상태를 보면서 노출할 때 필요한 데이터를 필터링합니다. A 유저에게 확보된 시야에 따라서 어떤 정보를 노출시켜줄지 골라주는 작업이죠. 전달하지 않아도 되는 명령은 제한할 수 있습니다.


유저들끼리 알아서 통신했던 P2P 구조와 달리 Client-Server 구조의 경우 게임 제작사 입장에선 중개서버를 둬야 하기 때문에 장비나 네트워크 비용이 추가되는 단점이 있습니다. 그러나 모뎀을 쓰던 시절에 비하면 네트워크 비용은 많이 낮아졌고 AWS 나 GCP 같은 클라우드 서비스 덕분에 사용량에 따라서 장비에 소요되는 비용을 탄력적으로 조절할 수 있게 됐습니다.


- 요즘 대다수 게임 서버는 Client-Server 구조를 사용하고 있습니다. 

- 스타크래프트 2의 경우에는 Lockstep 은 그대로 가져가면서 네트워크만 Client-Server 구조로 변경했다고 합니다.

- 기술적인 오류가 있는 부분은 댓글로 알려주시면 수정하겠습니다 :)


참고문헌

- gpg 스터디 포럼 

- 미디엄


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari