Network 강의

2024년 8월 27일 강의 및 추가 학습(게임 서버의 역할, 상호 작용, 하는 일, 자격)

kagan-draca 2024. 8. 28. 15:39

 

게임 서버의 역할

싱글 플레이에서 모든 입출력과 연산 처리는

한 대의 컴퓨터에서 수행한다.

 

따라서, 네트워크 자체가 필요 없기 때문에

컴퓨터는 다음과 같은 과정을 반복한다.

 

1. 입력받기 : 키보드, 마우스, 터치 스크린, 카메라 등으로 컴퓨터가 정보를 획득하는 과정

2. 게임 로직 처리하기 : 정보를 담고 있는 상태인 세션은 상태 변화를 처리, 계산하는 과정

 

세션이란? 특정 활동이나 작업을 수행하는 동안 지속되는 기간으로

ex)

1) 멀티 게임에서는 한 판의 매치나 라운드가 끝날 때까지의 시간

2) 게임 서버에서는 유저가 게임 서버에 접속하고, 특정 시간 동안 활동하는 것을 세션이라 한다.

(서버는 이 세션 동안의 데이터나 플레이 기록을 저장하기도 한다.)

 

3. 랜더링하기 : 변화된 상태를 화면에 표현하는 과정

 

위의 3 과정의 반복을 게임 루프(Game Loop)라고 한다.

 

그런데 온라인 게임에서는 유저의 행동이 다른 유저에게 보입니다.

이는 네트워크를 통해 상대방 모습을 생생하게 전달 받기 때문입니다.

그래서, 머틸 플레이어 게임은 붉은 점선 부분

즉, 입력(+상대방의 입력 포함)에 따른 행동과 상태가

유저의 컴퓨터에 있지 않고,

 

인터넷상 다른 컴퓨터나 서버에 있는 것을 볼 수 있습니다.

 

그리고, 이 로직 처리가 어떻게 구성되냐에 따라

P2P, CS, Web 방식으로 분류 됩니다.

 

게임 서버와 클라이언트의 상호 작용

 

대부분 온라인 게임에서는 클라이언트에서 게임 로직을

처리하는 부분 일부를 떼어 내 서버로 옮깁니다.

그리고 클라이언트와 서버 간 네트워크 통신으로

데이터를 주고 받습니다.

 

클라이언트 → 서버 : 데이터를 보내면

 

서버는 수신하여 메시지 내용에 따른 특정한 행동을 합니다.

 

 

클라이언트 ← 서버 : 데이터를 보내면

 

클라이언트는 수신하여 메시지 내용에 따른 특정한 행동을 합니다.

 

이렇게 메시지가 오가는 과정을 상호작용이라고 하는데

게임 클라이언트와 서버의 상호 작용은 크게 4가지로 구별 됩니다.

 

1. 연결 : 최초로 클라이언트가 서버와 데이터를 주고 받을 준비를 하는 것

ex) TCP(우리가 만들 게임은 TCP를 이용할 예정이다)

 

2. 요청과 응답 : 클라이언트가 서버에 메시지를 보내고, 서버는 이를 처리한 결과를 응답해준다.

(서버가 굳이 반응하지 않아도 될 때가 있다.)

 

3. 능동적 통보 : 클라이언트의 요청이 없는데도 능동적으로 응답할 때가 있다.

ex) 게임 서버가 세션을 클라이언트에게 통보할 때

 

4. 연결 해제 : 클라이언트와 서버 간의 통신을 차단해야하거나 해제하는 경우

(연결 해제는 서버에서 이뤄진다.)

 

게임 서버가 하는 일

 

1. 클라이언트와 상호 작용

2. 보안 처리

3. 상태 관리

 

if ) 플레이어1, 2가 있을 때 서로 간의 공격을 클라이언트가 판정한다면?

 

플레이어 1은 본인의 공격력과 플레이어 2의 방어력, 생명력(HP)를 안다는 가정하에

 

플레이어 1의 클라이언트가 플레이어 2를 공격할 경우

플레이어 1의 클라이언트는 서버에게 "플레이어 2의 깍인 생명력"을 전달해줍니다.

 

여기까지는 문제가 없지만,

 

플레이어 1이 해커라면?

 

해킹 방지 소프트웨어가 없다는 가정하에

클라이언트에서 일어나는 모든 일은 해커가

마음대로 조작할 수 있습니다.

 

if ) 플레이어 1, 2가 있을 때 모든 게임 플레이 판정을 서버에서 처리한다면?

 

레이턴시(딜레이) 때문에 게임 플레이의 쾌적함이 방해됩니다.

 

따라서, 게임 로직 처리를 클라이언트나 서버에서 처리할 수 없다.

=> 일부 처리 로직을 적절하게 놔눠야 한다.

ex) 클라이언트에서 플레이어의 위치 이동 판정까지 마친 후

서버에게 알려주고, 공격 행동은 서버가 처리하는 것

 

 

게임 서버가 갖춰야 하는 자격

 

1. 안정성

 

