[TIL] 게임 서버와 클라이언트 - 게임 서버

KYJ의 Tech Velog·2024년 3월 11일
0

게임 서버

게임 서버가 주로 하는 일은 다음과 같습니다.

  • 다수의 사용자와 상호 작용
  • 클라이언트에서 해킹 당하면 안 되는 처리
  • 플레이어의 상태 보관

다수의 사용자와 상호 작용하는 것은 플레이어 둘 이상 간의 행동을 중재하여 결과를 판정하는 것입니다. 이러한 판정을 만약 클라이언트에서 하게 되면, 심지어 특정 클라이언트가 해커라면 게임으로서는 엄청난 일이 일어나게 됩니다.

🤔클라이언트가 행동을 판정한다면...?

플레이어 1이 플레이어 2를 때렸다는 판정을 클라이언트에서 하게 되었다고 가정해봅시다. 플레이어 1은 플레이어 1의 공격력과 플레이어 2의 방어력, 생명력을 알고 있을 것입니다. 플레이어 1의 클라이언트는 이 값들을 토대로 플레이어 2의 생명력이 깎여서 얼마가 되는지 판단할 수 있습니다. 그리고 플레이어 1의 클라이언트는 서버에 깎인 플레이어 2의 생명력을 알려주면 됩니다. 서버는 이를 받아 플레이어 2의 클라이언트에게 보내주고, 플레이어 2의 클라이언트에서는 이를 렌더링할 것입니다. 문제는 앞서 가정했던 클라이언트가 해커일 때 발생하게 됩니다.

😮심지어 클라이언트가 해커라면...!?

플레이어 1이 해커라고 가정해봅시다. 클라이언트에서 일어나는 일은 모두 해커가 조작할 수 있습니다. 해킹을 완전히 없애는 것은 기술적으로 불가능합니다. 결국 플레이어 1은 클라이언트 프로세스를 해킹해서 플레이어 1의 공격력을 매우 크게 조작합니다. 이대로 플레이어 1의 클라이언트가 공격 판정을 처리하였더니, 플레이어 2의 생명력이 0이 되었고 이 사실을 서버에 전송하게 됩니다. 결국 플레이어 2는 바로 죽게 됩니다. 실제 사실과 다른 일이 일어나게 됩니다.

👍서버가 판정한다면!

원래대로 서버가 판정하는 방식으로 작동한다고 가정해봅시다. 플레이어 1에서는 서버에 플레이어 2를 때렸다는 사실만 알리고 어떠한 판정도 하지 않습니다. 모든 능력치와 상태값은 서버가 가지고 있을 것입니다. 따라서, 서버가 행동에 대한 판정을 하고 결과를 플레이어 1에게 응답하고, 플레이어 2에게는 변화된 생명력을 알려줍니다. 이렇게 한다면 특정 플레이어의 해킹을 차단할 수 있겠죠.

결론은 클라이언트에서 해킹을 당하지 않도록 서버에 힘을 빌린다는 것입니다.

그럼 이런 생각이 들 수도 있습니다. '모든 게임 판정을 서버에서 하면 되지 않나?' 결론부터 말하자면 아닙니다. 다른 문제를 야기하게 됩니다. 극단적이지만 판정뿐만 아니라 게임 로직 처리를 서버에서만 처리한다고 가정해봅시다.

캐릭터를 이동시키는 마우스 클릭이나 키보드 방향키를 누르는 일련의 입력들이 항상 네트워크를 통해 서버에 전달될 것입니다. 서버에서는 세션의 모든 캐릭터 상태를 1/60초마다 변화시켜서 그 결과를 클라이언트에 보낼 것입니다.

이는 게임 플레이의 문제를 야기하게 되는데, 바로 레이턴시 때문입니다. 현대 컴퓨터 네트워크의 레이턴시는 몇 밀리초에서 수백 밀리초로 다양합니다. 만약 레이턴시가 50밀리초인데, 게임 루프의 초당 횟수, 즉 프레임률이 60이면 어떤 일이 일어날까요? 입력은 50밀리초 뒤에 서버에 도착할 것이고 서버에서 이를 판정하고 클라이언트에 도착할 때까지 또 50밀리초가 걸릴 것입니다. 게다가 메시지를 보낼 때마다 걸리는 레이턴시는 다릅니다. 결국 클라이언트에서 세션의 변화, 즉 게임 진행 속도가 불규칙해서 한 템포씩 느리게 보일 것입니다. 흔히 말하는 랙이 걸리는 상황입니다.

서버든 클라이언트든 게임 로직 처리를 한 쪽에만 맡길 수는 없습니다. 기본적으로 서버에서 모든 게임 플레이 판정을 할 수 있게 하되, 게임의 품질을 위해 일부 처리는 클라이언트에 맡기는 것이 현실적입니다. 클라이언트에서 플레이어의 위치 이동 판정까지 하고 서버에 일방 통보를 하되, 공격 행동은 서버가 처리하는 것을 예시로 들 수 있겠네요.

물론 이동 판정을 클라이언트에 맡기는 것도 위험할 수 있습니다. 이동하는 위치를 조작할 수 있기 때문이죠. 서버가 플레이어의 이동 변화량을 추적하도록 조치를 취하기도 합니다.

😨서버가 꺼진다면?

이러한 역할을 하는 서버가 꺼지게 되면, 여러 플레이어 간의 상호 작용이 중단됩니다. 서버에 메시지를 보내봤자 응답이 없을 것이고 서버의 능동적 통보도 없기 때문에 세션의 상태 변화도 없을 것입니다. 플레이어의 행동이 서버에 전달되지 못하기 때문에 클라이언트에서 하는 행동은 의미가 없어집니다. 아직 서버에 접속하지 않은 클라이언트에서는 접속을 시도해도 받아줄 서버가 없게 됩니다. 정리하자면 정상적인 게임 플레이가 불가능하다는 것이죠.

0개의 댓글