UDN
Search public documentation:

ClientServerModelKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

클라이언트-서버 모델

최종 업데이트: Michiel Hendriks — v3323 을 위한 업데이트. 이전 업데이트: Mike Lambert — 그럴만한 이유가 있어서. 원저자: Mike Lambert.

게임용 클라이언트-서버 모델은 QuakeWorld 에서 최초로 시도되었으며, 이제는 6명 이상의 사람들이 동시에 온라인으로 플레이하는 다양한 멀티플레이어 게임에는 어디에서나 사용되고 있습니다. 이 모델에는 각 클라이언트와의 접속을 관리하는 커다란 서버가 있습니다. 서버는 대개 대형 인터넷 열결망에서 호스트되며, 다양한 게이머들이 이 서버에 접속하여 함께 게임을 합니다. 클라이언트들은 서로 교신하지 않으며, 서버를 통해서만 간접적으로 교신할 수 있습니다. 여러 사람들이 동시에 온라인으로 함께 게임을 할 수 있도록 해주는 것이 이 모델입니다.

레벨 NetMode

Unreal Engine 에는 열거형 타입인 netmode 가 있습니다. 이 netmode 는 게임의 인스턴스가 수행하는 다양한 역할을 정의합니다. 간단한 예로, 플레이어가 네트워크 접속을 수반하지 않는 단독 플레이어 게임을 할 때 이용되는 netmode 인 NM_Standalone 이 있습니다. 이것은 위에서 간단히 논의한 클라이언트/서버 아키텍처와 전혀 상관이 없는 유일한 netmode 입니다. 그 다음의 netmode 는 게임을 하는 사람을 통해 서버에 접속된 게임의 인스턴스를 묘사하는 NM_Client 입니다. 클라이언트는 서버로부터 게임의 진행에 관한 데이터를 받습니다 . 이 데이터는 Standalone 과 Listen, 두 가지 netmode 중의 하나입니다. NM_Standalone netmode 는 전용 서버에 대해 사용됩니다. 이것은 오직 클라이언트를 위해 존재하며, 전혀 GUI 를 표시하지 않고, 이와 연합된 플레이어 Pawn 을 가지고 있지도 않으며, NM_Client 가 처리하는 것같은 일들을 처리하지도 않습니다. NM_Listen 은 여러가지 netmode 가 결합된, 이상한 netmode 입니다. Listen netmode 는 게임의 해당 인스턴스를 플레이하는 사용자에게 세계의 3D 버전을 제공하는 동시에, 게임에 접속하고 있는 다양한 클라이언트들에 대한 서버의 역할을 합니다. 이 설정을 사용하면, 서버가 클라이언트에게 3D 가속도 및 기타 시각적 효과를 제공해야 하기 때문에 대체로 감소된 속도로 실행됩니다. 이 netmode 는 예전부터 코딩시에 이 인스턴스의 클라이언트가 항상 다른 것들과 똑같이 취급될 수 없다는, 다소의 문제를 야기했습니다. 이것은 NM_Listen 인데 다른 것들은 NM_Client 이기 때문입니다. 예를 들어, 다른 클라이언트들이 모두 다루어야 할 복제 및 네트워킹을 가지고 있는 한편, NM_Listen 의 인스턴스는 서버의 데이터와 같은 데이터의 복제본으로 작업하는 클라이언트를 가지고 있습니다. 엔진에 더 친숙해짐에 따라 이 점을 더 잘 이해할 수 있게 되어야 합니다.

권위자로서의 서버

클라이언트/서버 모델에서는 서버가 모든 권위를 가집니다. 클라이언트가 다른 클라이언트의 게임 상태를 속이거나 훼손할 수 없습니다. 또한, 클라이언트가 관리 모드 또는 (최고 속도의 제약 범위 내에서) 플레이어의 위치를 변경하기 위한 키보드 동작 등 속성을 변경할 수 있도록 허용하는, 명시적으로 코드된 메커니즘을 통한 것 외에는 클라이언트가 자신의 건강을 변경할 수 없으며, 자기 자신에게 무기를 제공하거나 서버의 게임 상태를 변경 할 수 없습니다. 서버를 권위자로 하면 클라이언트는 그 역량에 한계를 가지며, 이것은 속임수 및 게임 데이터의 변경 같은 그밖의 것들을 방지하는 좋은 방법입니다.

단순 단말기로서의 클라이언트

가장 단순한 형태의 클라이언트는 서버에 의해 보내진 데이터를 표시하는 단순 단말기입니다. 게임에서는 세계에서의 변경에 관한 정보를 클라이언트에게 보내, 클라이언트로 하여금 3D 카드를 사용하여 세계를 표시하고 사용자에게 온라인 경험을 제공하도록 하는 것이 이치에 맞습니다. 서버는 다양한 클라이언트들, 발사체 등에 관한 정보를 클라이언트에게 보냅니다. 그러면 그 클라이언트는 로컬 데이터 및 부정확한 데이터의 사본을 서버로부터 받은 최신 정보로 업데이트합니다. 그러나 클라이언트에게 업데이트를 가능한 한 빨리 보내려고 하면, 아마 1초에도 몇 번씩 업데이트를 받게 될 것입니다. 그렇지만 클라이언트는 사용자에게 1초에 몇 십번 정보를 표시하게 됩니다. 프레임 열 개마다 최신 데이터를 반영하기 위해 위치가 바뀐다면, 액터의 움직임이 끔찍하게 급변하는 것을 쉽게 알아차리게 됩니다.

