본문 바로가기
게임 서버 공부

[기초] 네트워크

by Dev_Hugh 2023. 11. 22.
728x90
반응형

현재 클라이언트 개발자로 공부를 했으나 학교 인턴에서 서버 개발자로 잠시 인턴을 하면서 서버에 큰 흥미를 느꼈다.

그러나 취업이라는 현실에 클라로 가려 했으나 최근 서버 개발자 신입이 될 수 있지 않을까? 라는 희망에 공부를 조금씩 시작해보려 합니다. 

사실 서버를 본격적으로 공부하면서 게임 서버 포폴을 만들기 위해선 많은 시간이 투자되어야 하지만... 그래도 기초랑 기본기 특히 용어들을 좀 익숙해지자는 마인드로 시작해봅니다!!!

 

먼저 네트워크 프로그래밍을 알기 전 인터넷에서 컴퓨터끼리 어떤 방식으로 소통을 진행하는지 알아야 한다.

인터넷에서 컴퓨터들이 서로 정보를 주고 받는데 쓰이는 통신 규약이 있는데 이 모음을 Internet Protocol Suite(인터넷 프로토콜 스위트)라고 부른다.

 

인터넷 프로토콜 스위트 내부

- 4개의 레이어로 구현된다. (어플리케이션 레이어, 트랜스포트 레이어, 네트워크 레이어, 데이터링크 레이어)

- 어플리케이션 레이어: 게임 서버, 클라 등등 사용자가 직접 만드는 어플리케이션을 의미

- 트랜스포트 레이어: TCP, UDP, send, recv(receive 약자) 등 운영체제 레벨에서 구현된다. send/recv를 할 때 시스템 콜을 한다.

- 네트워크 레이어: 내 테이터들을 보내는 역할을 한다. (클라 -> 서버 or 서버 -> 클라), IPv4 나 IPv6를 사용한다

- 데이터링크 레이어: 실제 하드웨어가 연결. 컴퓨터끼리 물리적인 연결을 말한다.(이더넷, 광통신 등)

 

!! 결국 게임 서버를 만들어 데이터를 주고 받으려면 어플리케이션 레이어에서 데이터를 보내야하는데 다음 과정을 따른다.

1) 트랜스포트 레이어에서 데이터가 어떤 어플리케이션이 사용하는 건지, 몇번째 인지 등등 체크

2) 네트워크 레이어에서 주소값인 IP 헤더가 붙어서 어디서 보내는거고 어디로 보내는건지 확인한다

3) 데이터링크 레이어에서 데이터를 구분하기 위해 Frame 헤더와 Footer가 붙는다고 한다.

(더 정확한 과정은 검색해서 찾아보자... 나는 대략적으로 요약했다.)

 

패킷

- 각 레이어에서 필요한 정보 즉 위에서 말한 각 레이어의 헤더등이 이에 속한다.

- 어플리케이션 레이어에서 프로그래머가 나눠 놓은 데이터 단위도 패킷이다.

- 결론적으론 네트워크를 전송하기 쉽도록 자른 데이터의 전송 단위다

 

패킷 충돌

- 인터넷 표준에서의 패킷과 어플리케이션 레벨에서의 패킷은 같지 않다.

- 패킷은 상대쪽에서 어떤 조합으로 보내는지 알 수 없다. 따라서 받는 쪽에서 이 패킷을 재조립해서 받아야한다.

- 즉 큰 데이터 덩어리를 패킷 단위로 나눠 보내면 받는 쪽에서 이를 원래 데이터에 맞게 재조립해서 봐야함을 의미

 

프로토콜

- Clinet와 Server가 주고받는 데이터의 포맷과 순서를 의미

- 순서보다는 패킷의 포맷 정의가 핵심

- MMORPG에선 수많은 패킷이 존재한다 (로그인, 채팅, Player 관련 등등등...)

- 클라와 서버는 수정이 "동시에" 이뤄져야 한다.

 

프로토콜의 정의 방식

- Binary Format: Byte 단위로 값의 의미를 정의함

- Structure Format: 구조체를 정의하며 구조체 단위로 프로토콜을 공유함

- SDK: OpenSource나 웹에서는 XML, JS 등을 이용하여 정의와 해석을 도와주는 Utility SDK

(Binary랑 Structure 관련해서 수업때 봤던 기억이 있는데... 희미하다 ㅠㅠ)

 

Binary Format

- 언어 / OS / 컴파일러에 구애받지 않는다. 그만큼 관리가 까다롭다.

- Endian에 주의해야 한다. 뭔소리냐면 컴퓨터에 메모리와 같은 1차원 공간에 여러개의 연속된 대상을 배열하는 방식에 대해 주의해야 한다는 것이다. (왜냐면 Binary Format은 사용할 Byte안에 일정 부분마다 값을 정하고 그 포맷 즉 어떤 형식에 맞춰 값을 직접 넣어 Send하니깐, 약간 암호화 한다는 느낌?)

 

Structure Format

- 언어 / OS / 컴파일러에 구애받는다. 그래서 관리가 편하다.

- 구조체 Data Padding이 일어나기 때문에 #pragma pack (push, 1)등으로 해결해줘야 함

 이게 무슨 소리냐면 구조체의 필드를 메모리에 올릴 때 빈 공간없이 쭉 이어어 할당하는 경우도 있으나 대부분 컴파일러는 성능향상을 위해 CPU가 접근하기 쉬운 위치에 필드를 배치하다 보니 중간에 빈 공간이 들어가게 되는데 이 빈 공간이 패딩 비트로 이 패딩 비트때문에 구조체를 전송하고 받을 때 사이즈가 달라지게 되면 문제가 생기는 것을 의미해서 해결 방법을 제시한 것이다.

- 말했듯 언어 / OS / 컴파일러에 따라 구조체 크기를 확인하고 그때 그때 문제를 해결하자...

728x90
반응형

'게임 서버 공부' 카테고리의 다른 글

[기초]소켓 프로그래밍  (0) 2023.11.23