2.3 컴퓨터 네트워크 데이터

OSI 모델의 2계층에서는 데이터 단위를 프레임이라 하고, 3계층에서는 패킷이라고 한다.

프로그래머는 이것들 대신 스트림과 메세지라는 것을 주로 다룬다.

 

2.3.1 스트림 형식

스트림 : 두 단말기를 연결한 후 그 연결을 끊기 전까지 한쪽에서 다른 한쪽으로 연결된 데이터 흐름

 

컴퓨터 네트워크에서 스트림의 개념은 파일의 스트림과 다르다.

ㄴ 데이터가 여러 부분으로 

ㄴ 스트림 송신 횟수와 수신 횟수가 불일치할 수 있다.

 

데이터가 여러 부분으로 나뉘어질 수 있다면 사용자가 어떻게 받을지 정의를 해주어야 한다.

ㄴ 데이터의 크기를 헤더로 붙이는 방식

ㄴ 구분자를 이용하는 방식

 

2.3.2 메세지 형식

보낸 데이터의 수와 받는 데이터의 수가 같다. (각 데이터가 정확히 구별된다)

 

 

운영체제에 내장된 네트워크 모듈인 네트워크 스택에서 프로그램이 보내고 받는 스트림과 메세지를 관리해주기 때문에

IP패킷의 크기가 제한적이더라도 스트림이나 메세지에서는 크기 제한이 없다.

 

프로그램이 매우 긴 스트림을 송신할 때 운영체제는 이를 IP 패킷의 크기 제한에 맞추어 여러 조각을 낸다 (단편화)

각 조각은 IP 패킷 하나하나가 되어 받는 쪽에 송신한다.

받는 쪽에서의 복원 과정도 운영체제 안에서 진행된다.

 

2.4 컴퓨터 네트워크 식별자

IPv4는 4바이트

IPv6는 16바이트

포트는 2바이트

 

2.5 컴퓨터 네트워크의 품질과 특성

2.5.1 네트워크의 품질을 저해하는 것들

 

1. 스위치나 라우터가 자신이 처리할 수 있는 한계를 넘는 데이터를 수신할 경우

ㄴ 자기가 처리할 수 있는 것 이상을 그냥 버리기

ㄴ 아직 처리하지 못한 것들을 메모리에 누적하기

 

2. 데이터가 오가는 선로에 문제가 있는 경우

ㄴ 회선 신호가 약하거나 잡음이 섞이면 패킷 유실이 발생할 수 있다.

 

2.5.2 전송 속도와 전송 지연 시간

전송 속도 : 두 기기 간에 초당 전송될 수 있는 최대 데이터 양, 보통 bps로 표현 (= 두 단말기 사이에 있는 네트워크 기기 중 최소 스루풋에 의해 결정)

레이턴시 : 두 기기 간에 최소량의 데이터를 전송할 때 걸리는 시간 (= 두 단말기 사이에 있는 네트워크 기기의 레이턴시 총합)

 

전송 속도에 영향을 주는 것

ㄴ 선로의 종류와 품질

ㄴ 두 기기의 소프트웨어와 하드웨어 종류

 

레이턴시에 영향을 주는 것

ㄴ 선로의 종류와 품질

ㄴ 송신자-수신자 사이의 라우터 처리 속도

 

송신자와 수신자 사이에는 스위치, 라우터, 방화벽 같은 네트워크 기기들이 있고 각각의 기기들은 수신한 데이터를 처리 가능한 데이터로 변환하고 그것에 대한 연산 처리를 하기 때문에 시간을 차지한다.

 

2.5.3 네트워크 품질 기준 세 가지

전송 속도, 패킷 유실률, 레이턴시

 

2.5.4 무선 네트워크의 품질

다른 기기들이 동시에 신호를 보내면 신호가 변조되기 때문에 다른 전파가 감지되는지 확인 후 데이터를 보내기 때문에 (CSMA) 레이턴시가 길게 나온다.

 

2.6 컴퓨터 네트워크에서 데이터 보내기와 받기

2.6.1 UDP 네트워킹 (User Datagram Protocol)

받는 쪽의 프로그램과 보내는 쪽의 프로그램이 각자 데이터 통신에 사용할 포트를 할당하고 있어야 한다.

UDP를 이용하여 데이터그램을 보낼 수 있는데, 데이터그램은 64KB 이하의 이진 테이터로, 스트림이 아닌 메세지 성질을 가진다.

ㄴ 데이터그램 내용이 훼손되지는 않지만 패킷 유실이 발생할 수 있다. (데이터그램을 못 받거나 같은 데이터그램을 두 번 이상 받을 가능성이 있다)

ㄴ 받는 쪽에서 데이터그램 유실이나 순서 뒤바뀜 혹은 중복 수신 현상이 발생해도 괜찮은 경우에만 UDP를 사용하는 것이 좋다. (예를 들면 동영상이나 음성 데이터, 네트워크 게임에서는 캐릭터의 이동 정보)

 

UDP로 데이터를 주고받으려면 소켓을 생성하고 포트를 바인드 한뒤 송신, 수신 작업을 진행하면 된다.

 

UDP의 특징

수신용 소켓과 송신용 소켓을 따로 만들지 않아도 된다.

다대다 통신이 가능하다. (하나의 소켓이 여러개의 소켓으로 송수신 할 수 있다)

 

