시작하기 전에
본 글은 배현직 저자님의 게임 서버 프로그래밍 교과서를 읽고 썼습니다.
본 글은 저자님의 요청으로 언제든지 지워질 수 있습니다.
목차
컴퓨터 네트워크 데이터
컴퓨터 네트워크의 품질과 특성
컴퓨터 네트워크에서의 데이터 송수신
게임에서 주로 사용하는 메시지 형식
1. 컴퓨터 네트워크 데이터
컴퓨터 네트워크에서 데이터의 형식은 스트림(stream)과 메시지(message) 형식으로 나뉜다. 각각에 대해서 알아보자.
스트림이라는 것은 두 단말기를 연결한 후 그 연결을 끊기 전까지 한쪽에서 다른 한쪽으로 연결된 데이터의 흐름을 일컫는다. 스트림은 유저가 언제든지 끊을 수 있기 때문에, 스트림 자체는 데이터를 구별할 수 없으며, 보낸 데이터 개수와 받는 데이터 개수, 그리고 보낸 데이터와 받는 데이터의 시작과 끝도 다를 수 있다. 하지만, 받은 데이터를 모두 이어 붙이면 보낸 데이터를 이어 붙인 것과 같다.
이런 특징 때문에 데이터를 송수신할 때, 데이터가 여러 부분으로 나눠져 있다면 유저가 구분을 지어줘야한다. 여기에는 데이터를 보내기 전에 보낼 데이터 크기를 먼저 보내는 헤더(header) 방식과 데이터 시작이나 끝을 알리는 특정 기호를 추가하는 구분자를 이용하는 방식이 있다.
구분자를 이용하게 되면 주의할 점이 있는데, 데이터에 들어 있는 값 중 구분자와 같은 값이 있으면 안된다. 왜냐하면 받는 측에서는 그것을 구분할 수 없기 때문이다. 꼭 써야할 경우 별도의 알고리즘을 사용할 수 있다. 여기에는 base64, escape sequence 등이 있다.
메시지는 각 데이터가 정확히 구별되는 방식이다. 그래서 자체적으로 데이터 시작과 끝을 구별할 수 있고, 보낸 데이터 개수와 받는 데이터 개수, 보낸 데이터와 받는 데이터의 시작 및 끝이 같다. 또, 메시지는 데이터를 여러 필드로 나누어서 사용한다. 게임에서는 특정 시점에서 사건을 알리는 경우가 많아, 이 형식의 데이터 송수신이 보편적이다.
2. 컴퓨터 네트워크의 품질과 특성
컴퓨터 네트워크의 품질을 살펴보기 위한 기준으로는 패킷 유실(packet loss) 비율, 전송 속도(throughput), 전송 지연시간(latency)이 있다. 네트워크 품질은 패킷 유실이 적을수록, 전송 속도가 높을수록, 전송 지연시간이 낮을수록 좋다고 말할 수 있다. 각각에 대해서 살펴보자.
패킷 유실은 패킷을 잃어버린 것을 말한다. 패킷 유실은 네트워크 기기가 처리할 수 있는 한계를 넘어갔을 때나 회선 신호가 약하거나 잡음이 섞일 때 발생할 수 있다. 전자의 경우에는, 스위치나 라우터가 패킷을 버리거나(packet drop), 처리하지 못한 것들을 누적하는 방식으로 처리하게 되는데, 패킷 드롭을 할 경우 패킷이 유실된다. 후자의 경우에는, 체크섬 검사로 오류를 확인하고, 데이터 수정을 시도하게 되는데, 이때 수정이 어렵다면 받은 패킷 혹은 프레임을 버린다. 패킷 유실 비율은 회선 품질이 좋을수록, 경로에 있는 라우터 개수가 적을수록, 라우터의 처리 성능이 좋을수록 낮아진다.
전송 속도는 두 기기 간에 초당 전송될 수 있는 최대 데이터량을 말한다. 초당 비트수(bps) 혹은 바이트 수(B/s)로 표현한다. 또, 두 기기 간 매체인 선로의 종류와 품질이나, 두 기기의 소프트웨어와 하드웨어 종류에 영향을 받는다. 두 단말기 사이의 전송 속도는 두 단말기 사이의 네트워크 기기 중 최소 전송 속도라고 할 수 있다. 전송 속도는 회선의 종류가 좋을수록, 네트워크 기기의 처리 속도가 빠를수록 향상된다.
전송 지연시간은 두 기기 간 데이터를 최소량 전송할 때 걸리는 시간이며, 보통 밀리초(ms)로 표현한다. 전송 지연시간은 매체의 종류와 품질, 두 단말기 사이의 네트워크 기기의 처리 속도에 따라 달라진다. 특히, 매체의 품질이 낮으면 재전송에 의한 전송 지연시간이 발생하게 된다. 두 단말기 사이의 전송 지연시간은 두 단말기 사이에 있는 네트워크 기기의 전송 지연시간의 총합이다. 전송 지연시간은 회선 길이가 길수록, 경로에 라우터 개수가 많을수록, 라우터의 처리 성능이 나쁠수록 높아진다.
요새는 스마트폰이 많이 보급되어, PC뿐만 아니라 모바일로도 네트워크에 접속할 수 있게 되었다. 따라서, 무선 네트워크의 특징도 알아둘 필요가 있다. 무선 네트워크는 전송 지연시간이 높은게 특징인데, 이는 와이파이에서의 데이터 전송 방식인 CSMA(Carrier Sense Multiple Access)에 기인한다. CSMA는 다음과 같이 동작한다.
데이터를 전파로 변환하여 보내기 직전에 안테나를 통해 다른 전파가 감지되는지 확인한다.
전파가 감지되는것이 없으면 전파를 보낸다.
전파가 감지되면 기다린 후 1~2번 과정을 반복한다.
신호를 보낸 후 상대방에게서 ‘신호를 받았음’ 응답이 오는지 체크한다.
응답이 일정 시간동안 없으면 재전송한다.
상당히 불편해 보이지만 이 방식을 사용하지 않으면, 기기들이 신호를 보내는 것이 서로 뒤섞여 신호가 변조되기 때문에 어쩔 수 없다.
3. 컴퓨터 네트워크에서의 데이터 송수신
데이터를 송수신하는 방식에는 UDP(User Datagram Protocol)와 TCP(Transmission Control Protocol)가 있다. 각각 살펴보자.
UDP는 사용자가 정의한 데이터그램을 상대방에게 보내는 통신규약이다. 여기서, 데이터그램이란 것은 마음대로 정할 수 있는 64Kb 이하의 이진 데이터로, 메시지 성질을 가진다. UDP는 패킷 유실이 발생할 수 있지만, 데이터그램 내용이 훼손되지는 않고, 다대다 통신이 가능한 것이 특징이다. UDP는 데이터그램 유실이나 순서뒤바뀜, 중복 수신 현상이 발생해도 괜찮을 때 혹은 전송 지연시간에 민감할 때 사용하는 것이 좋다. 게임에서는 캐릭터 이동, 기관총 난사, 음성 및 화상 데이터 전송 등에 이용한다.
TCP는 송신 쪽 데이터가 수신 쪽에서 완전히 동일함을 보장해주는 통신규약이다. TCP는 연결 지향형(connection-oriented)이기 때문에 일대일 통신만 가능하며, 흐름 제어 기능(data flow control) 때문에, 보낸 데이터가 받는 쪽에서 정확히 모두 도착하는 것을 보장한다. TCP는 UDP와 다르게 스트림 형식이다. 게임에서는 UDP를 사용할 수 있는 상황을 제외하고는 모두 TCP를 사용한다. 재밌는 것은 네트워크 게임에서 거의 모든 메시지 종류는 TCP이지만, 실제 통신량의 대부분은 캐릭터 이동 같은 UDP가 차지한다는 것이다.
패킷 유실 때 UDP와 TCP에서의 현상이 다르다. UDP에서는 패킷 유실이 발생하면 데이터그램 자체가 유실되기 때문에, 데이터그램 크기가 클수록 유실될 확률도 높다. 그와 다르게, TCP는 데이터가 잘 수신되었는지 상시 체크하기 때문에, 패킷 유실을 감지할 수 있다. 다만, 데이터 재전송으로 인한 지연 시간이 발생하게 된다. 그래서, UDP의 평균 지연시간은 네트워크 기기의 지연시간인 반면에, TCP는 네트워크 기기의 지연 시간 + (100% - 패킷 유실 비율) * 재전송 대기 시간이 된다.
4. 게임에서 주로 사용하는 메시지 형식
게임에서 주로 사용하는 메시지 형식에는 텍스트, 바이너리와 메타데이터를 넣는 경우로 나눌 수 있다. 각 형식에 대해 살펴보자.
텍스트 형식은 사람이 읽을 수 있는 방식이다. 그래서, 수신 측에서는 특정 글자가 나올 때까지 글자 검색을 하거나 구문 분석기를 동원하는 것이 일반적이다. 예전에는 게임 개발자가 자체 정의했으나, 요새는 HTTP나 JSON을 사용한다.
바이너리 형식은 이진 데이터로, 구문 분석기가 필요없고, 처리 성능이 좋으며, 통신량이 적다. 또, 해커가 쉽게 읽을 수 없기 때문에 보안이 강하다. 다만, 이런 특성 때문에 디버깅이 까다로운 편이다.
메타데이터는 메시지 내용이 어떤 내용인지에 대한 정보를 말한다. 텍스트 및 바이너리 둘다 메타데이터를 포함할 수 있다. 메타데이터를 넣는 경우 통신량이 많아지고, 해커에게도 더 쉽게 노출되긴 하지만, 하위 호환성 측면에서 유리하다. 물론 대부분의 PC 온라인 게임은 자동 업데이트 프로그램이 실행되기 때문에 하위 호환성을 처리할 일이 드물긴 하나, 모바일 앱은 각 스토어에서 관리하므로 구 버전으로 서버에 접속하는 일이 생기게 된다. 따라서, 메시지 구조에 변화를 가할 때 주의를 기울여야 한다. 메타데이터는 이때 유용하다.
책 구매하러 가기
http://www.yes24.com/Product/Goods/71768958?scode=032&OzSrank=1
'Outdated > Game' 카테고리의 다른 글
[Summary] 게임 서버 프로그래밍 교과서 - Ch4 (0) | 2019.08.28 |
---|---|
[Summary] 게임 서버 프로그래밍 교과서 - Ch3 (0) | 2019.08.14 |
[Summary] 게임 서버 프로그래밍 교과서 - Ch1 (0) | 2019.06.12 |