본문 바로가기

Network

(8)
[Network] 레이턴시 레이턴시는 관측 가능한 사건의 원인이 발생한 후 그 효과가 실제 관측되는 데까지 걸리는 시간입니다. 게임에서 레이턴시는 상당히 민감한 문제입니다. 만약, FPS 등의 게임에서 레이턴시가 높게 유지된다면 플레이어는 프레임 레이트가 아무리 높아도 반응이 느리다고 느낄 것입니다. 이러한 레이턴시가 발생하는 원인을 알아보겠습니다. 네트워크의 원인 멀티플레이 게임에서는 보통 발신지에서 출발한 패킷이 이동하는 과정에서 겪게 되는 지연이 레이턴시의 가장 큰 원인이 됩니다. 패킷이 생성되어 사라질 때까지 주로 겪는 지연 사항들입니다. 1. 처리 지연(processing delay) 발신 주소를 알아내고 적절한 경로를 결정하는데 시간이 걸리거나, 네트워크 주소 변환이나 암호화에 걸리는 시간입니다. 라우터의 처리 속도가 ..
[Network] 네트워크 토폴로지 멀티플레이 게임에서 중요하게 다루어야 할 문제가 있습니다. 플레이어들 사이에서 게임 상태 갱신을 어떻게 처리할지, 객체 리플리케이션을 써야할지, 입력 상태만 공유할 것인지, 컴퓨터 상호 간에 전달된 게임 상태가 어느 한쪽에서 올바르지 않다고 판단되면 어떻게 해야 할지 등의 문제들이 있습니다. 네트워크 토폴로지(network topology)란 컴퓨터 네트워크의 요소들을 물리적으로 연결해 놓은 것, 또는 연결 방식을 말합니다. 게임 분야로 한정한다면, 게임에 접속한 컴퓨터들을 어떤 구조로 연결할지 정한 뒤, 그 플레이어들이 최신 상태를 공유하게끔 구조화하는 방식입니다. 클라이언트 - 서버(CS) 토폴로지 게임 인스턴스 하나를 서버로 두고 나머지 게임 인스턴스는 그 서버에 접속하는 클라이언트가 됩니다. 각 ..
[C++/Network] 객체 리플리케이션 리플리케이션은 객체의 상태를 한 호스트에서 다른 호스트로 복제 전달하는 것입니다. 직렬화를 하기 전 리플리케이션을 하기 위해 호스트는 다음의 준비 작업이 필요합니다. 1. 패킷 1. 패킷에 객체의 상태를 담은 패킷이라고 표기 리플리케이션이 아닌 다른 목적으로도 통신을 할 수 있기 때문에, 아래의 열거자를 사용해 패킷의 종류를 확인할 수 있게 합니다. // PT_HELLO : 관례로 호스트가 서로 접속하면 맨 처음에 일종의 '인사' 패킷을 주고받는 것입니다. // PT_ReplicationData : 데이터를 리플리케이션 하겠다는 것입니다. // PT_Disconnect : 연결 해제 절차를 요청하는 것입니다. // PT_MAX : 패킷 종류 열거형의 최댓값입니다. enum pakcetType { PT_H..
[C++/Network] 객체 직렬화 직렬화(serialization)란 어떤 객체가 랜덤 액세스(random access) 가능한 현태로 메모리상에 존재할 때, 이를 일련의 여러 비트로 변환해 길게 나열하는 것입니다. 외부의 시스템이 이용할 수 있는 포맷으로 변환하는 작업이라고 할 수 있습니다. 직렬화 직렬화가 필요한 이유는, 아래와 같은 플레이어 상태에 대한 클래스 PStatus가 있다고 해보겠습니다. 이를 직렬화 없이 다른 호스트로 전송을 한다면 다음과 같은 방법으로 전송을 할 것입니다. class PStatus { public: PStatus() { hp = 10; mp = 10; } private: int hp; int mp; }; void send_obj(SOCKET s, const PStatus* ps) { send(s, rei..
[C++/Network] UDP 소켓과 TCP 소켓 [이전 글] [C++/Network] Berkeley Socket (버클리 소켓) 소켓을 만들어 바인딩하는 과정까지 진행했습니다. 이번에는 UDP 소켓과 TCP 소켓을 만들어보도록 하겠습니다. UDP 소켓 UDP 소켓은 연결을 유지하지 않고도 데이터를 보낼 수 있습니다. 소켓은 호스트마다 하나의 소켓만 있으면 데이터를 주고받을 수 있지만, 신뢰성을 보장할 수 없습니다. UDP 소켓은 만든 즉시 데이터를 보낼 수 있습니다. 바인딩 되어있지 않다면, 네트워크 모듈이 자동으로 포트를 찾아 바인딩해줍니다. 데이터를 보낼 때 사용하는 함수는 sendto 입니다. // sock : 데이터그램을 보낼 소켓입니다. 바인딩되지 않았다면 라이브러리가 자동으로 바인딩해줍니다. // 이 때 바인딩한 주소와 포트는 발신자 주소..
[C++/Network] Berkeley Socket (버클리 소켓) [이전 글] [Network] TCP/IP 스택과 네트워크의 계층 구조 네트워크 프로그래밍에서 빠질 수 없는 것이 바로 소켓입니다. 소켓은 버클리 대학에서 만들어져 Berkeley Socket 이라는 이름으로 BSD 운영체제(특히 UNIX)에서 처음 배포되었습니다. 그랬던 것이, 오늘날 네트워크 프로그래밍의 사실상의 표준으로 자리매김했습니다. 네트워크 통신을 위해 프로세스는 실행 도중에 하나 이상의 소켓을 만들고 초기화해 소켓 API로 제어합니다. 이렇게 만들어진 소켓으로 데이터를 읽고 쓰게 됩니다. 즉, 소켓은 데이터가 통신할 수 있도록 연결해주는 인터페이스라고 할 수 있습니다. 서론은 여기까지. 바로 소켓의 사용법을 알아보겠습니다. 0. 소켓 라이브러리 윈도우 운영체제에서는 C++로 소켓 프로그래밍을..
[Network] TCP/IP 스택 [이전 글] [Network] Packet Switching (패킷 스위칭) TCP/IP 스택은 앞서 패킷 스위칭에서 언급했듯, 네트워크의 각 노드가 어떻게 데이터 패킷을 꾸릴지, 어떻게 네트워크를 통해 보낼지 등을 정형화해둔 프로토콜들이 발전한 것이라고 했습니다. 프로토콜은 컴퓨터 내부에서, 또는 컴퓨터끼리의 데이터를 교환할 때 그 방식을 정의한 규칙입니다. 정리하면, 네트워크에서 데이터를 송수신하는 데에 필요한 규칙들을 모아놓은 것이 TCP/IP입니다. TCP/IP 스택의 계층은 링크 계층, 인터넷 계층, 전송 계층, 응용 계층이라는 4개의 계층으로 구분됩니다. 이들은 하위 계층의 기능을 이용해 상위 계층에게 기능을 제공합니다. 일반적으로 하위 계층은 하드웨어로, 상위 계층은 소프트웨어로 구현됩니다...
[Network] Packet Switching (패킷 스위칭) 인터넷은 1960년대 후반, 미 국방부에서 만들었던 ARPANET이 시초입니다. ARPANET의 개발 목적은, 지리적으로 떨어져있는 컴퓨터끼리 풍부한 정보를 교환하기 위함이었습니다. 또 다른 이유로는 핵전쟁 등과 같은 상황에서 한 컴퓨터가 끊어져도 다른 컴퓨터에서는 연결이 유지되게 하기 위해서 만들어졌습니다. 이를 위해서 필요한 기술이 패킷 스위칭이었습니다. 패킹 스위칭이 나오기 전까지는 circuit switching(서킷 스위칭)이라는 방식을 사용했습니다. 서킷 스위칭은 정보를 송수신하는 과정에서 송수신 단말 사이에 회로(circuit) 연결을 해두고 정보 전달을 수행합니다. 이 회로는 회선을 길게 짜 맞춰 연결한 것으로, 송수신이 일어나는 동안 연결이 유지되는 방식이었습니다. B에서 D로의 통신이 ..