본문 바로가기
내일배움캠프_게임서버(202410)/분반 수업 스텐다드

스텐다드 24.11.27. 게임 구조 & 네트워크 & 캠슐화

by GREEN나무 2024. 11. 27.
728x90

게임 구조

싱글플레이어 게임 구조

마우스나 키보드를 통해 입력된 것을 바탕으로 상태를 시뮬레이션하고 결과를 화면에 보여주는 것을 반복합니다.
이 때 상태는 시간에 따라 사용자 입력과 상호작용하며 계속해서 달라집니다.

멀티플레이어 게임 구조

멀티 플레이어 게임은 싱글 플레이어 게임과 구조가 비슷하지만, 사용자 입력을 받는 부분과 상태를 시뮬레이션 하는 부분이 다릅니다. 
붉은 점선 부분이 내 컴퓨터에 있지 않고, 인터넷 상 다른 컴퓨터나 서버에 있습니다.

 

 

멀티플레이어 게임 종류

보통 멀티 플레이어 게임은 Asynchronous, Persistent, Session 등 세 가지 형태로 나눌 수 있습니다. 

 

Asynchronous

팜빌(farmville)과 같은 소셜 게임류가 대표적인 Asynchronous 게임입니다. 

한판 한판이 중요한 것이 아니라 지속적인 느낌.
이는 일반 웹 서버가 클라이언트와 통신하는 것과 크게 다르지 않게 동작합니다

 

.
즉, 내가 어떤 요청을 하고 응답을 받는 요청-응답 방식이기 때문에 게임의 특징이 항상 플레이어의 액션에 응답을 주는 형태로 제작됩니다.
사실, 이 방식의 게임 클라이언트는 웹 브라우저를 다르게 포장하는 것과 같습니다.

이러한 게임의 동기화 방식은 간단합니다. 
클라이언트에서 요청하면 서버에서 처리하고 결과를 알려주는 방식으로 진행됩니다. 
예를 들어 사과를 수확한다고 하면, 클라이언트가 탭을 해서 요청하고-서버의 DB에서 처리하고-그 결과를 클라이언트에게 알려주면-클라이언트가 사과 수확 후의 장면을 그리게 됩니다.
단, 이런 방식의 동기화는 간단하지만 웹 페이지와 비슷한 문제를 담고 있습니다. 
웹 서핑을 하다 보면 화면 갱신이 늦어서 무효화 되는 경우가 있습니다.
예를 들어, 웹에서 1개 남은 기차표를 예약하려 클릭했는데, 갑자기 느려지고서 확인해보니 이미 누군가 사간 경험을 겪어보셨을 겁니다. 
나의 요청이 아닌 누군가의 요청으로 서버에서 변경이 일어나면, DB에서는 실제로 동기화 처리가 되었지만, 내 화면에는 바로 반영이 안 됩니다. (새로고침 필요)
그래서 누군가의 요청에 의해 서버가 먼저 행동한 것에 대해서는 보여주기가 어렵습니다.

Persistent

한판 한판이 중요한 게임

접속자가 한명만 있어도 서버 종료 불가

서버가 여러개.

플레이어간의 상호작용이 많음. 고성능의 네트워크서비스가 필요


다음으로 Persistent 게임의 아키텍처에 대한 설명을 드리겠습니다. 이는 게임 월드가 지속적으로 유지되는 형태의 게임을 말합니다. 
대표적인 장르로는 MMORPG, 게임으로는 WoW가 있습니다.
Persistent 게임의 경우, 접속자가 1명만 있어도 서버를 내릴 수 없습니다.
즉, 게임 서버가 상태를 항상 유지해야 하므로, Scale-out 및 비용 절감이 쉽지 않고, 이는 비용 효율화가 아주 어렵다는 것을 의미합니다.
Persistent 게임의 성능 요구 조건도 까다로운 편입니다. 복잡한 쿼리 및 Transaction(게임 내 거래)이 빈번하기 때문에 RDBMS가 필요합니다. 
RDBMS의 경우 Scale-out이 쉽지 않기에 DB가 병목되는 경우가 많습니다. 
병목 현상을 피하려 1서버, 2서버, WoW로 치면, 아즈샤라 서버와 세나리우스 서버 등으로 나뉘게 되는 것입니다. 
또한, 플레이어 간 패킷 통신이 많아서 고성능 네트워크 인터페이스가 필요합니다.



