[게임 서버] 2.3 컴퓨터 네트워크 데이터
카테고리: GameServer
태그: GameServer
이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 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바이트만 읽을수도 있다.
📌 스트림의 특징
- 패킷 크기 제한이 없다 (이후 설명)
- 스트림 안의 데이터를 끊는 건 사용자의 몫이다
- 스트림 자체는 데이터를 중간에 구별하지 않는다
- 단말기 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)와 구별할 수 없는 경우에는 다른 알고리즘이 필요하다.
📨 메시지
📌 메시지의 특징
- 패킷 크기 제한이 없다 (이후 설명)
- 데이터를 보낸 개수와 받는 개수가 같으며, 보낸 데이터와 받는 데이터의 시작과 끝이 같다
- 자체적으로 데이터의 시작과 끝을 구별할 수 있다 (e.g. 여러 필드로 나누어 사용)
🎮 메시지 형식 예시
0~1 | 2~13 | 14~25 | 26~27 |
---|---|---|---|
MessageType_FireBullet | Position(x, y, z) | Direction(x, y, z) | Bullet Type |
참고: 네트워크 게임에서는 메시지 형식 송수신이 보편적이다.
📦 IP 패킷
🔧 IP 패킷의 구성
- 페이로드 크기: 주고받는 데이터의 크기
- 송신자 주소: 수신자가 송신자를 식별하는 용도
- 수신자 주소: 패킷이 전달될 목적지
- 체크섬(checksum): 데이터 전송 중의 오류를 감지하기 위해 사용
- 이 외의 것들: 기타 제어 정보
⚠️ IP 패킷의 특징
- IP 패킷 하나의 크기가 제한되어 있다
✅ 스트림/메시지가 패킷 크기 제한이 없는 이유
🧩 단편화(Fragmentation) 과정
운영체제에 내장된 네트워크 모듈인 네트워크 스택에서 스트림과 메시지를 관리해준다.
단편화(fragmentation): IP 패킷의 크기 제한에 맞춰 여러 조각으로 나누는 것
과정:
- 조각들은 IP 패킷 하나하나가 되어 송신
- 수신자는 조각들을 조립하여 복원
- 스트림, 메시지, 데이터그램에서도 이러한 과정을 거침
이 때문에 상위 계층에서는 패킷 크기 제한을 신경 쓸 필요가 없다.
🧐 정리
- OSI 계층 2는 프레임, 계층 3은 패킷을 데이터 단위로 사용하지만, 실제로는 스트림과 메시지를 주로 다룬다
- 스트림은 연속된 데이터 흐름으로, 사용자가 직접 데이터를 구분해야 한다
- 메시지는 자체적으로 시작과 끝을 구별할 수 있는 독립적인 데이터 단위이다
- 네트워크 스택의 단편화 기능 덕분에 스트림과 메시지는 패킷 크기 제한 없이 사용할 수 있다
댓글남기기