- 네트워킹이란?
- 데이터를 주고 받는 것, 컴퓨터안의 cpu, ram 간 데이터를 주고 받는 것도 네트워킹이다.
- 컴퓨터 내부와 외부 네트워킹의 차이점
- 지연시간(latency)
- 지구 한바퀴를 빛이 도는 시간(133ms = 0.13sec)
- 굉장히 빠른 것같지만, 컴퓨터 입장에서는 굉장히 느리다.
- 게임에서 얼마나
Latency를 눈속임하느냐가 관건이다.- 아무리 빨라도 물리적인 한계 때문에 속도를 줄이는 것은 안된다.
- 지구 한바퀴를 빛이 도는 시간(133ms = 0.13sec)
- 연결의 불안정성
- 인터넷은 여러 거점을 거쳐가는데 이 경로 중 하나가 문제가 생기면 연결이 끊어진다.
- 연결이 취약하므로 언제든지 끊김이 발생할 수 있다.
- 근래는 모바일 무선네트워크를 많이 쓰므로 더 빈도가 높다.
- 이러한 끊김에 대한 안정성을 커버하는 것이 관건이다.
- 인터넷은 여러 거점을 거쳐가는데 이 경로 중 하나가 문제가 생기면 연결이 끊어진다.
- 순서 비보장
- 내부
- 순서대로
- 외부
- 랜덤
- 모든 path를 살포하여 가장 빠른 쪽을 캐쉬에 기억했다가 전송한다.
- 패킷 순서를 보장하는 것이 관건이다.
- 내부
- 지연시간(latency)
- Protocol TCP/UDP
- TCP
- Hardware에서 다음 3가지를 보장해주자.
- 연결은 추상적 개념
- 연결 유무확인
3 way handshake- req
- res
- res에 대한 res
- Connect / Disconnect 를 알 수 있게 프로그래밍
- 순서보장
- 송신보장
- 단점
- 지연시간이 느리다(3번 주고 받아야 해서 느림)
- 느려도 되는 게임
- MMORPG, 보드게임
- Hardware에서 다음 3가지를 보장해주자.
- UDP
- 연결 유무x
- 순서 보장x
- 송신 보장x
- 장점
- 지연시간이 빠르다(1번 줘서 빠름)
- 단점
- 데이터가 유실될 수 있다.
- 빠른 반응 속도 필요
- 격투게임, 슈팅게임, LOL, 오버워치, 스타크래프트
- Reliable UDP
- 빠른 UDP를 쓰기 위해 프로그래밍된 software
- UDP에서의 순서보장, 송신 보장을 해주기 위해 만든 software
- 만들기 쉽지 않다.
- 과거에는 블리자드 같은 대형회사에서 자체적으로 만들었으나 요즘에는Unity, Unreal에서 제공해주고 Open Source도 많아졌다.
- TCP
- Deterministic 방식
- 같은
input이면 같은result가 나온다는 가정하에 시작- delay
- rollback
- relay server
- 데이터를 다루는 방식(TCP/UDP는 전송 방식)
- 같은 입력을 같은 시간에 어떻게 넣느냐가 관건
- Deterministic
- UDP
- a와 b의 input에 대한 output을 지연시킴으로써 a와 b의 output시간을 맞춰주는 개념
desync상황을 잡기 힘들다.- 언제 어디서 발생할지도 예측불가
- Server Authority
- TCP
- 같은
- Delay와 Rollback
latency만큼delay를 줘서 sync를 맞춰주는 방법(보통100ms줌)- 단점
- delay가 생김(랙)
- 도달시간이 150ms라치면 100ms의 delay를 줘도 문제가 생긴다. 이럴 때
Rollback - Rollback
- 지연된 시간만큼 Rollback하여 다시 앞감기를 하여 sync를 맞춘다.
- 단점
- 프레임이 튄다.(플레이어가 갑자기 순간이동)
- 구현이 매우 어렵다.
- 뒤감기 -> 앞감기
- 10명일 때 모든 data를 기억하고 있다가 다시 넣어줘야함
- 입력을 중간에 집어넣기
- 구현이 어렵기 때문에
input이 오는 것과 상관없이 매 프레임 롤백하는 방식을 사용함.
- 뒤감기 -> 앞감기
fps에서 많이 씀.
- 그렇기 때문에 Delay와 Rollback을 섞어 쓴다.
- Ex)
- 오버워치가 잘 Delay & Rollback이 잘 구현되어 있다.
- 트레이서의
되돌리기스킬
- 트레이서의
- LoL Replay
- 시작부터 끝까지
state의 값이 아닌input의 값을 모두 기록해야 한다.
- 시작부터 끝까지
- 오버워치가 잘 Delay & Rollback이 잘 구현되어 있다.
- Ex)
- 다른 유용한 방식들
- 중계서버(Relay Server / Broadcast Server)
- 모든 클라이언트는 똑같은
input을 받는다. - 타임슬롯에 해당
input들을 넣는다.(``turn제`와 같다)- 각
player는 서버에 자신의 행동을 보낸다. server가 취합한다.
- 각
- 장점
- 구현이 쉽고
desync도 잘 일어나지 않는다.
- 구현이 쉽고
- 단점
- 반응성이 떨어진다.
AOS,스포츠에서 많이 씀
- 모든 클라이언트는 똑같은
- 중계서버(Relay Server / Broadcast Server)
- P2P, Relay Server 방식
- P2P
- Peer To Peer
- 방식
- 방장을 하나 정해서 방장에게
connect하는 방식- 장점
- 각
client가 관리해야하는connection수가 적다. - 방장이 심판의 역할을 한다.
- 각
- 단점
- 방장이 겜을 나가버린경우 방이 폭파된다.
- 나갔을 경우 새로 방장을 뽑는 방법도 있다.(복잡함)
- 방장이 겜을 나가버린경우 방이 폭파된다.
- 장점
- Fully Connection 방식
- 서로가 연결
- 장점
- 중간에 한명이 나가도 게임이 진행된다.
- 단점
- 관리해야하는
connection수가 많다.
- 관리해야하는
- 방장을 하나 정해서 방장에게
- Relay
client가server에 접속하는 방식- 장점
- 연결이 안정적이다.
- 공정한 플레이가 가능
- 단점
- 서버가 죽었을 때, 게임자체가 아예 플레이가 안된다.
- P2P vs Relay
- P2P에 아주 큰 문제점이 있기 때문에 Relay를 사용하고 있다.
- Internet이 만들어질 때, 소련과 미국이 냉전 중에 있을 때, 두 국가 다 핵무기를 많이 보유하고 있었다. 관건은 핵미사일 발사를 감지하고 최대한 빠르게 대응하여 발사하는 것이다.
- 요청을 전송했을 때 선이 하나가 아닌 여러 경로에서 최단경로를 찾아서 패킷이 전송되는 시스템을 원했다. (선이 하나면 끊겼을 때 발사를 요청할 수 없다. 애초에 전세계에 인터넷이 생길 것을 가정하고 만든 것이 아니다.)
- IPv4와 IPv6
- IPv4로 갯수가 모자라서 IPv6을 만들었으나, IPv4로도 많은 주소를 할당할 수 있는 기술이 나와서 IPv6는 잘 안쓰게 됨.
- 고정IP(Public IP)가 받아서 유동IP(Private IP)로 할당해준다.
- IPv4로 갯수가 모자라서 IPv6을 만들었으나, IPv4로도 많은 주소를 할당할 수 있는 기술이 나와서 IPv6는 잘 안쓰게 됨.
- 홀 펀칭(hole punching)
- P2P에 아주 큰 문제점이 있기 때문에 Relay를 사용하고 있다.
- P2P
- 홀 펀칭
- 개인pc에서 naver에 req를 날렸을 때, naver는 개인pc의 ip를 알 수 없다. NAT가 받으면 나갈 때 할당되었던 개인pc의 ip를 기억해뒀다가 바인딩해준다.
- NAT
port forwarding을 해서binding해주는 것
- Web RTC Protocol
- P2P에서 c1과 c2가 server에 접속했을 때 서로에게 바인딩 된 포트 번호를 알려준다. 이 때 서버를
STUN SERVER라고 한다. 알려주면 c1에서 c2, 혹은 c2에서 c1으로 알려준 ip로 날려보는데(홀펀칭을 시도), Gateway가 이 패킷을 통과시켜줄지 말지는 지 맘대로다. - STUN Server로 홀 펀칭을 시도해보고 안되면 turn server로 돌린다.
- P2P에서 c1과 c2가 server에 접속했을 때 서로에게 바인딩 된 포트 번호를 알려준다. 이 때 서버를
- Deterministic과 해킹
- Deterministic은 input에 의존하기 때문에 해킹에 취약하다.
- 해킹
- 외부해킹
- 막는 방법
- 외부 tool 블랙아웃(
nProtect: 검증되지 않은 툴 종료)
- 외부 tool 블랙아웃(
- 막는 방법
- 내부해킹
- 공격자가 유리하다(client가 인질로 잡혀있기 때문에)
- 막는 방법
- 파일 사이즈가 변경되었는지 확인
- Checksum
- 조금만 변경되어도 Hash가 많이 바뀜. 바뀌면 종료
- 코드 암호화
- 외부해킹
- Server Authority
- 질의, 응답, 알림
- 예전엔 질의 후 응답하면 바로 끊었으나, 요즘은 Long polling방식으로 일정시간 connection을 유지한다.
- MMORPG에서 많이 사용
- 동접수가 많다.(10K 서버: 동시접속자 만명을 핸들링 할 수 있는 서버)
- lol은 한 session의 동접 10명
- 단점
- 서버가 모든 클라이언트를 관리해야 한다.(로직이 필요)
- Socket Programming
- 예전에는 프로그래머들이 hardware에 직접 붙었다.(windows, mac 이전 시대)
- hardware별로 다르게 프로그래밍해야 했다.
- HAL
- OS에서 제공하는 추상화된 layer
- adapting 패턴
- HAL
- hardware와 os의 연결을 프로그래밍하는 것이 Socket Programming
- hardware별로 다르게 프로그래밍해야 했다.
- Socket I/O
- Read & Write
- 동기식
- 응답이 올 때까지 thread가 멈추기 때문에 서버에서 잘 쓰지 않는다.
- 비동기식
- Select 방식(pre-request 방식)
- 일의 주체가 나
- 간단하게 구현 가능(connection수가 100개 이하일 때 좋다)
- IOCP 방식(post-request 방식)
- 일의 주체는 대리인
- 성능이 좋다.(connection수가 100개 이상일 때 좋다)
- Select 방식(pre-request 방식)
- 그런데 요즘은 언어자체에서 네트워크 기능을 잘 지원해주기 때문에 IOCP인지 select인지 알 필요 없다.
- 동기식
- Read & Write
- 예전에는 프로그래머들이 hardware에 직접 붙었다.(windows, mac 이전 시대)
- MMORPG 서버 구조1
- 유저가 많다. -> 작업량이 많다.(Actor -> Player, NPC, Control Zone)
- 조건
- 패킷 처리가 필요하다.(Read/Write)
- Tick 작업(매초 player의 이동 처리)
- 그 외 시스템
- 그래서 멀티 쓰레드가 필수다. 코어 당 100ms, 4코어면 400ms를 확보
- 좋은 서버 구조로 만들어져있으면 multi threading하기 좋다.
- 서버 구조
- 싱글 스레드
- Network I/O -> Queue -> WorkThread
- Network I/O(요청 queue를 쌓고)
- Select
- IOCP
- WorkThread(요청을 처리하고 actor의 tick을 돌고 다음 처리)
- 장점
- 단순하다.
- 단점
- 시간을 확보하기 어렵다.
- 많은 Actor를 처리하기 어렵다
- 3000 ~ 4000명까지의 동접
- 과거에 MMORPG가 많이 사용했다.
- 싱글 스레드 + Dedicated Thread(상점일, 거래소 일, 결투장 등)
- 기존 싱글 스레드 방식에 특정한 일을 하는 스레드들을 추가
- 멀티 스레드
- Network I/O -> Queue -> WorkThread(MultiThread)
- 싱글 스레드
- 멀티 쓰레드 vs 멀티 프로세스
- 멀티 쓰레드
- 하나의 프로세스에서 쓰레드를 여러개 나눠서 각각을 따로 동작하는 것
- 같은 프로세스기 때문에 서로의 메모리를 공유하기 때문에 서로의 메모리를 망칠 수 있다.
- 멀티 프로세스
- 하나의 컴퓨터에 여러 프로세스를 띄우는 것
- 프로세스마다 독립된 메모리를 갖고 있어 서로 망치지 않는다.
- Process가 다르면 서로 상호작용할 수 없다.
- 멀티 쓰레드
- MMORPG 서버구조2(싱글프로세스 vs 멀티프로세스)
- 와우에서 각 월드가 하나의 게임 서버로 돌아간다. -> 싱글 프로세스
- 여러 서버들이 하나의 서버를 구성한다. -> 멀티 프로세스
- 싱글 프로세스
- Scale Up
- 하나의 Machine의 성능을 올린다.
- 비용이 성능에 따라 y=ax2^으로 증가(비용⬆)
- But 공짜 점심은 끝났다.
- Availability(가용성)⬇
- 서버가 죽으면 서비스가 종료
- 관리가 쉽다
- Scale Up
- 멀티 프로세스
- Scale Out
- Machine을 늘린다.
- 비용이 성능에 따라 y=ax로 증가(비용⬇)
- Availability(가용성)⬆
- 서버가 죽어도 서비스가 종료되지 않는다.
- 관리가 어렵다
- Scale Out
- 서버를 나누는 방법
- Zone 방식(와우에서 대륙과 대륙)
- 대륙 넘어갈 때 로딩
- 채널 방식
- 대도시
- 채널
- 대도시
- Zone 방식 + 채널 방식
- Zone 방식(와우에서 대륙과 대륙)
- 프로세스 관리가 중요하다.
- MMORPG 서버구조3
- 멀티 쓰레드의 구획화
- Actor 기준(Akka: scala에서 제공하는 framework)
- Actor별로 따로 스레드.
- Actor간의 통신은 Message를 통해서
- System 기준(ECS구조: Entity Component System)
- Entity(Component를 갖고 있다.)
- 케릭터
- Component(상태)
- 상태를 갖고 있으나 기능을 갖고 있지 않다.(Class가 아니다)
- Flying(data)
- Attack(data)
- Moving(data)
- System(기능)
- Flying(function)
- 장점
- 확장성이 좋다.
- Locallity가 좋다.(data가 모여있다.)
- Entity(Component를 갖고 있다.)
- Actor 기준(Akka: scala에서 제공하는 framework)
- 멀티 쓰레드의 구획화