OSI 7계층이란?
·
Camp/Standard
OSI 7 계층이란 무엇인가?개방형 시스템 상호 연결(OSI) 모델은 네트워크 통신을 7개의 계층으로 나눈 개념 모델이다.다양한 하드웨어와 소프트웨어가 장벽을 넘어 통신할 수 있게 하기 위해이를 지원하기 위한 표준이라고 볼 수 있다. 우리가 말이 통하지 않는 외국인과 대화를 시도할 때 기본적으로 영어를 사용하는 것과 같다.서로 문화나 언어가 달라도 영어라는 공용어가 있기에 통신할 수 있게 된다.  왜 중요한가?요즈음의 네트워크는 OSI 모델에 1:1 대응하지 못하는 경우가 많다.그럼에도 중요한 이유는 표준화와 시스템에 대한 이해에 매우 효과적이기 때문이다. OSI 모델은 국제적인 표준이다. 1:1 대응할 수 없다고 하더라도 아예 매치되지 않는 것은 아니다.그리고 계층을 나눠서 시스템을 들여다보면 각 부분..
[C++] Protobuf
·
Study/C++ & C#
Protocol Buffers(Protobuf) 는 실제 라이브 서비스에서도 많이 쓰이는 직렬화 메커니즘이다. 프로토 버프를 프로젝트에 올려가면서 직렬화에 대해 공부했던 내용과 비교하며 익혀보자. 1. 다운로드 protobuf는 공식 Github Repo에서 받을 수 있다. 릴리즈 페이지로 가서 아래의 파일을 다운해야 한다. 지금은 최신 버전이 아니라 구버전을 사용할 것이다. 저 파일을 받아주자. 뒤의 c는 컴파일러라는 의미이다. 구조를 던져주면 그걸 컴파일하여 자동으로 코드를 생성해 준다고 생각해도 될 것이다. 저 파일을 다운 받아서 적당한 곳에 압축을 풀어주자. 압축을 풀고 나서 bin 폴더 안에 보면 exe 파일 하나만 덩그러니 있을 것이다. 그 파일이 소스코드를 자동으로 만들어 줄 것이다. 2. ..
[C++] Packet Serialization
·
Study/C++ & C#
직렬화라는 개념은 통신에서만 중요한 것이 아니다. 파일 입출력을 할 때도 매우 중요한 개념이다. 하지만 지금 공부하는 부분은 서버이기 때문에 통신에 있어서의 패킷 직렬화에 대해 알아보자. 1. 패킷 직렬화란? 메모리에 있는 데이터를 패킷에 일렬로 차곡차곡 쌓아 하나의 바이트 배열로 만드는 것을 패킷 직렬화라고 한다. 어 그렇다면 우리가 기존에 버퍼에 데이터를 넣어 보내던 것도 패킷 직렬화가 아닌가? PacketHeader* header = bw.Reserve(); // id(uint64), 체력(uint32), 공격력(uint16) bw > hp >> attack; 다시 우리가 활용할 수 있는 형태로 이렇게 빼서 저장하면 역직렬화(Deserialization) 한 것이다. 지금까지 우리가 한 것들은 기초..
[C++] Unicode / Encoding
·
Study/C++ & C#
가변 길이 데이터를 다루는 데 있어서 문자열은 매우 중요한 요소 중 하나라고 할 수 있을 것이다. 문자 집합이 뭔지, 인코딩이 뭔지에 대해서 정리해 보고 실제로 코드를 작성해 보자. 1. 익숙한 친구들부터 우리는 문자를 표현하기 위해 처음 프로그래밍을 배울 때부터 「char」라는 자료형을 써왔다. 익숙하지만 데이터를 어떻게 저장하는지에 대해서 깊게 고민해 본 사람이 얼마나 될까? 어떤 문자 집합을 사용하는지, 애초에 문자 집합과 인코딩을 제대로 구분하는 사람이 일반적으론 드문 것 같다. 아래의 다양한 자료형의 문자열을 통해 알아보자. char sendData[1000] = "가"; char sendData1[1000] = u8"가"; WCHAR sendData2[1000] = L"가"; TCHAR sen..
[C++] Packet Handler
·
Study/C++ & C#
클라이언트와 서버는 많은 종류의 패킷으로 통신하게 될 것이다. 각 패킷 ID(OPCODE) 별로 일일이 분기시키고, 반복된 코드를 계속 작성하게 된다면 매우 비효율적일 것이다. 패킷을 보다 효율적으로 관리할 수 있게 해 줄 핸들러 클래스를 작성한다. 1. 클래스 작성 서버 클라 양쪽에 핸들러를 만들어 둘 것이다. 1-1. Client #pragma once enum { S_TEST = 1 }; class ClientPacketHandler { public: static void HandlePacket(BYTE* buffer, int32 len); static void Handle_S_TEST(BYTE* buffer, int32 len); }; ID 열거형의 네임 컨벤션은 아래와 같다. S_TEST - (..
[C++] Buffer Helpers
·
Study/C++ & C#
2023.07.08 수정 rValue Ref와 Universal Ref가 혼동된 부분 수정. 패킷 직렬화 공부 과정의 첫 삽을 뜨게 됐다. Protobuf를 사용하면 어느 정도는 그냥 넘어갈 수도 있겠으나, 동작 원리와 그 장단점에 대해 아는 것이 중요하다는 그 말이 가슴에 남는다. 결국 알아야 더 잘 사용할 수 있는 게 아닐까. 1. 본격적으로 들어가기 전에 기존에 구현한 버퍼를 사용하는 방법에 대해 돌아보자. SendBufferRef sendBuffer = GSendBufferManager->Open(4096); BYTE* buffer = sendBuffer->Buffer(); ((PacketHeader*)buffer)->size = (sizeof(sendData) + sizeof(PacketHead..
[C++] Overlapped Model
·
Study/C++ & C#
이 모델은 이전의 Select 계열의 모델보다 더 한방에 이해하기 어려운 것 같다. 제대로 이해하고 쓰는 것이 아니라, 잊어먹기 전에 최대한 메모해 둔다는 느낌으로 작성한다. Overlapped 모델엔 이벤트 기반과 콜백 기반 2가지 방식이 있다. 이벤트 기반에 대해서 먼저 작성한다. 1. Overlapped 모델의 개념 Overlapped 모델은 기본적으로 비동기와 논 블로킹이 조합된 형태의 모델이다. 반면에 이전의 Select 계열 모델들은 논 블로킹이었지만 비동기는 아니었다. Ovelapped 모델은 아래와 같이 동작한다. Overlapped 모델은 미리 함수를 걸어(실행) 둔다. WSARecv, WSASend 함수가 성공했는지 확인 2-1. 성공했다면 결과를 가져와서 처리 2-2. 실패했다면 그 ..