게임 서버 프로그래밍 교과서
네트워크 기초부터 고성능 서버 제작 기술까지
프라우드넷 개발자의 경험을 고스란히 담았다
[세븐나이츠], [마블 퓨처 파이트], [마비노기 영웅전], [스트라이트 파이터5] 등 전세계 13개국, 190개 이상의 다양한 게임에서 사용 중인 서버 네트워크 엔진 프라우드넷(ProudNet)을 개발한 저자의 지식과 실전 경험을 여러분의 것으로! 게임 서버 프로그래머로서의 입지가 단단해질 것이다.
목차
- 1장 멀티스레딩
- 1.1 프로그램과 프로세스
- 1.2 스레드
- 1.3 멀티스레드 프로그래밍은 언제 해야 할까?
- 1.3.1 오래 걸리는 일 하나와 빨리 끝나는 일 여럿을 같이 해야 할 때
- 1.3.2 어떤 긴 처리를 진행하는 동안 다른 짧은 일을 처리해야 할 때
- 1.3.3 기기에 있는 CPU를 모두 활용해야 할 때
- 1.4 스레드 정체
- 1.5 스레드를 다룰 때 주의 사항
- 1.6 임계 영역과 뮤텍스
- 1.7 교착 상태
- 1.8 잠금 순서의 규칙
- 1.9 병렬성과 시리얼 병목
- 1.10 싱글스레드 게임 서버
- 1.11 멀티스레드 게임 서버
- 1.12 스레드 풀링
- 1.13 이벤트
- 1.14 세마포어
- 1.14.1 세마포어의 또 다른 용도
- 1.15 원자 조작
- 1.16 멀티스레드 프로그래밍의 흔한 실수들
- 1.16.1 읽기와 쓰기 모두에 잠금하지 않기
- 1.16.2 잠금 순서 꼬임
- 1.16.3 너무 좁은 잠금 범위
- 1.16.4 디바이스 타임이 섞인 잠금
- 1.16.5 잠금의 전염성으로 발생한 실수
- 1.16.6 잠금된 뮤텍스나 임계 영역 삭제
- 1.16.7 일관성 규칙 깨기
- 1.17 심화 내용 및 더 읽을거리
- 2장 컴퓨터 네트워크
- 2.1 컴퓨터 네트워크를 구성하는 기기
- 2.1.1 OSI 모델
- 2.1.2 OSI 모델의 계층 2
- 2.1.3 OSI 모델의 계층 3
- 2.2 인터넷
- 2.3 컴퓨터 네트워크 데이터
- 2.3.1 스트림 형식
- 2.3.2 메시지 형식
- 2.4 컴퓨터 네트워크 식별자
- 2.5 컴퓨터 네트워크의 품질과 특성
- 2.5.1 네트워크의 품질을 저해하는 것들
- 2.5.2 전송 속도와 전송 지연 시간
- 2.5.3 네트워크 품질 기준 세 가지
- 2.5.4 무선 네트워크의 품질
- 2.6 컴퓨터 네트워크에서 데이터 보내기와 받기
- 2.6.1 UDP 네트워킹
- 2.6.2 TCP 네트워킹
- 2.7 패킷 유실 시 UDP와 TCP에서 현상
- 2.8 주로 사용하는 메시지 형식
- 2.9 네트워크 주소 변환
- 2.10 요약
- 2.11 더 읽을거리
- 3장 소켓 프로그래밍
- 3.1 블로킹 소켓
- 3.2 네트워크 연결 및 송신
- 3.3 블로킹과 소켓 버퍼
- 3.4 네트워크 연결받기 및 수신
- 3.5 수신 버퍼가 가득 차면 발생하는 현상
- 3.6 논블록 소켓
- 3.7 Overlapped I/O 혹은 비동기 I/O
- 3.8 epoll
- 3.9 IOCP
- 3.10 더 읽을거리
- 4장 게임 서버와 클라이언트
- 4.1 패키지 게임에서 게임 서버
- 4.2 온라인 게임에서 게임 서버
- 4.3 서버의 역할
- 4.4 게임 클라이언트와 서버의 상호 작용
- 4.5 게임 서버가 하는 일
- 4.6 게임 서버의 품질
- 4.6.1 안정성
- 4.6.2 확장성
- 4.6.3 성능
- 4.6.4 관리 편의성
- 4.7 플레이어 정보의 저장
- 4.8 서버 구동 환경
- 4.9 서버 개발 지침
- 4.10 더 읽을거리
- 5장 게임 네트워킹
- 5.1 UML
- 5.1.1 UML 시퀀스 다이어그램
- 5.2 게임 플레이 네트워킹
- 5.2.1 모든 역할을 서버에서 하기
- 5.2.2 렌더링은 클라이언트에서 하기
- 5.2.3 추측항법
- 5.3 레이턴시 마스킹
- 5.4 넓은 월드, 많은 캐릭터 처리
- 5.5 실시간 전략 시뮬레이션 게임에서 네트워크 동기화
- 5.6 실제 레이턴시 줄이기
- 5.7 게임 플레이 이외의 네트워킹
- 5.8 해킹과 보안
- 5.8.1 네트워크 해킹
- 5.8.2 클라이언트 컴퓨터 해킹
- 5.8.3 서버 컴퓨터 해킹
- 5.8.4 게임 치트
- 5.9 요약
- 6장 게임 네트워크 엔진 프라우드넷
- 6.1 게임 서버, 네트워크 엔진
- 6.2 개발 환경과 기본 모듈
- 6.3 게임 클라이언트-서버 간 통신
- 6.4 메시지 주고받기
- 6.5 와이파이 셀룰러 연결 핸드오버 기능
- 6.6 원격 메서드 호출
- 6.7 클라이언트끼리 P2P 통신
- 6.8 예시: 채팅 처리
- 6.9 스레드 모델
- 6.10 더 읽을거리
- 7장 데이터베이스 기초
- 7.1 플레이어의 정보 저장
- 7.2 데이터베이스 사용
- 7.3 데이터베이스의 데이터 구성
- 7.4 데이터베이스 시작
- 7.5 SQL 질의 구문
- 7.6 인덱스와 키
- 7.7 플레이어 정보를 데이터베이스에 저장하는 방법 1
- 7.8 플레이어 정보를 데이터베이스에 저장하는 방법 2
- 7.9 질의 구문 실행
- 7.9.1 트랜잭션
- 7.10 게임 서버에서 질의 구문 실행
- 7.11 보안을 위한 주의 사항
- 7.12 더 읽을거리
- 8장 NoSQL 기초
- 8.1 관계형 데이터베이스와 NoSQL
- 8.2 관계형 데이터베이스에서 확장성
- 8.3 관계형 데이터베이스에서 고가용성
- 8.4 MongoDB를 위한 JSON 이해
- 8.5 MongoDB 시작
- 8.6 MongoDB에 데이터 액세스
- 8.6.1 생성(create)
- 8.6.2 읽기(read)
- 8.6.3 업데이트(update)
- 8.6.4 지우기(delete)
- 8.7 성능 분석 기능
- 8.8 MongoDB 수평 확장
- 8.9 게임 서버에서 MongoDB 명령 실행
- 8.10 요약 및 더 알아보기
- 9장 분산 서버 구조
- 9.1 수직 확장과 수평 확장
- 9.2 서버 분산이 없다면?
- 9.3 고전적인 서버 분산 방법
- 9.4 논리적 단일 서버 분산
- 9.5 데이터 분산 vs 기능적 분산
- 9.6 로직 처리의 분산 방식들
- 9.6.1 동기 분산 처리
- 9.6.2 비동기 분산 처리
- 9.6.3 데이터 복제에 기반을 둔 로컬 처리
- 9.7 데이터 응집도
- 9.8 기능적 분산 처리
- 9.9 분산 처리를 엄선해야 하는 이유
- 9.10 분산 처리 전략
- 9.11 분산 서버의 또 다른 장점
- 9.12 고가용성
- 9.13 데이터베이스의 분산
- 9.14 요약
- 10장 분산 서버 구조 사례
- 10.1 로그온 처리의 분산
- 10.2 데이터베이스의 수평 확장
- 10.3 매치메이킹의 분산 처리
- 10.4 몬스터 NPC 처리의 분산 처리
- 10.5 플레이어 간 상호 작용 분산 처리
- 10.6 로그 및 통계 분석의 분산 처리
- 10.7 게임 장르별 분산 서버 형태
- 10.8 요약 및 결론