[게임 서버] 2.3 컴퓨터 네트워크 데이터

업데이트:     Updated:

카테고리:

태그:

이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 GPT에게 요약을 요청하여 작성되었습니다.
게임 서버 프로그래밍 교과서, 배현직 저자

📦 2. 컴퓨터 네트워크

👉🏻 항목 3: 컴퓨터 네트워크 데이터

🔍 OSI 계층별 데이터 단위

OSI 계층에서는 각 계층별로 데이터 단위가 다르다.

  • OSI 계층 2: 데이터 단위를 프레임이라고 한다.
  • OSI 계층 3: 데이터 단위를 패킷이라고 한다.

하지만 우리는 이를 직접 다루기보단 스트림메시지를 주로 다룬다.


🌊 스트림

✅ 코드 예시

printFileContents() {
	fp = openFile("a.txt");
	while(!fp.IsEOF()) {
		// 100바이트씩 읽음
		data = fp.ReadStream(100);
		print(data);
	}
}

  • 100바이트씩 읽지만, 그 이하거나 0바이트만 읽을수도 있다.

📌 스트림의 특징

  1. 패킷 크기 제한이 없다 (이후 설명)
  2. 스트림 안의 데이터를 끊는 건 사용자의 몫이다
  3. 스트림 자체는 데이터를 중간에 구별하지 않는다
  4. 단말기 A에서 단말기 B로 보낼 때의 특징:
    • A에서 보낸 데이터와 B에서 받은 데이터가 완전히 같지 않을 수 있다
    • A에서 보낸 데이터를 이어보면, B에서 받은 데이터를 이은 것과 같다
// 송신자 A
send(aaa)
send(bbb)
send(ccc)

// 수신자 B
receive() => aa
receive() => abbb
receive() => cc
receive() => c

🎞️ 스트림 형식

스트림 형식으로 데이터를 송수신할 때, 데이터가 여러 부분으로 나뉘어 있을 때는 형식을 정해주어야 한다.

1. 헤더(header) 방식

  • 첫 2바이트에 보낼 데이터의 크기를 담는다
  • 이후 보낼 데이터를 담는다

| 11(2바이트) | HELLO WORLD | | — | — |

2. 구분자(delimiter) 방식

  • 보낼 데이터를 담는다
  • 이후 구분자를 담는다

| HELLO WORLD | 0(바이트) | | — | — |

주의: 데이터 값에 0이 있어, 구분자(0)와 구별할 수 없는 경우에는 다른 알고리즘이 필요하다.


📨 메시지

📌 메시지의 특징

  1. 패킷 크기 제한이 없다 (이후 설명)
  2. 데이터를 보낸 개수와 받는 개수가 같으며, 보낸 데이터와 받는 데이터의 시작과 끝이 같다
  3. 자체적으로 데이터의 시작과 끝을 구별할 수 있다 (e.g. 여러 필드로 나누어 사용)

🎮 메시지 형식 예시

0~1 2~13 14~25 26~27
MessageType_FireBullet Position(x, y, z) Direction(x, y, z) Bullet Type

참고: 네트워크 게임에서는 메시지 형식 송수신이 보편적이다.


📦 IP 패킷

IP 패킷의 구조

🔧 IP 패킷의 구성

  • 페이로드 크기: 주고받는 데이터의 크기
  • 송신자 주소: 수신자가 송신자를 식별하는 용도
  • 수신자 주소: 패킷이 전달될 목적지
  • 체크섬(checksum): 데이터 전송 중의 오류를 감지하기 위해 사용
  • 이 외의 것들: 기타 제어 정보

⚠️ IP 패킷의 특징

  • IP 패킷 하나의 크기가 제한되어 있다

✅ 스트림/메시지가 패킷 크기 제한이 없는 이유

🧩 단편화(Fragmentation) 과정

운영체제에 내장된 네트워크 모듈인 네트워크 스택에서 스트림과 메시지를 관리해준다.

단편화(fragmentation): IP 패킷의 크기 제한에 맞춰 여러 조각으로 나누는 것

과정:

  1. 조각들은 IP 패킷 하나하나가 되어 송신
  2. 수신자는 조각들을 조립하여 복원
  3. 스트림, 메시지, 데이터그램에서도 이러한 과정을 거침

이 때문에 상위 계층에서는 패킷 크기 제한을 신경 쓸 필요가 없다.


🧐 정리

  1. OSI 계층 2는 프레임, 계층 3은 패킷을 데이터 단위로 사용하지만, 실제로는 스트림과 메시지를 주로 다룬다
  2. 스트림은 연속된 데이터 흐름으로, 사용자가 직접 데이터를 구분해야 한다
  3. 메시지는 자체적으로 시작과 끝을 구별할 수 있는 독립적인 데이터 단위이다
  4. 네트워크 스택의 단편화 기능 덕분에 스트림과 메시지는 패킷 크기 제한 없이 사용할 수 있다

GameServer 카테고리 내 다른 글 보러가기

댓글남기기