눈팅하는 게임개발자 블로그
게임 메시지(데이터) 형식 본문
www.gilbut.co.kr/book/view?bookcode=BN002400
게임 서버 프로그래밍 교과서
알고리즘부터 아키텍처까지
www.gilbut.co.kr
해당 책의 내용 중 일부를 정리.
게임에서 주로 사용하는 메시지 형식.
게임의 메시지(데이터)는 크게 텍스트 또는 바이너리 형식으로 정의된다.
텍스트 형식의 메시지는 사람이 읽을 수 있으며 다음과 같다.
BuyItem<LF> Sword<LF> 1<LF> <0x00> |
텍스트 형식은 메시지를 받는 쪽에서 특정 글자가 나올 때까지(메타 데이터와 같은)
글자를 검색하거나 구문 분석기(parser)를 동원하는 것이 일반적이다.
과거에는 텍스트 형식을 게임 개발자가 자체 정의하는 경우가 많았지만
요즘은 HTTP나 JSON같은 표준화된 형식을 쓰는 것이 일반적이다.
반면 이진, 즉 바이너리 형식은 다음과 같이 사람이 읽기 어렵다.
0x01 ^ BuyItem |
0x0023 ^ Sword |
0x0001 ^ 1 |
각 바이트 혹은 비트 필드는 특정한 의미를 갖는다.
첫 1바이트, 다음 2바이트, 그 다음 2바이트... 와 같은 식으로 필드를 구분한다.
바이너리 형식은 parser를 필요로 하지 않기 때문에 처리 성능이 더 높다.
또한 사람이 해석하기 어렵기 때문에 해커로부터 조금 더 안전하다.
다만 그만큼 디버깅이 까다롭다.
위와 같이 메시지 안에 내용만을 담는 것이 아니라
그 메시지 내용이 어떤 것을 담고 있는지의 정보를 같이 포함시키는 형식도 존재한다.
이를 메타 데이터(meta data)라고 한다.
메타 데이터가 있는 텍스트 형식의 메시지는 다음과 같다.
Action: BuyItem<LF> Type: Sword<LF> Amount: 1<LF> <0x00> |
위 메시지의 경우 내용만 보아도 "아이템을 사는 액션이며, 아이템의 타입은 sword, 양은 1개이다."라는 것을 알 수 있다.
바이너리 형식으로도 메타 데이터를 포함시킬 수 있다.
0x0001 ^Action |
0x01 ^BuyItem |
0x0005 ^Type |
0x0023 ^Sword |
0x0046 ^Amount |
0x0001 ^1 |
메타 데이터를 포함시키면 데이터 통신량이 많아지고, 해커에게도 더 많은 정보를 제공한다는 단점이 있다.
그럼에도 메타 데이터를 이용하면 하위 호환성 측면에서 좋은 점이 있다.
버전 1과 버전 2의 구조가 다르며.
버전 1의 구조에는 아이템의 '수량' 속성이 없고.
버전 2의 구조에는 아이템의 '수량' 속성이 있다고 하면
버전2로 돌아가는 서버에서는 버전1의 메시지가 서버에 들어왔을 때 이를 어떻게 처리해야 할지를 결정해야 한다.
위의 경우에서 메타데이터가 있는 경우 메시지를 받는 쪽에서 일부 필드를 이용하여 정보를 얻을 수도 있다.
예를 들어 '수량' 속성이 없는 경우 수량을 1개로 가정하여 데이터를 처리할 수 있다.
대부분의 PC 온라인 게임에서는 게임 클라이언트를 실행시키면 먼저 자동 업데이트 프로그램이 켜지기 때문에
2개 이상의 버전이 같은 서버에 접속하는 경우는 거의 없지만
모바일 앱은 상황이 다르다.
iOS나 안드로이드에서는 앱을 실행한다고 해도 앱을 자동으로 업데이트 해주지 않는다.
또한 업데이트된 버전을 올린다고 해도 사용자들이 이 버전을 받기 까지는
애플이나 구글의 승인 과정을 거쳐야 하기 때문에 시간이 필요하다.
이와 같이 메시지 구조(데이터 구조)에 변화를 가하는 것은 큰 주의를 필요로 하는 작업이다.
더 나아가서는 가장 처음 메시지 구조를 설계하는 것이 정말 중요한 작업이라는 뜻이 된다.
'공부한거 > 게임서버 프로그래밍' 카테고리의 다른 글
수직 확장, 수평 확장 (0) | 2020.11.03 |
---|---|
블로킹 소켓(송신, 수신) 버퍼 (0) | 2020.10.24 |
패킷 유실시 UDP / TCP에서 발생하는 일 (0) | 2020.10.22 |