Persistent 게임은 서버에서 상태를 항상 보관하고 관리해야 하기 때문에, CS 구조를 사용합니다. 
클라이언트는 서버를 통해 간접 연결하는 구조고, 중요한 로직은 서버에서 직접 하기 때문에 클라이언트 해킹으로부터 비교적 안전합니다. 
단, 서버 구현에 들어가는 난이도와 유지 보수 비용이 높은 편입니다.


CS 방식의 로직 처리 과정은, 클라이언트로부터 입력을 받으면 무조건 서버에 보냅니다. 
그럼 서버가 입력에 대한 처리를 하고, 시뮬레이션을 하고 결과를 다시 클라이언트에게 방송합니다. 
클라이언트는 그제야 서버에서 보내준 결과를 토대로 화면에 렌더링하는 구조입니다.


CS 구조에서 주로 쓰는 것은 서버 동기화 방식입니다. 
서버 동기화 방식은 먼저, 클라이언트에서 발생하는 이벤트는 무조건 서버로 먼저 보내고, 서버 측에서 로직 계산을 한 다음, 결과를 클라이언트로 방송합니다. 
물론, 특정 이벤트는 클라이언트가 아니라 서버가 직접 생성할 수도 있습니다. 
특히, 몬스터가 하는 행동은 클라이언트에 소속된 것이 아니기 때문에 서버에서 직접 처리합니다. 
위의 이미지는 클라이언트가 서버에 붙어서 게임을 하는 예입니다.
문제는 클라이언트가 서버의 응답을 늦게 받으면, 튕기는 현상이 발생합니다. 
이게 흔히 말하는 랙(Lag)입니다. 그러다 어느 순간 죽게 되죠. 이런 경우는 서버 회선이 안 좋을 겁니다.

서버가 좋아야 합니다.

 

우리나라에서 잘 만듦


위 그림은 일반적인 MMOG 아키텍처입니다. 우리나라 개발사들이 가장 잘 만드는 게임 백엔드입니다. 
이런 종류의 게임은 하나의 서버 머신에서 동시 접속을 최대로 받는 것이 이슈인데요, 보통은 DB가 병목되기 때문에, 1서버 2서버 3서버 형태로 쪼갭니다. 
이런 서버 단위를 렐름(Realm)이라고 합니다. 즉, 렐름별로 각 DB를 유지하기 때문에 다른 렐름에 있는 친구와 게임하려면 해당 렐름에 캐릭터를 새로 만들어야 하는 경우가 일반적입니다. 
현재 인기 있는 MMOG는 이 구조가 가장 많습니다. 물론, 고성능 DB를 사용하면 렐름을 특정 군으로 묶을 수 있습니다. 

 

 

Session

방만들어서 하는 게임


다음으로 Session 게임입니다. 위의 배틀그라운드가 대표적인 Session 게임입니다. 
Session 게임은 쉽게 말해 방을 만들어 게임하는 형태입니다. 
방을 플레이어가 직접 만드는 경우도 해당하고 매치메이킹을 통해 자동으로 만드는 경우도 Session 게임에 속합니다. 
즉, 시작과 끝이 명확한 게임을 의미합니다. 주로 MOBA, FPS, RTS 등 실시간 멀티 플레이어 게임이 Session 게임입니다.
Session 게임은 연결 구조에 따라 P2P, 플레이어 클라이언트 중 하나가 서버 역할을 하는 호스트 방식, 전용 서버를 따로 두는 데디케이티드 서버 형태로 나뉩니다.
동기화 방식 또한 이전에 설명한 서버 동기화 방식을 많이 쓰지만, RTS 장르의 경우, Lock-Step 계열의 동기화를 많이 사용합니다.


P2P 방식은 서로 간 직접 연결하기 때문에, 따로 서버가 필요 없고 반응성이 빠릅니다. 
과거 FPS나 RTS 게임류가 많이 사용한 방식입니다. 
다만, 각각의 클라이언트의 정보가 다른 모든 클라이언트에게 공유하는 방식이기 때문에 맵핵, 헬퍼와 같은 해킹에 취약합니다. 
게임에 참여하는 클라이언트 수가 늘어날수록 연결 수가 제곱으로 늘기 때문에 확장성에도 제약이 있습니다.


호스트 방식은 플레이어 클라이언트 중 하나가 서버 역할( super peer )까지 하는 방식입니다. 
이러한 서버를 수퍼피어라고도 합니다. 

https://wiki1.kr/index.php/%EC%8A%88%ED%8D%BC%ED%94%BC%EC%96%B4
보통 방장 역할을 하는 플레이어 컴퓨터가 호스트가 되는 것이 일반적입니다. 
때문에, 방장의 컴퓨터 성능이 게임에 영향을 미칩니다.