게임 서버는 365일 24시간 항상 켜져 있어야 한다,

하지만, 버그로 인해 서버 프로세스가 중간에

비정상 종료되거나 교착 상태가 발생할 수 있고

간혹 연산 결과가 이상하게 나오는 것도 포함

 

 

교착 상태 : 두 개 이상의 프로세스나 스레드가 서로 자원을 기다리며 무한히 멈춰있는 상태로

교착 상태가 발생하면 시스템이 제대로 작동하지 않고, 각 프로세스가 자원을 얻지 못해 계속 대기하게 됩니다.

(운영체제 시간에 배우는 내용들...)(여기서 다시 만날 줄이야...)(잘 하지는 못 함 ㅎㅎ;;)

교착 상태 발생 조건
상호 배제 자원은 동시에 하나의 프로세스만 사용할 수 있음
점유와 대기 자원을 점유한 상태에서 다른 자원을 기다리는 프로세스가 있음
비선점 프로세스가 점유한 자원을 강제로 빼앗을 수 없음
순환 대기 프로세스들이 서로 자원을 기다리는 원형 대기 상태 (점유와 대기가 원을 띄는 현상)
교착상태 예방
상호 배제 조건 방지 자원을 여러 프로세스가 동시에 사용할 수 있도록 설계
(자원을 동기화해야하는 번거로움이 생긴다)
점유와 대기 조건 방지 점유하고 있는 상태에서 다른 자원을 기라리지 않도록 설계한다.
(필요한 모든 자원을 lock(다른 프로세스나 스레드 접근 방지)을 걸고,
모두 받을 수 있을 때만 작업한다)
(속도 저하가 발생하고, 멀티 프로세스나 스레드 사용 이유가 사라짐)
비선점 조건 방지 프로세스가 자원을 사용중일 때 다른 프로세스가 그 자원을 요청하면 강제로 반환한다.
(자원에 따른 작업 내용을 다시 복구해야한다는 단점 발생)
순환 대기 조건 방지 자원을 사용할 수 있는 순서를 정해준다.
(한 없이 대기하는 프로세스나 스레드가 존재하게 될 수 있다.
장점 교착상태가 발생하지 않는다.
단점 시스템 효율성이 떨어지고, 비용(시간, 복구 등 추가 작업)이 많이든다.
교착상태 회피
(다른 알고리즘도 많음)
(은행원 알고리즘이 본인이 아는 한 제일 좋다고 알고 있다...)
은행원 알고리즘 각 프로세스는 번호표를 뽑고, 자신의 순서가 되면 자원에 접근합니다.
장점 교착 상태가 발생하지 않음
단점 모든 자원의 최대 필요량을 미리 알아야하고,
시스템의 부담이 증가한다.
교착 상태 탐지 및 복구
프로세스 종료 강제 종료 : 교착 상태에 있는 프로세스를 무작위로 종료
점전적 종료 : 자원을 적게 요구하는 프로세스나 우선순위가 낮은 프로세스 부터 종료한다.
자원 선점 교착 상태에 빠진 프로세스에서 자원을 강제로 빼앗아
다른 프로세스에게 할당한다.
롤백 : 프로세스를 처음 상태로 돌리고 다시 자원을 요청한다.
체크 포인트를 사용해 프로세스의 중간 상태를 저장하고
교착 상태 발생 시 체크포인트 부터 다시 실행한다.
장점 교착 상태를 빠르게 해결가능
단점 데이터 손실이나 작업이 지연될 수 있다.
교착 상태 무시(개인용 컴퓨터에 사용)
교착 상태가 발생하면 무시하고 컴퓨터를 강제 종료한다...
장점 개인 컴퓨터는 교착 상태가 발생할 확률이 극히 낮아서
무시를 통해 시스템 설계가 단순해지고
성능에 큰 영향을 주지 않는다. 
단점 사용자가 작업하던 데이터 손실이나 사용자 작업 지연

2. 확장성

 

사용자 수가 늘어나더라도 품질이 떨어지지 않고 유지되느냐 => 확정성이라 의미한다.

수직적 확장 수평적 확장
서버 컴퓨터 한 대의 하드웨어 성능을 올리는 방법 서버 컴퓨터 수를 늘리는 방식
장점(밑의 내용보다 더 많이 존재함)
추가적인 작업 필요 없음 비용 절감, 무한 확장 가능성, 고가용성,
일부 서버 고장에도 시스템 유지 가능
단점(밑의 내용보다 더 많이 존재함)
비용 부담, 확장 한계,
서버 고장 시 시스템 유지 불가능
복잡한 관리 : 데이터베이스 일관성, 분산 시스템 처리 등에서 추가적인 관리 작업이 필요해진다.

네트워크 오버헤드 : 서버 간 통신이 늘어나면서 네트워크 오버헤드가 발생할 수 있다.
결론
혼합해서 사용한다

 

3. 성능

 

서버의 처리 속도가 하락하지 않게 하는 것

=> 코드 최적화나 알고리즘 최적화가 필요하다.