2.6.2 TCP 네트워킹

데이터를 주고받기 전에 연결을 해줘야 한다.

TCP는 메세지 형태가 아니라 스트림 형태로 데이터들을 전달한다.

 

UDP는 IP 패킷 유실이 발생하면 UDP 데이터그램도 드롭되지만 TCP는 똑같은 상황에서도 흐름 제어 기능이 있기 때문에 데이터가 상대방에게 정확하게 전송된다.

 

TCP에서 보낼 스트림 데이터는 세그먼트라는(IP 패킷안에 넣을 수 있는 크기) 단위로 쪼개져 수신자에게 전송된다.

수신자가 IP 패킷을 받으면 ack를 회신하는데 보낸 쪽에서는 일정 시간 안에 ack이 회신되지 않으면 응답이 올때까지 다시 세그먼트를 보낸다.

 

TCP 소켓 사용법

보내는 쪽

1. TCP 소켓 생성

2. 포트 바인딩

3. 연결 (받는 쪽 ip:port) (블로킹)

4. 송신 (이미 연결 되어있으므로 ip:port가 아닌 데이터만 사용)

5. 필요한 만큼 송신했다면 연결을 끊는다. (close)

 

받는 쪽

1. TCP 소켓 생성

2. listen (포트)

3. accept() (연결 될때 까지 블로킹, 새로운 소켓 생성)

4. 반복문내에서 recv()로 데이터를 받는다. 연결 상태를 유지하다가 0바이트 크기의 데이터를 받으면 반복문을 탈출하고 연결을 끊는다. (close)

ㄴ UDP에서는 데이터그램을 메세지 형식으로 주고받는다. 0바이트 메세지도 허용한다. TCP는 크기 0의 데이터를 받으면 연결이 종료되었음을 의미한다.

 

TCP 소켓도 UDP 소켓과 마찬가지로 소켓 하나로 송수신을 모두 할 수 있다.

 

2.7 패킷 유실 시 UDP와 TCP에서 현상

UDP는 1만 바이트의 데이터그램을 UDP로 전송하면 운영체제는 이를 1300바이트 정도의 크기 8개로 나누어 IP 패킷 8개로 전송되는데 이들 중 하나라도 유실되면 수신자는 8개 모두 못 받는다. (1만바이트짜리 데이터그램이 유실된다)

 

TCP에서는 유실되는 패킷의 재전송 시간만큼 지연 시간이 발생한다.

 

UDP의 레이턴시 = 네트워크 기기의 레이턴시

TCP의 레이턴시 = 네트워크 기기의 레이턴시 + 패킷 유실률 * 재전송 대기 시간

 

네트워크 게임 개발에서 거의 모든 메세지 종류에는 TCP를 사용하고 특정 상황에서만 UDP를 사용하지만 실제 통신량의 대부분은 UDP가 차지한다.

 

2.8 주로 사용하는 메세지 형식

1. 텍스트 형식

ㄴ HTTP나 JSON 같은 표준화된 형식을 씀

 

2. 바이너리 형식

ㄴ 각 바이트 혹은 비트 필드는 특정한 의미를 가진다.

ㄴ 텍스트 형식에 비해 구문 분석기가 필요 없어서 처리 성능이 더 낫고, 통신량도 적다

 

메세지 안에 내용을 담는 것뿐만 아니라 그 메세지 내용이 어떤 것을 담고 있는지의 정보를 같이 포함시키는 형식

 

ㄴ 메타 데이터를 포함시키면 데이터 통신량이 많아지고, 해커에게도 더 쉽게 노출된다는 단점이 있지만 하위 호환성 측면에서 유리하다.

ㄴ 받는쪽과 보내는쪽의 버전이 달라도 호환성 문제를 해결할 수 있다.

 

2.9 네트워크 주소 변환

네트워크 주소 변환 (NAT : network address translation)

ㄴ 다른 단말기로 전송되던 패킷의 송신자 주소나 수신자 주소가 다른 것으로 변환되는 과정 

ㄴ 인터넷 공유기는 NAT 라우터이다.

 

공유기 안에 있는 기기가 공유기 밖에 있는 기기에 패킷을 보내려고 하면 패킷을 통과하여 수신지에 전달

공유기는 내부 주소와 외부 주소의 매핑 정보를 생성해서 가지고 있는다.

 

2.11 더 읽을 거리

TCP 흐름 제어 (ARQ)

ㄴ slicing window (윈도우 크기만큼의 패킷을 응답받지 않고 보내기)

ㄴ 송신측의 처리 속도가 수신측의 처리 속도보다 빨라서 수신측의 저장용량을 초과한 데이터가 손실되는 것을 방지하기 위함

 

TCP 혼잡 제어

ㄴ AIMD (additive increase, multiplicative decrease), slow start, fast retransmit, fast recovery

 

네트워크 게임의 성능 최적화를 위해 UDP 위에 흐름 제어를 별도로 구현하는 경우도 있다.

 

송신자와 수신자 간 오가는 메세지는 제 3자가 도청하거나 변조할 수 있기 때문에 메세지를 암호화해야 한다.

'읽은 책 > 게임 서버 프로그래밍 교과서' 카테고리의 다른 글

3. 소켓 프로그래밍  (0) 2022.09.10
1. 멀티 스레딩  (0) 2022.09.08

+ Recent posts