게임 네트워킹
1. UML
UML 시퀀스 다이어그램
구성요소
객체
네모상자
메시지
가로 화살표
주요 용도
객체 간 미시징 흐름을 일목요연하게 표현하는 것
거시적인 흐름을 표현할 때 사용
장점
객체 사이에 메시지를 주고받는 것을 하눈에 알아보기 쉽게 표현 가능하다
단점
주고받은 메시지를 어떻게 처리하는지 자세하게 표현하는데 한계가 있다
액티비티 다이어그램
구성요소
실린더 도형
활동상태를 의미한다
화살표
실행흐름을 표현한다
분기문
화살표가 한 두가지 이상으로 뻗어나갈 수 있다
주요용도
세부적인 로직을 표현해야 할 때 사용
장점
시퀀스도가 표현하기 어려웠던 부분도 표현할 수 있다
단점
시퀀스도보다 일목요연하지 못하다
2. 게임 플레이 네트워킹
사용이유
게임 클라이언트에서 모든 연산은 해킹 위협에 노출될 수 있다
종류
모든 역할을 서버에서 하기
클라이언트가 하는 일
- 사용자 입력
- 화면 출력
서버가 하는 일
클라이언트가 하는 일을 제외한 모든 연산
문제점
렌더링과 게임 로직을 모두 서버에서 담당하기는 무리다
렌더링은 클라이언트에서 하기
클라이언트가 하는 일
- 렌더링
서버에서 하는 일
- 월드 상태의 연산
- 서버와 클라이언트의 씬을 동기화
지속성 이벤트
씬의 상태에 영구적 변화를 가하는 것
단발성 이벤트
씬의 변화에 영향을 잠깐 주고 사라지는 것(ex 수류탄)
미래가 클라이언트와 서버 간에 서로 약속된, 결정적인 경우에는
지속성 이벤트보다 단발성 이벤트가 더 효과적
장점
앞의 방식보다 효율적이다
단점
- 서버와 클라이언트 사이에 레이턴시가 1/60초보다 훨씬 낮아야한다
- 레이턴시가 항상 균일해야 한다
해결방법
월드 변화를 1/60초 보다 느리게 전송
캐릭터 움직임이 딱딱해 진다
상태값 보정
서버에서 받는 상태 변화 메시지를 즉시 반영하는 것이 아니라, 일정 시간에 걸쳐서
서서히 목적 상태로 변화하게 하는 것
선형보간 , 스플라인을 이용
추측항법
정의
상대방 움직임을 어느 정도 예상해서 그 위치로 갈 수 있게 보정시키는 방법
두 기기 간의 레이턴시를 알아야 함
사용이유
상태값 보정을 통한 해결방법도 결국 우리가 원하는 결과값이 아님
라운드 트립 레이턴시
레이턴시를 측정하는 방식
- 기기 A에서 B로 패킷을 보냄
- 기기 B는 이를 받으면 기기 A에 패킷을 보냄
- 기기 A는 1과정의 시간과 현재 시간의 차이를 구하여 2로 나눔
레이턴시 마스킹
사용 이유
- 결국 레이턴시를 완전히 없앨 수 없다
- 플레이어의 입력 명령이 서버를 거쳐 다시 도착할 때까지 시간이 걸림
- 쾌적하지 못한 게임 환경
종류
사소한 것들은 클라이언트에서 판단하기
캐릭터 위치 계산을 클라이언트에서 판단하고, 클라이언트는 판단 결과
를 서버에 보내주는 방식
장점
쾌적한 게임 환경 제공
단점
해킹의 문제(ex 이동속도값을 엄청 증가시키는 방식)
해결방법
서버는 클라이언트의 정보를 받아서 유효성 검사를 해야한다
보여 주고 나중에 얼렁뚱땅하기
행동 명령에 대한 메시지를 서버에 보낸다. 동시에 행동을 연출하는 일부
모습을 클라이언트에서 즉시 시작한다
플레이어 캐릭터에 가해야 하는 행동을 클라이언트에 메시지로 보낸다
클라이언트는 이 메시지를 받으면 연출해야 하는 나머지 부분들을 클라이
언트에서 보여주기 시작한다
장점
사람들은 심리적으로 이러한 방식을 선호한다
3.넓은 월드, 많은 캐릭터 처리
사용이유
게임 월드 안에 캐릭터 수가 너무 많으면 통신량이 증가함
가시 영역 필터링
서버가 가진 월드 전체 상태 중에서 변화하는 것 모두를 플레이어에게 보여 줄 필요가 없음
서버가 가져야 하는 목록
- 플레이어 각각에 대해서 각 플레이어가 볼 수 있는 목록
- 캐릭터 각각에 대해서 자기 자신을 볼 수 있는 플레이어 목록
장점
사용하지 않았을 때 보다 처리량 부담 빛 네트워킹 부담과 비교하면 훨씬 가볍다
4. 실시간 전력 시뮬레이션 게임에서 네트워크 동기화
사용이유
캐릭터 수가 많아질수록 통신량이 늘어남
락스텝 동기화 알고리즘
누군가가 신호를 주면 그 신호에 맞추어 모두가 똑같은 행동을 하는 것
같은 상태에 같은 입력을 주면 같은 결과가 나온다는 원리를 응용(Deterministic)
장점
- 입력 명령만을 주고 받는다
- 통신량이 상대로 매우 적다
단점
- 컴퓨터 간 통신 레이턴시가 거의 없을 때 완벽하게 동작
해결방법
언제 실행해야 하는지에 대한 미래 시간을 함께 보낸다
미래시간 = 현재시간 + 왕복 레이턴시/2 + 임의의 일정 값
아주 많은 단점!
- 부동소수점을 쓸 수 없음 (하드웨어 종류마다 차이가 남)
- 플레이어수가 많아지기 어려움(플레이어 수에 비례해서 통신량 증가)
- 가시영역 필터링 사용 어려움
- 씬 업데이트가 일시정지 할 확률 높음
- 입력 명령의 속도에 민감한 게임에 부적합
5. 실제 레이턴시 줄이기
TCP대신 UDP 사용
사용이유
- TCP는 패킷 유실시 캐릭터 움직임이 튀는 현상 발생
- 똑같은 양의 데이터를 보낸다 해도 가급적 적은 수의 패킷으로 보내는 게 좋음
C/S + P2P 혼용
- 중요한 연산은 C/S 네트워킹과 서버 연산 처리
- 덜 중요한 연산은 P2P 네트워킹과 클라이언트 연산으로 처리
- 두 클라이언트는 서로 가깝지만 서버는 멀리 있을 때 효과적
6. 게임 플레이 이외의 네트워킹
온라인 게임을 개발할 때는 컴퓨터 간에 어떤 대화가 오가는지 순서를 미리 문서화 해놓자
매치메이킹
나와 실적이 비슷한 플레이어들을 모아서 같이 게임 플레이를 할 수 있는 공간을 생성
플레이어가 수동으로 방을 만들고 들어가는 방식
- 방 만들기 혹은 들어가기 정보는 클라이언트에서 판단 말고 서버에서 판단
- 클라이언트는 일방적으로 판단 말고, 서버에 요청하여 그 결과에 따라서 행동
- 방 목록이나 방 안의 플레이어 목록이 변할 때 클라이언트는 그 변화를 통보받을 것
게임 로직에서 서버-클라이언트 규칙
- 클라이언트에서는 요청을 보낸다
- 서버는 그 요청을 받아 결과를 판단한다
- 요청 결과에 영향을 받을 다른 클라이언트가 서버에 있으면 그 클라이언트에 통보한다
7. 해킹과 보안
해킹의 종류
크래킹
다른 사람의 ID와 비밀번호를 도용하거나 비밀 정보를 보는 것
치트
내 능력치를 비상적으로 높이거나 다른 사람의 플레이를 망가뜨리는 것
네트워크 해킹
암호화
암호 키를 이용해서 암호화
- 대칭 키 알고리즘 (AES)
- 비대칭 키 알고리즘 (RSA)
서버 컴퓨터 해킹
게임 서버에는 일반적인 유저가 접속할 수 있는 리스닝 포트를 제외하고
모두 방화벽으로 막아야 한다
데이터베이스처럼 일반적인 유저가 접속할 일이 없는 서버에는 아예 일반
유저가 접속조차 할 수 없게 방화벽으로 막는것이 좋다.
'게임 서버 프로그래밍 > 게임 서버 프로그래밍 교과서' 카테고리의 다른 글
#7. 데이터베이스의 기초 (0) | 2020.02.17 |
---|---|
#6. 프라우드넷 (0) | 2020.02.17 |
#4. 게임 서버와 클라이언트 (0) | 2020.02.17 |
#3. 소켓 프로그래밍 (0) | 2020.02.17 |
#2. 컴퓨터 네트워크 (0) | 2020.02.17 |