네트워크 패킷 직렬화
네트워크로 클라이언트와 서버 간 통신에 패킷을 사용한다.
네트워크가 필요로 하는 채팅, 거래, 공격, 이동, 보상 기능을 구현할 때 주고 받을 수 있도록 구현이 필요한데, 서버와 통신하는 데이터 단위가 패킷이다.
실제 물리적으로 통신 덤프를 살펴보면 시그널로 01010111 기계어로 주고 받는 것을 볼 수 있는데. 이 기계어를 해석하여 주소로 상대방과 통신하여 데이터를 해석한다.
프로토콜은 바이트마다 데이터가 어떤 것인지 미리 정해져 있다는 의미로 규약이라고도 한다.
패킷은 20바이트 + 1480바이트 크기로 발송할 수 있다.
바이트는 헤더와 데이터(페이로드) 구조로 이루어져 있다.
만약 데이터 사이즈가 패킷 바이트보다 크면 시퀀스 넘버를 이용해 패킷끼리 묶어 해석한다.
패킷의 구조는 게임같은 경우 커스텀하여 보낸다.
패킷은 헤더의 ID와 Size, 그리고 페이로드를 어떻게 구성할 것인지 정하여 통신할 수 있게끔한다. 페이로드에 담기는 정보는 나의 1번의 캐릭터가 2번 스킬을 이용해 3번의 몬스터를 타격한다는 정보가 담아서 보낸다.
그런데 여기서 문제가 있다.
페이로드로 구성 전 메모리에 있는 데이터는 파편화 되어 있다. 이 파편화를 모아서 패킷 페이로드로 구성을 한다. 이를 직렬화라고 한다.
직렬화시 대표적인 실수는 데이터의 실제 값을 꺼내 발송해야하는데.
실수로 메모리의 참조 값을 꺼내 그것을 페이로드 담아서 보내버리는 일이 많다.
세이브 구현의 메모리 -> 파일I/O 직렬화에서도 동일한 문제가 발생하는데. 참조 값을 저장하여 프로그램을 종료 후 다시 실행해 세이브를 불려오면 전혀 다른 값이 출력하는 엉뚱한 경험을 겪은 적이 있다.
통신 중 원활한 데이터를 주려면 메모리에 있는 데이터를 직렬화하여 패킷의 페이로드로 포장해야 한다.
역직렬화은 직렬화하여 포장한 데이터를 다시 해제하는 작업을 하는 것을 가리킨다.
주로 데이터 해석 사용하거나 역직렬화하여 세이브 로드해 데이터를 메모리에 탑재한다.
직렬화 의미
- 데이터를 포장함
역직렬화 의미
- 포장된 데이터를 해제함
직렬화, 역직렬화 용도
- 세이브
- 리플레이
- 패킷 페이로드