마지막은 데디케이티드 방식입니다. 

랜더링기능이 빠진 클라이언트
P2P나 호스트 방식은 온라인 게임 형태로 서비스하기 위해 변형된 형태로, 실제 클라이언트 중 하나를 게임 서버로 사용하는 개념입니다. 
물론, 호스트 방식처럼 실제 플레이어가 사용하는 클라이언트가 아니라 렌더링 기능이 빠진 클라이언트를 게임 회사의 IDC나 클라우드에 올려서 서버로 사용하는 겁니다. 
일반적으로, 몬스터와 같은 NPC 처리도 데디케이티드 서버에서 처리합니다. 
게임 상태의 전달은 데디케이티드 서버를 통해 전달하는 구조를 많이 사용합니다.
이 방식은 LoL이나 오버워치 같은 대부분의 세션형 온라인 게임에서 사용하는 방식입니다.
위의 이미지는 하나의 세션에 4명이 플레이하는 경우입니다. 
보이지 않는 플레이어가 데이터 센터에서 서버 역할을 하고 있다고 이해하실 수 있습니다. 
예를 들어 오버워치의 경우 12명이 한 방에서 게임을 즐기는데, 보이지 않는 플레이어가 하나 더 있어서, 이 플레이어가 데이터 서버에서 동작한다고 볼 수 있습니다.(13명인 셈 - 플레이어 12, 서버컴 1)
데디케이티드 방식과 그냥 게임 서버를 따로 만드는 것은 무엇이 다를까요?
바로, 게임 서버를 직접 구현하지 않고 프로그램을 서버 모드로 사용하는 점이 다릅니다. 
하나의 클라이언트 프로세스가 그대로 데디케이티드 서버로 동작하는 것이고, 이 데디케이티드 서버는 하나의 게임 세션을 처리하게 됩니다.
이 방식의 장점은 클라이언트의 지형, 애니메이션, 물리 정보를 그대로 사용할 수 있기 때문에 화면에 렌더링만 하지 않을 뿐, 클라이언트 엔진 레벨의 정교한 시뮬레이션이 가능합니다.
배틀그라운드에서 프라이팬에 총알을 튕길 수준의 정교한 동기화는 클라이언트 직접 서버로 사용하는 데디케이티드 서버 방식이기 때문에 가능합니다.

한 세션이 끝나면 그 세션의 데디케이티드 서버도 종료됩니다.

세션게임이 끝나면 로딩이있는 이유

 

 

 

 


네트워크

컴퓨터 네트워크


컴퓨터 네트워크는 크게 단말기와 네트워크 기기로 구성됩니다.
여기서 단말기란 통신을 하는 주체를 지칭합니다.
즉, 무선 혹은 유선 네트워크 연결 단자를 가진 일반적인 컴퓨터를 의미합니다.
단말기에는 데스크톱 컴퓨터, 노트북 컴퓨터, 스마트폰, 서버 컴퓨터 등이 포함됩니다.

 

망으로 연결

가장 기본적인 컴퓨터 네트워크 구성은 두 단말기를 직접 네트워크 케이블로 연결하는 것입니다.
하지만 이렇게 하면 단말기 두 대밖에 작동하지 못합니다.
단말기 세 대 이상 간에 통신하려면 다른 방법이 필요합니다.
가장 기본적으로 링 위상(Ring Topology) 연결 방식이 있을 수 있습니다.
아래 그림과 같이 연결되어 순차적으로 데이터를 주고받는 것을 의미합니다.  => 느림


그런데 이렇게 컴퓨터 네트워크를 구성하는 것은 보기 어렵습니다.


대부분은 네트워크 기기를 사용하여 다음과 같이 구성합니다.

네트워크 스위치를 중앙에 두고 각각의 켬퓨터가 연결된 형태


단말기 사이에는 네트워크 스위치라는 기기가 있고 네트워크 스위치는 단말기들과 네트워크 케이블로 연결되어 있습니다.
이렇게 네트워크 스위치 하나를 사이에 두고 별 모양으로 단말기(각각의 컴퓨터)들이 연결되어 있는 것을 흔히 로컬 지역 네트워크(Local Area Network)라고 합니다.
우리 주변에서 볼 수 있는 LAN은 이렇게 네트워크 스위치와 랜선으로 구성됩니다. 
이를 별 위상(Star Topology)이라고 부르기도 합니다. 규모가 작으면 랜(Lan), 규모가 크면 광역 통신망(WAN) 이라 부름

 

