NDC Python 게임서버 안녕하십니까? : 몬스터 슈퍼리그 게임 서버 편의 후속으로 기획된 발표입니다. 사내 준비 도중 "너굴" 님의 질문에서 시작되었습니다.
이 발표는 잘 알려진 RPC Framework 인 Thrift, gRPC를 살펴보고 예시로 오델로 게임을 만들어보면서 기존 RPC framework 들이 게임의 서버/클라 구조에 잘 어울리지는 살펴보고 왜 몬스터 슈퍼리그에서 그런 선택을 했는지 살펴봅니다.
그리고 게임에 맞게 RPC 를 설계하고 이를 이용하여 온라인 오델로 게임을 완성해봅니다.
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
NDC14에서 발표한 "[야생의 땅: 듀랑고] 서버 아키텍처" 세션의 슬라이드입니다.
슬라이드에 설명이 많지 않은데, 디스이즈게임에서 발표 내용을 잘 정리해주었습니다. 기사도 함께 보시면 좋을 것 같습니다.
http://www.thisisgame.com/webzine/news/nboard/4/?n=54955
NDC Python 게임서버 안녕하십니까? : 몬스터 슈퍼리그 게임 서버 편의 후속으로 기획된 발표입니다. 사내 준비 도중 "너굴" 님의 질문에서 시작되었습니다.
이 발표는 잘 알려진 RPC Framework 인 Thrift, gRPC를 살펴보고 예시로 오델로 게임을 만들어보면서 기존 RPC framework 들이 게임의 서버/클라 구조에 잘 어울리지는 살펴보고 왜 몬스터 슈퍼리그에서 그런 선택을 했는지 살펴봅니다.
그리고 게임에 맞게 RPC 를 설계하고 이를 이용하여 온라인 오델로 게임을 완성해봅니다.
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
NDC14에서 발표한 "[야생의 땅: 듀랑고] 서버 아키텍처" 세션의 슬라이드입니다.
슬라이드에 설명이 많지 않은데, 디스이즈게임에서 발표 내용을 잘 정리해주었습니다. 기사도 함께 보시면 좋을 것 같습니다.
http://www.thisisgame.com/webzine/news/nboard/4/?n=54955
KGC 2014: 클라이언트 개발자를 위한 컴퓨터 네트워크 기초 배현직Hyunjik Bae
클라이언트 개발자들은 직접 서버와 네트워크를 다루지는 않더라도 컴퓨터 네트워크의 특징에 대해서는 알고 있어야 한다. 본 강연은 클라이언트 개발자들이 반드시 알아야 하는 컴퓨터 네트워크 관련 용어와 특징을 소개한다. 아울러 스마트폰 무선 네트워크 관련해서 주안점도 다룬다.
1. 9. TCP는 Reliable Protocol이지만
Infallible Protocol은 아니라는 것을 알아야 한다.
TCP가 실패하는 상황들
김태우
내용, 그림 출처
Effective TCP/IP Programming
By Jon C. Snader
2. TCP는 마법이 아니다.
TCP가 모든 경우에 대해 데이터 전송을 보장하는 것은 아니다.
상대가 연결을 종료하면 TCP도 어쩔 수 없다.
3. TCP가 “진짜” 보장하는 것
TCP는 end-to-end 프로토콜이다.
연결이 지속된다고 가정할 때,
End와 end간에
모든 데이터가 손상되지 않은 상태로 순서
대로 도착하는 것을 보증한다.
하지만!
여기서의 end는 TCP 계층.
A와 B간의 전송은 보장하지 않는다.
5. 1.Network Outage
1. End point에서 먼 곳의 문제
라우터가 다른 경로를 찾음
2. 중간 라우터의 문제
ICMP 메시지가 에러를 전송.
3. End point(수신측의 TCP계층)에서 문제가 생긴 경우
TCP가 포기하거나 오류가 보고될 때까지 계속 요청하게됨.
6. 2. Peer Application Crash
1. Peer Application이 Crash되면 우리에게 FIN을 보낸다.
2. 이 경우 Peer에서 실제로 문제가 발생한 경우와 Peer가 close
를 호출한 경우를 구분할수 없다.
3. FIN이 close를 의미할수도 있으니 우리측은 남은 메시지를 전
송하게 됨.
4. 상대측은 연결이 존재하지 않으므로 RST로 응답한다.
9. 1. 서버가 응답을 전송한 뒤 꺼진 상황
• 클라이언트의 애플리케이션의 send가 데이터를 커널 버퍼에 복사하고 리턴
• 클라이언트의 TCP가 데이터를 전송
• 서버의 TCP가 ACK전송
• 서버의 애플리케이션이 커널 버퍼로 부터 readline으로 입력을 받아옴
• 서버의 애플리케이션이 send로 커널 버퍼에 에코 메시지 복사후 리턴
• 서버의 TCP가 클라이언트 TCP에게 데이터 전송 한뒤
• 서버 애플리케이션이 죽으면서 서버의 TCP가 FIN을 보냄
• 클라이언트의 애플리케이션은 readline을 한뒤에 FIN이 와서 fgets로 넘어갔고,
• 클라이언트의 TCP는 FIN에 대한 ACK는 보냈으나 여전히 close명령을 받지 않았으므로
FIN은 보내지 않는다.
• 이때 클라이언트의 애플리케이션은 사용자 입력을 받고 있으므로 FIN이 왔다는 것을 알수
없어 close를 하지 않는다.
• 클라이언트의 애플리케이션은 사용자 입력을 받은 후 send를 하고
• 클라이언트의 TCP는 이를 받아서 전송한다.
• 서버의 TCP는 이 데이터를 받고는 커넥션이 끝났다는 것을 알리려 RST를 보내고
• 클라이언트는 이 데이터를 readline을 통해 알게 되어 close를 하게 된다.
10. 2. 서버가 응답을 전송하기 전에 꺼진 상황
• 클라이언트의 애플리케이션의 send가 데이터를 커널 버퍼에 복사하고 리턴
• 클라이언트의 TCP가 데이터를 전송
• 서버의 TCP가 ACK전송
• 서버 애플리케이션이 죽으면서 서버의 TCP가 FIN을 보냄
• 클라이언트의 애플리케이션은 이 데이터를 readline을 통해 알게되어 close를
하게 된다.
11. 언제 문제가 되나?
• 읽기 없이 여러번 쓰기를 하는 Application에서 흔하게 발생
• 문제 발생 후 한번 더 전송한 이후에 애플리케이션이 상대의 문
제를 알게되는 것이 문제.
12. 3. Peer Host Crash
1. Peer의 TCP가 FIN을 통해 재난을 알릴수 없다.
2. Peer 호스트가 재부팅 될 때까지 네트워크 장애로 인식.
3. TCP는 세그먼트들을 계속 재전송한다.
4. 끝까지 재부팅을 하지 않으면, 우리측 애플리케이션이
TIMEOUT 오류를 반환한다.
5. 그전에 재부팅이 될때는 우리측의 세그먼트가 서버측에 도달
하면 TCP는 RST를 반환한다.