QuakeWorld 는 이 문제를 해결하기 위해 클라이언트가 액터의 일반적인 움직임에 관한 정보를 가지는 시뮬레이션을 소개했습니다. 공중을 나는 탄환의 경우 그 속도만 알면 되고, 언제라도 그 탄환의 움직임에 대해 정확히 예측할 수 있습니다. 시뮬레이션은 서버의 한 업데이트와 그 다음 것 사이에 위치를 삽입합니다. 이것은 클라이언트가 그들의 게임 상태가 서버에 의해 수백 밀리세컨드 간격으로 끊임없이 업데이트 되고 있다는 사실을 쉽사리 인지하지 못함에 따라 자신을 더 완전히 게임에 몰입할 수 있도록 해줍니다.

속임수

속임수는 포커든, 스포츠든, 또는 온라인 게임이든, 인간이 서로 경합하는 것과 결부된 모든 일들을 괴롭히는 문제점입니다. 대부분의 경우에는 모든 형태의 프라이버시를 낮춤으로써, 그리고 누군가로 하여금 모든 플레이어의 카드, 약물 등에 대해 점검하게 함으로써 속임수를 방지할 수 있습니다. 그렇지만 온라임에서 플레이할 때는 근본적으로 클라이언트를 신뢰해야 합니다. 클라이언트 측에 모든 보호 장치를 마련해둘 수 있지만, 인간은 exe/dll 을 해킹하여 이 보호 장치들을 모두 제거하고 속임수를 쓸 수 있습니다. 서버로서는 클라이언트가 실제로 특정 플레이어를 겨냥하고 있는지 아닌지, 또는 클라이언트 쪽에서 어떤 코드가 그들을 위해 겨냥을 해주고 있는지 아닌지 알려줄 방법이 없습니다.

그러나 클라이언트/서버 아키텍처를 사용하면, 시뮬레이션을 위해 필요한 데이터 중 무엇을 클라이언트가 알게 할 것인지 제한할 수 있습니다. 클라이언트에게 그들이 볼 수 없는 플레이어들에 관한 정보, 그들과 상관 없고 상관해서도 안될 것들을 알려줄 필요는 없습니다. 이는 클라이언트 코드가 작업해야할 데이터의 양과 그들이 이를 통해 속임수를 쓸 수 있는 메커니즘을 감소시킵니다. 마찬가지로, 서버는 클라이언트로부터 받아들이는 데이터의 종류를 제한해야 합니다. 서버가 클라이언트의 데이터를 덜 신뢰할수록, 클라이언트가 그에게 유리하게 데이터를 조작할 수 있는 방법이 적어집니다. 클라이언트로 하여금 그들의 총알이 어느 플레이어를 맞추는지 지정하게 해서는 안됩니다. 클라이언트가 자신은 총을 쏠때마다 각각 다른 플레이어를 명중시켰다고 말하기 쉬울 것이기 때문입니다. 서버로서는 이 플레이어가 정말로 겨냥을 잘하는 것인지, 아니면 코드가 그들을 위해 사격을 하고 있는 것인지 판단할 방법이 없습니다. 그 대신 클라이언트가 자신이 어디를 겨냥하고 있는지, 언제 발사할 것인지에 관한 데이터를 보낸다면, 서버는 플레이어가 스스로 명중시켰는지 확인할 수 있습니다. 클라이언트는 서버에서 명중시키려는 희망으로 목표를 조정할 수 있지만, 훨씬 더 부정확하기 때문에, 사격 범위 밖에 있는 사람들을 맞추는 등의 사고를 줄일 수 있습니다.

UT2003 와 UT2004 (2xxx 및 그 이상) 는 속임수 방지를 위한 추가 대책을 지원합니다. 예를 들면, 모든 패키지의 MD5 (검사 합계 알고리즘) 가 마스터 서버에 의해 관리되는 적법한 MD5 들의 목록과 대조됩니다. 클라이언트가 온라인에서 플레이할 수 있으려면 반드시 적법한 것으로 목록에 올라있는 MD5 가 있어야 합니다.

그럼에도 불구하고 UT2003 와 UT2004 는 아직 여러 경우의 "set" 속임수에 의해 매우 시달리고 있어서, 추가 대책이 마련되어야 합니다 (Epic 의 Joe Wilcox 에 의해 관리되는 모드 UTSecure 를 참고하십시오).

속임수를 줄이는 최선의 방법은 기준을 강화하는 것입니다. 강력하면서도 간단한 스크립팅 언어를 사용하면 속임수를 작성할 여지가 아주 적어집니다. MD5 검사 합계는 속임꾼이 변조된 native 패키지를 다루도록 강제함으로써 임의의 수정을 방지합니다. 그 외에 속임수의 방지에 도움이 되는 방법에는 다음과 같은 것들이 있습니다:

  • public C++ 헤더들을 릴리스하지 않는다
  • 게임에 대한 모드 커뮤니티를 지원하지 않는다
  • 2xxx 또는 그 이상의 코드베이스를 사용한다