별 위상의 LAN에서는 데이터를 주고받을 때 가운데 있는 스위치로 전달합니다.
스위치는 자기한테 연결된 단말기들을 이미 식별하고 있습니다.
단말기 A에서 단말기 C로 데이터를 보내려고 하면 일단 스위치가 데이터를 받습니다.
스위치는 이미 단말기 C가 어디에 있는지 알기 때문에 직접 단말기 C에 데이터를 보냅니다.

 

LAN은 가까운 지역을 묶는 대표적인 컴퓨터 네트워크 입니다.
LAN은 한정된 지역에서 컴퓨터를 기본으로 하는 여러 가지 전자 기기 간에 자유롭게 정보 교환을 가능하게 합니다.
LAN은 사용자가 직접 구축해서 운영하기 어렵지 않습니다.
심지어 제조사가 서로 달라도, 기기 간의 통신 규약이 달라도 가능합니다.
OSI 모델의 표준만 지켜주면 됩니다.
OSI(Open System Interconnection Reference) 모델이란 컴퓨터 네트워크 통신에 대한 국제 표준입니다.
이 표준만 잘 지키면 어떤 기기든, 심지어 어떤 형태의 통신 선로를 사용하든 컴퓨터 간 통신을 할 수 있습니다.

LAN이 성립하려면 OSI 모델의 계층 2(Layer 2)를 지켜야 합니다.

 

OSI 모델
OSI 모델은 계층 1부터 계층 7까지 있습니다.
각 계층이 어떤 일을 하는지 알아볼 텐데, 각 계층의 정확한 정의보다는 게임 개발에서 꼭 알고 있어야 하는 것 위주로만 설명하겠습니다.
계층 1 : 물리 계층
물리 계층에서는 하드웨어를 다룹니다.
예를 들어 보낼 데이터를 어떤 파형의 전류로 보낼지 등을 정의합니다.
계층 2 : 데이터 링크 계층
로컬 지역 네트워크(LAN)에서 통신을 가능하게 합니다.
계층 3 : 네트워크 계층
광역 통신망(WAN)에서 통신을 가능하게 합니다.
계층 4 : 전송 계층
이 계층에서는 상대방에게 데이터가 반드시 도착하게 합니다.
계층 2에서는 상대방에게 데이터가 변조 없이 가게는 하지만, 반드시 가게 하는 것은 아닙니다.
계층 5 : 세션 계층, 계층 6 : 표현 계층, 계층 7 : 응용 계층
응용 프로그램이나 운영체제 안 모듈이 다른 컴퓨터의 응용 프로그램이나 운영체제 모듈과 통신을 하는 동안 논리적 연결 단위나 기능들을 다룹니다.


그 예로 동영상 스트리밍의 통신 규약(MPEG), 통신 암호화 규약(SSL), 웹 브라우저와 웹 서버간 통신 규약(HTTP) 등을 들 수 있습니다.
여러 단말기들이 네트워크  기기를 통해 서로 연결되면 주변의 장치하고 만 정보를 주고 받는 것이 아니라,
네트워크와 연결된 지구 반대편에 있는 장치와도 정보를 주고받을 수 있습니다.(광범위 연결 가능)
이를 가능하게 하는 기술이 인터넷(Internet)입니다.
이처럼 인터넷이란 여러 네트워크를 연결한 네트워크의 네트워크를 의미합니다.

 

개발자가 컴퓨터 네트워크를 알아야 하는 이유

개발자의 업무는 크게 두 종류로 나눌 수 있습니다.
하나는 프로그램을 만드는 업무, 다른 하나는 만들어진 프로그램을 유지 보수하는 업무입니다.
네트워크 지식은 두 가지 업무에 모두 도움을 줄 수 있습니다.
프로그래밍 언어나 프레임워크 혹은 라이브러리를 사용할 때 네트워크에 대한 배경지식이 있어야 활용할 수 있는 기능들이 있습니다.
예를 들어, TCP/UDP에 대한 지식이 없다면 우리가 하고자 하는 게임 개발은 과격하게 말해 불가능할 것이고,
HTTP와 SSL에 대한 지식이 없다면 제대로 된 웹 서비스 개발 역시 불가능할 것입니다.
유지 보수하는 업무에서도 마찬가지입니다.
갑자기 서버 연결이 안되는 경우, 보통은 네트워크 문제일 경우가 많습니다.
네트워크 지식이 없다면 갑작스런 장애 대응에 엄청나게 애를 먹을 수 있습니다.

 

네트워크 구성

