네트워크 구성 기기
단말기와 네트워크 기기로 구분된다.
단말기는 쉽게 생각해서 pc와 핸드폰 같은 통신 기기(클라이언트 or 서버)인데, 이를 하나의 노드라고 생각해보자. 네트워크 기기는 네트워크 스위치라는 것으로 다른 단말기들 사이를 연결해주는 다리 역할이다.
주로 이런 그림(LAN)이 하나의 단위라고 생각하자. 이런 그림이 여러개가 연결되어 있는 것을 광역망(WAN)이라 하고, 현재 우리의 네트워크 망은 저위의 그림 단위 하나하나가 복잡한 그림으로 연결되어 있는 형태(인터넷)이다. 마치, 하나의 분자구조가 얽히고 섥혀 하나의 세포를 구성하는 것 처럼 말이다.
OSI모델
컴퓨터 네트워크 통신에 대한 국제 표준. 이 표준만 잘 지키면 어떤 기기든, 어떤 형태의 통신 선로를 사용하든 컴퓨터 간 통신을 할 수 있다.
- 계층 1 물리: (하드웨어) 보낼 데이터를 어떤 파형의 전류로 보낼지 정의
- 계층 2 데이터 링크: LAN에서 통신이 가능하게 한다.
- 각 단말기는 고유한 주소를 갖고 있다.
- 단말기는 데이터를 프레임이라는 단위로 주고받는다. 프레임은 헤더와 페이로드로 구성되어 있는데, 헤더에는 수신자와 송신자가 있고 페이로드에는 단말기가 보내고자 하는 데이터가 있다.
- 계층 3 네트워크: 광역 통신망(WAN)에서 통신이 가능하게 한다.
- 직접 데이터를 건네는 것이 아니라 계층적으로 데이터를 건네주는 방식으로 작동한다. 이러한 일을 담당하는 네트워크 기기를 라우터라 한다. 라우터는 서로 다른 LAN 사이에 컴퓨터 통신을 할 수 있게 하는 장비이다.
- 데이터는 IP 패킷 형태로 포장되어 전달된다.
- 계층 4 전송: 상대방에게 데이터가 반드시 가게 한다.
- 계층 5 세션, 계층 6 표현, 계층 7 응용: 응용 프로그램이나 운영체제 안 모듈이 다른 컴퓨터의 응용 프로그램이나 운영체제 모듈과 통신을 하는 동안 논리적 연결 단위나 기능들을 다룬다.
정리 해서 비유하자면, 택배를 보낼 때, 어떤 우체국을 사용할지(1계층) 정한 후에, 보낼 내용물과 보낸는 사람과 받는 사람을 기재하고 (2계층) 우체국에서 배달하는 과정을 거치고(3계층) 배송물을 집앞까지 배송(4계층) 이라고 쉽게 비유할수 있다.
컴퓨터 네트워크
2가지 데이터를 보내는 형식을 가지고 있다. 스트림과 메세지이다.
스트림이란 데이터의 흐름이다.
두 단말기를 연결한 후 그 연결을 끊기 전까지 한쪽에서 다른 한쪽으로 연결된 데이터 흐름 하나를 말한다.
한 단말기에서 보낸 데이터와 다른 한 단말기에서 받은 데이터가 다를 수 있다.
하지만 보낸 데이터를 모두 이어 보면 받은 데이터를 모두 이은 것과 같다. 따라서 스트림 형식으로 데이터를 송수신할 때, 데이터가 여러 부분으로 나뉘어 있다면 이것을 구분해야 한다.
- 헤더를 붙이는 방식은 어떤 데이터를 보내기 전에 보낼 데이터 크기를 먼저 보내는 방식이다.
- 구분자를 이용하는 방식은 데이터의 시작이나 끝을 알리는 특정 기호를 추가하는 방식이다.
메시지는 스트림과 달리 자체적으로 데이터 시작과 끝을 구별할 수 있다.
보낸 개수와 받는 개수가 같으며 보낸 데이터와 받는 데이터의 시작과 끝도 같다.
네트워크 게임에서는 특정 시점에서 사건을 알리는 경우가 많다. 그러다 보니 메시지 형식의 데이터 송수신이 보편적이다.
IP 패킷
IP 패킷 하나의 크기는 제한되어 있다. 하지만 스트림이나 메시지에는 이러한 제한이 없다.
운영체제에 내장된 네트워크 모듈인 네트워크 스택에서 관리해 주기 때문이다.
예를 들어 프로그램이 매우 긴 스트림을 송신할 때 운영체제는 IP 패킷 크기 제한에 맞춰 단편화를 한다. 각 조각은 IP 패킷 하나하나가 되어 송신되고 받는 쪽에서는 이 조각들을 받아 조립한 후 스트림 형태로 복원한다.
덕분에 개발할 때 패킷 크기 걱정을 덜게 된다.
컴퓨터 네트워크 식별자
컴퓨터 네트워크 식별자, 즉 주소는 인터넷에서 고유하다. 그러나 IP 주소만으로 네트워크 프로그램을 개발하기에는 부족하다. 단말기 안에서 작동하는 프로세스는 여러 개인데, 이 중 누가 보낸 것인지 모르기 때문이다. 한 IP 주소 안에서도 누가 주고받는 것인지 식별하는 역할을 하는 것이 바로 포트(port)이다. 이때 IP 주소와 포트는 'IP주소:포트' 형식으로 표현하며 이를 끝점(endpoint)이라 부른다.
컴퓨터 네트워크의 품질과 특성
네트워크 품질 기준 세 가지는 다음과 같다.
- 전송 속도(스루풋): 전송될 수 있는 데이터의 단위 시간당 총량을 의미한다.
- 패킷 유실률: 전송되는 데이터가 중간에 버려지는 비율이다.
- 레이턴시: 전송되는 데이터가 목적지에 도달하는 데 걸리는 시간이다.
- 지터 (Jitter) - 디지털 펄스 신호 파형이 시간축상으로 흐트러지는 현상 (패킷 지연(Delay)이 일정하지 않고, 수시로 변하고, 패킷 간의 간격이 일정하지 않는 현상 - 이는 지연변이 라는 용어로 더 잘 알려져 있음)
컴퓨터 네트워크에서 데이터 보내기와 받기
UDP와 TCP
UDP는사용자가 정의한 데이터그램을 상대방에게 보낼 수 있게 하는 통신 규약(프로토콜)이다. 이때 데이터그램은 64킬로바이트 이하의 이진 데이터로 메시지 성질을 가진다. 즉, 데이터 일부가 뭉치거나 쪼개지지 않는다.
데이터를 주고받으려면 소켓을 생성해야 한다. 소켓은 단말기 사이에 통신할 수 있게 운영체제에서 제공하는 자원이다.
UDP는 하나의 UDP 소켓을 이용해 데이터를 보내고 받는 것이 가능하다. 즉, 수신용 송신용 소켓을 따로 만들지 않아도 된다. 그리고 다대다 통신이 가능하므로 상대방의 끝점만 알면 계속 보내도 무방하다.UDP의 문제점은 패킷 유실 현상이 발생할 수 있다는 점이다. 데이터그램 일부를 받지 못하거나 두 번 이상 받을 수가 있다. 심지어 보낸 순서와 다르게 받을 수도 있다.
따라서 패킷 유실 현상이 발생해도 문제없을 때만 UDP를 사용하는 것이 좋다. 예를 들어 캐릭터 이동이나 음성 메시지가 있는데, 패킷 유실이 발생하더라도 뒤에 오는 데이터로 보여주면 유저는 크게 불편함을 느끼지 않을 것이다.
아래는 소켓을 이용해 UDP를 사용하는 방법이다.
UDP의 문제점인 패킷 유실 현상은 TCP를 이용해 해결할 수 있다.
TCP는 보내는 쪽 데이터가 받는 쪽에서 완전히 동일함을 보장해 주는 프로토콜이다. 데이터는 스트림 형태로 데이터를 뭉치거나 쪼갤 수 있다.
TCP는 데이터를 주고받기 전에 연결 과정을 먼저 해야 하며 이를 연결 지향형이라 한다. 이때 연결은 일대일 통신만 가능하다.
UDP와 TCP 모두 계층 4에 위치하며 인터넷 프로토콜(IP, 계층 3) 위에서 작동한다. 그래서 UDP는 IP 패킷 유실이 발생할 경우 UDP 데이터그램도 덩달아 드롭된다. 하지만 TCP는 데이터가 상대방에게 정확히 전송된다. 이것이 가능한 이유는 TCP의 흐름 제어 기능 때문이다.
TCP에서 보낼 스트림 데이터는 세그먼트라는 IP 패킷에 넣을 수 있는 크기의 단위로 쪼개진다. 그리고 IP 패킷 안에 세그먼트를 넣어 수신자에게 전송된다. 수신자는 IP 패킷을 받아 세그먼트를 꺼내고 받은 세그먼트 응답(ack)을 송신자에게 반송한다. 보낸 쪽에서는 일정 시간 안에 세그먼트에 대한 ack가 회신되지 않으면 응답이 올 때까지 다시 보낸다.
TCP의 수신 방법은 다음과 같다.
- 데이터를 보내기 전 상대방과 연결이 필요하다. connect(addr) 함수를 호출하여 연결을 시도하며 성공할 때까지 블로킹된다.
- send() 함수를 이용해 데이터를 보낸다. 이미 connect()으로 끝점을 지정했기 때문에 끝점 인자는 필요 없다.
TCP도 UDP와 동일하게 소켓 하나로 송수신이 모두 가능하다. UDP는 패킷 유실이 있어도 괜찮은 곳에서 사용한다. 그 외의 모든 경우에는 대부분 TCP를 사용한다.
네트워크 주소 변환
네트워크 주소 변환(Network Address Translation)이란 다른 단말기로 전송되던 패킷의 송신자 주소나 수신자 주소가 다른 것으로 변환되는 과정을 의미한다. NAT 변환을 하는 기기를 NAT 라우터(공유기)라 한다.
NAT 라우터가 하는 일은 IP 주소 1개를 여러 기기가 공용하도록 만들어 주는 것이다.
'Game Dev > Game Server' 카테고리의 다른 글
게임 서버 프로그래밍 교과서 - 5장) 게임 네트워킹 (0) | 2023.09.24 |
---|---|
게임 서버 프로그래밍 교과서 - 4장) 게임 서버와 클라이언트 (0) | 2023.09.16 |
게임 서버 프로그래밍 교과서 - 3장) 소켓 프로그래밍 (0) | 2023.09.16 |
게임 서버 프로그래밍 교과서 - 1장) 멀티 쓰레딩 (0) | 2023.08.20 |