컴퓨터 네트워크
1. 네트워크를 구성하는 기기
컴퓨터 네트워크 구성 방법
직접 네트워크 케이블로 연결
단말기 두 대밖에 작동하지 못함
링 위상에서 통신
세 대 이상 간에 통신 가능
네트워크 기기 사용
네트워크 기기가 단말기들과 네트워크 케이블(랜선)으로 연결
LAN(Local Area Network)
네트워크 스위치 하나를 두고 별 위상(Start Topology)을 취함
가까운 지역을 묶는 대표적인 컴퓨터 네트워크
OSI(Open Systems Interconnection reference) 모델
컴퓨터 네트워크 통신에 대한 국제 표준
LAN이 성립하려면 OSI Layer 2를 지켜야 함
OSI 모델
Layer1 : 물리 계층
Layer2 : 데이터 링크 계층
- LAN에서 통신을 가능하게 함
Layer3 : 네트워크 계층
- 광역 통신망(WAN)에서 통신을 가능하게 함
Layer4 : 전송 계층
상대방에게 데이터가 반드시 도착하게 함(전달책임)
Layer5 : 세션계층
다른 컴퓨터의 응용 프로그램이나 운영체제 모듈과 통신을
하는 동안 논리적 연결 단위나 기능을 다룸
프로그램을 만드는 행위가 일어나는 계층
OSI 모델의 계층 2
특징
- 각 단말기는 고유한 주소를 갖는다
- 단말기는 데이터를 프레임이라는 단위로 주고 받는다
프레임
헤더
송신 주소와 수신 주소를 포함
페이로드
보내려는 데이터
WAN
서로 다른 LAN이 맞물려 연결된 통신망
서로 다른 LAN 안에 있는 각 단말기들의 주소를 모두
고유하게 만들긴 어렵다
새로운 규약이 필요하다
OSI 모델의 계층 3
특징
- 계층적으로 데이터를 건네주는 방식
- 라우터가 이러한 일을 한다
라우터
- 서로 다른 LAN 사이에 컴퓨터 통신을 할 수 있게 하는 장비
인터넷 프로토콜(IP)
- 8비트 숫자 4개로 구성된 주소
- 데이터를 다른 단말기로 보내려면 IP 패킷 형태로 포장
2. 컴퓨터 네트워크 데이터
스트림 형식
정의
데이터의 흐름. 두 단말기를 연결한 후 그 연결을 끊기 전까지
한쪽에서 다른 한쪽으로 연결된 데이터 흐름 하나
스트림 자체는 데이터를 중간에 구별하지 않는다
- 스트림을 보낸 개수와 받는 개수는 다를 수 있다
- 보낸 데이터의 시작과 받는 데이터의 시작이 다를수도 있다
- 받은 데이터를 모두 이어 붙이면 보낸 데이터를 이어 붙인 것과 같다
스트림 송수신시 데이터가 여러 부분으로 나뉘어있다면
헤더를 붙이는 방식
보낼 데이터 크기를 먼저 보내는 방식
구분자를 이용한 방식
데이터 시작이나 끝을 알리는 특정 기호를 추가하는 방식
구분자를 제외하고 보낼 데이터는 구분자와 같은 값이 없어야한다
메시지 형식
특징
스트림과 달리 자체적으로 데이터 시작과 끝을 구분할 수 있다
보낸 개수와 받는 개수가 같으며, 보낸데이터와 받는 데이터의 시작과
끝은 같다
수신자 주소
- 수신 측 단말기까지 전달할 때 라우터에서 필요한 정보
- 수신측 단말기까지 도착한 후 수신자 측에서 송신자를 식별하는 용도
IP 패킷
크기는 제한적이다. 스트림이나 메시지는 이러한 제한이 없다
단편화
프로그램이 매우 긴 스트림을 송신할 때 운영체제가 이를 IP 패킷의
크기 제한에 맞추어 여러 조각을 내는 것
3. 컴퓨터 네트워크 식별자
IPv4
1바이트 숫자 4개의 조합
IPv6
IPv4 주소 한계를 극복하기 위해 등장한 표준
2^128개의 주소형식
위 두 프로토콜은 서로 호환되지 않는다
포트
- 한 IP 주소 안에서도 누가 주고받는 것인지 식별하는 역할을 하는 것
- 2바이트 정수이다 (65535 이하의 값)
끝점(End Point)
- IP 주소와 포트를 같이 표현하는 방법
호스트 네임
- 영어 단어 형식의 기기 주소
DNS(Domain Name Server)
- 호스트 이름을 IP 주소로 변환 해 주는 서버
4. 컴퓨터 네트워크의 품질과 특성
네트워크 품질을 저해하는 것들
처리할 수 있는 한계를 넘는 데이터가 수신
자기가 처리할 수 있는 것 이상을 그냥 버린다(패킷 드롭)
아직 처리하지 못한 것들을 메모리에 누적한다
가정용 라우터는 처리할 수 있는 양 이상의 패킷이 도착하면
메모리를 누적시키는 경우가 있다
외부에서 잡음
신호가 약해짐
오류는 계층 2나 계층 3의 체크섬 검사로 확인 가능
수정하기 어려운 패킷 혹은 프레임은 그냥 버린다
패킷 유실률
- 네트워크 기기가 처리할 수 있는 한계를 넘어가면 패킷 유실 발생
- 회선 신호가 약하거나 잡음이 섞이면 패킷 유실 발생
전송속도와 전송지연시간
전송속도
두 기기 간에 초당 전송될 수 있는 최대 데이터양
전송속도에 영향을 주는 것
- 선로의 종류와 품질
- 두 기기의 소프트웨어와 하드웨어 종류
레이턴시
두 기기 간에 데이터를 최소량 전송할 때 걸리는 시간
레이턴시에 영향을 주는 것
- 매체의 종류와 품질
- 송신자-수신자 사이의 라우터 처리속도
- 매체 품질이 낮으면 재전송에 의한 레이턴시로 이어진다
두 단말기 사이의 레이턴시
두 단말기 사이에 있는 네트워크 기기의 레이턴시 총합
두 단말기 사이의 스루풋
두 단말기 사이의 네트워크 기기 중 최소 스루풋
네트워크 품질 기준 세가지
- 전송 속도(스루풋)
- 패킷 유실률
- 레이턴시
5. 컴퓨터 네트워크에서 데이터 보내기와 받기
UDP 네트워킹
User Data Protocol. 사용자가 정의한 데이터그램을 상대방에게
보낼 수 있게 하는 통신 규약
스트림이 아닌 메시지 성질을 가짐
- 데이터 일부가 뭉치거나 쪼개지지 않는다
- 중간에 데이터그램 유실이 생길 수 있다
다대다 통신이 가능하다(멀티캐스팅)
사용법이 간단한 반면, 데이터 유실 또는 순서 뒤바뀜 문제가 생긴다
소켓
- 단말기 사이에 통신할 수 있게 운영체제에서 제공하는 자원
TCP 네트워킹
보내는 쪽 데이터가 받는 쪽에서 완전히 동일함을 보장해 주는 프로토콜
'연결' 과정이 필요하다. 연결 지향형
연결은 일대일만 가능하다
메시지 형태가 아니라 스트림 형태이다
흐름제어기능을 통해 데이터가 상대방에게 정확히 전송됨
세그먼트
IP 패킷에 넣을 수 있는 크기의 단위
IP 패킷안에 세그먼트를 넣어서 송신한다
ACK(Acknowledge)
세그먼트를 꺼내 받은 세그먼트 응답을 송신자에게 반송
일정 시간안에 ack가 회수되지 않으면 상대방이 받았다는 응답이
올 때까지 다시 세그먼트를 보낸다.
6.패킷 유실 시 UDP와 TCP에서의 현상
UDP에서는 데이터그램 자체가 유실
TCP에서는 패킷 유실이 발생하면 유실된 패킷에 대한 ACK가 도착하지 않는다
재전송 -> 재전송 시간만큼 지연 시간이 발생
UDP는 주로 레이턴시가 민감하거나 패킷 유실이 있어도 괜찮은 곳에서 사용
대부분 경우 TCP 사용
7.주로 사용하는 메시지 형식
HTTP JSON 같은 표준화된 형식을 쓰는 것이 일반적
바이너리 형식 장단점
- 사람이 읽기 어렵다
- 디버깅이 까다롭다
- 처리 성능이 낫다
- 통신량도 적다
메타데이터
메시지가 자신이 어떤 내용을 담고 있는지에 대한 정보
버전이 달라도 메시지를 받는 쪽에서 일부 필드를 이용하여
정확한 정보를 얻을 수 있다
서버에서 메시지 안에 원하는 내용 일부가 있는지 없는지에 따라
작동을 다르게 만들어 준다면 버전1과 버전2의 클라이언트를
동시에 처리할 수 있음
8. 네트워크 주소 변환
네트워크 주소 변환(NAT)
다른 단말기로 전송되던 패킷의 송신자 주소나 수신자 주소가
다른 것으로 변환되는 과정을 의미한다
EX) 인터넷 공유기
NAT 라우터가 하는 일
IP 주소 1개를 여러 기기가 공용하도록 만들어 줌
포트 매핑 엔트리
송신자 끝점과 수신자 끝점을 이어 주는 매핑 정보를 생성
홀펀칭
포트 매핑 엔트리가 만들어지는 과정
홀펀칭을 왜 하는가?
공유기로 인해 가려진 호스트와 통신을 하기 위해서
NAT을 사용하는 경우 Packet을 내보내는건 가능하지만 Packet을 받아오는건 문제가 된다.
왜냐하면 상대방 쪽에서는 NAT에 의해 가려진 client의 private endPoint를 모르기 떄문이다.
상대방에게 먼저 NAT을 거쳐 통신을 하게된다면 NAT은 port를 바인딩하고 출발/목적지 IP Port를 매핑하여 들고 있다가 상대방이 내게 패킷을 보내면 NAT이 매핑 정보를 보고 private endPoint에 패킷을 전달하게 된다.
P2P 환경에서는 패킷을 서로 보낼 수는있는데 받을 방법이 없다.
따라서 고정 IP를 가지는 서버 하나를 두고 두 클라이언트가 서버에 패킷을 보내면 서버는 보내려는 목적지 EndPoint를 상대방에게 알려주는 식으로 연결을 하게 된다.
즉, 특정 서버에 연결을 하는게 아니라 서버를 통해 EndPoint를 받고 그 지점에다가 P2P 연결을(UDP 프로토콜 방식) 거는 것
이러한 서버를 STUN Server라 하고 이 방식을 홀펀칭이라고 한다.
NAT에 따라 홀펀칭이 먹힐수도 안먹힐 수도 있다.
홀펀칭이 먹히지 않을 때 Relay Server를 하나 두고 통신을 할 수 밖에 없다. Relay Server를 두는 네트워크 방식은 사실 P2P가 아니기에 의미가 없다.
홀펀칭은 UDP관련 기술이다.
'게임 서버 프로그래밍 > 게임 서버 프로그래밍 교과서' 카테고리의 다른 글
#6. 프라우드넷 (0) | 2020.02.17 |
---|---|
#5. 게임 네트워크 (0) | 2020.02.17 |
#4. 게임 서버와 클라이언트 (0) | 2020.02.17 |
#3. 소켓 프로그래밍 (0) | 2020.02.17 |
#1 프로그램과 프로세스 (2) | 2020.02.17 |