네트워크란 여러 장치가 서로 연결되어 정보를 주고받을 수 있는 통신망이라고 하였습니다.
그런데 이 모양은 그래프의 형태를 띄고 있습니다.
아직 자료구조가 익숙하지 않을 수 있는데, 그래프란 노드(Node)와 노드를 연결하는 간선(Edge)으로 이루어진 자료 구조입니다.
모든 네트워크는 노드, 노드를 연결하는 간선, 노드 간 주고 받는 메시지로 구성됩니다.
노드는 정보를 주고받을 수 있는 장치, 간선은 정보를 주고받을 수 있는 유무선의 통신 매체라고 이해하면 쉽습니다.

 

 

호스트

네트워크의 가장 자리에 위치한 노드는 네트워크를 통해 흐르는 정보를 최초로 생성 및 송신하고, 최종적으로 수신합니다.
이는 개인 데스크톱이나 노트북, 스마트폰이 될 수도 있습니다.
이러한 가장자리 노드를 네트워크에서는 호스트라고 부릅니다.
때로는 호스트가 네트워크상에서 특정한 역할을 수행하기도 하는데, 대표적인 역할로는 서버와 클라이언트가 있습니다.
서버는 어떠한 서비스를 제공하는 호스트입니다.
반면, 클라이언트란 서버에게 어떠한 서비스를 요청하고 서버의 응답을 제공받는 호스트입니다.


네트워크 장비

노드가 호스트만 있는 것은 아닙니다.
네트워크 가장자리에 위치하지 않는 노드, 즉 호스트 간 주고받을 정보가 중간에 거치는 노드도 있습니다.
이를 중간 노드라고 합니다. 대표적으로 이더넷 허브, 스위치, 라우터, 공유기 등이 있습니다.
이러한 중간 노드들을 네트워크 장비라고 통칭하겠습니다.
네트워크 장비는 호스트 간 주고받는 정보가 원하는 수신지까지 안정적이고 안전하게 전송될 수 있도록 합니다.


통신 매체

그래프는 노드와 이를 연결 짓는 간선으로 이루어지기에 호스트와 네트워크 장비 또한 유무선 매체를 통해 연결되어 있어야 합니다.
이렇게 각 노드를 연결하는 간선이 통신 매체입니다. 
이 통신 매체에는 노드들을 유선으로 연결하는 유선 매체, 무선으로 연결하는 무선 매체가 있습니다.


메시지


통신 매체로 연결된 노드가 주고받는 정보를 메시지라고 합니다. 
메시지는 웹 페이지가 될 수도, 파일이 될 수도, 메일이 될 수도 있습니다.


정리하자면 네트워크는 가장자리 노드인 호스트, 중간 노드인 네트워크 장비, 노드들을 연결하는 간선인 통신 매체, 노드들이 주고 받는 정보인 메시지로 구성됩니다.

 

 

 

범위에 따른 네트워크 분류

네트워크를 구성하는 요소들을 학습했습니다.
이제 이 요소들이 모이고 모여 네트워크를 형성했다고 가정해 보겠습니다.
네트워크는 범위에 따라 크게 LAN과 WAN으로 구분합니다.

LAN

LAN은 Local Area Network의 약자로 이름 그대로 가까운 지역을 연결한 근거리 통신망을 의미합니다.
예를 들어서 가정, 기업, 학교처럼 한정된 공간에서의 네트워크를 LAN이라고 부릅니다.

WAN

WAN은 Wide Area Network의 약자로 이름 그대로 먼 지역을 연결하는 광역 통신망을 의미합니다.
멀리 떨어진 LAN을 연결할 수 있는 네트워크가 바로 WAN입니다.
앞서 인터넷은 네트워크의 네트워크라고 설명했습니다. 인터넷이 WAN으로 분류됩니다.
같은 LAN에 속한 호스트끼리 네트워크를 주고받아야 할 때는 인터넷 연결과 같은 WAN이 필요 없지만, 
다른 LAN에 속한 호스트와 메시지를 주고받아야 할 때는 WAN이 필요합니다.
인터넷을 사용하기 위해 접속하는 WAN은 ISP(Internet Service Provider)라는 인터넷 서비스 업체가 구축하고 관리합니다.
ISP는 사용자에게 인터넷과 같은 WAN에 연결 가능한 회선을 임대하는 등 WAN과 관련한 다양한 서비스를 제공합니다.
인터넷을 사용하기 위해 ISP와 계약하여 인터넷 사용 요금을 내는 것은 이러한 이유 때문입니다.

 

 


숙제

[수강생]
각 계층 별 기초 개념 조사
물리 계층
[튜터]
각 계층 별 기초 개념 & 심화 설명
물리 계층 



※ 요약

 

※ 기억할 것

 

※Tip