# 퀘이크 3 소스 코드 리뷰: 네트워크 모델 (2012)

> Clean Markdown view of GeekNews topic #17917. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17917](https://news.hada.io/topic?id=17917)
- GeekNews Markdown: [https://news.hada.io/topic/17917.md](https://news.hada.io/topic/17917.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-11-24T09:54:07+09:00
- Updated: 2024-11-24T09:54:07+09:00
- Original source: [fabiensanglard.net](https://fabiensanglard.net/quake3/network.php)
- Points: 1
- Comments: 1

## Topic Body

#### 네트워크 모델

- Quake 3의 네트워크 모델은 엔진의 가장 우아한 부분으로, 빠른 환경에서는 첫 전송에서 수신되지 않은 정보는 다시 전송할 가치가 없음을 강조함.
- UDP/IP를 사용하며, TCP/IP의 신뢰성 있는 전송은 지연을 초래하여 사용하지 않음.
- 네트워크 스택은 두 가지 상호 배타적인 계층으로 확장됨: 사전 공유 키를 사용한 암호화와 사전 계산된 허프만 키를 사용한 압축.
- 서버 측에서 UDP 데이터그램의 크기를 최소화하면서 UDP의 신뢰성 부족을 보완하는 시스템이 돋보임.

#### 아키텍처

- 클라이언트 측은 간단하며, 각 프레임마다 서버에 명령을 보내고 게임 상태 업데이트를 받음.
- 서버는 마스터 게임 상태를 각 클라이언트에 전파해야 하며, UDP 패킷 손실을 고려해야 함.
- 세 가지 주요 요소: 마스터 게임 상태, 클라이언트의 명령을 Netchannel을 통해 전송, 32개의 최근 게임 상태를 순환 배열로 저장하는 스냅샷.

#### 스냅샷 시스템

- 서버는 클라이언트에 업데이트를 전송할 때 항상 마스터 게임 상태를 클라이언트의 다음 히스토리 슬롯에 복사하고 다른 스냅샷과 비교함.
- 유효한 스냅샷이 없으면 "더미 스냅샷"을 사용하여 전체 업데이트를 생성함.
- 클라이언트가 이전 업데이트를 수신했음을 확인하면 부분 업데이트만 전송됨.
- 패킷이 손실된 경우에도 동일한 프로세스를 따르며, 이전에 수신되지 않은 정보와 새로운 정보를 단일 메시지로 전송함.

#### 메모리 내성 및 C

- Quake3는 introspection 없이 스냅샷을 비교하며, 각 필드 위치는 배열과 전처리 지시문을 통해 미리 구성됨.
- `netField_t` 구조체를 사용하여 필드의 위치와 크기를 정의하고, 이를 통해 차이를 네트워크로 전송함.

#### 사전 분할

- NetChannel 모듈은 메시지를 1400바이트 청크로 나누어 전송하며, 이는 라우터가 패킷을 조각화하는 것을 방지함.
- 라우터 조각화는 네트워크 진입 시 패킷을 차단하고, 네트워크를 떠날 때는 모든 조각을 기다려야 하므로 비용이 많이 듦.

#### 신뢰성 있는 및 신뢰성 없는 메시지

- 스냅샷 시스템은 네트워크에서 손실된 UDP 데이터그램을 보상하지만, 일부 메시지와 명령은 반드시 전달되어야 함.
- 이러한 보장은 NetChannel을 통해 추상화됨.

## Comments



### Comment 31637

- Author: neo
- Created: 2024-11-24T09:54:07+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=42218532) 
- 이 기사는 매우 흥미로우며, 이전 기사들도 마찬가지였음. 하지만 현재의 일은 지루하여 취미 프로젝트에 에너지가 남지 않음.
- "Isochronous"라는 용어는 FireWire가 나왔을 때 처음 들었으며, UDP 사용의 정당성에서 이를 언급함. 현재 USB/Thunderbolt 사양에서 중요한 부분임.
- 시리즈의 첫 번째 기사 링크: [https://fabiensanglard.net/quake3/index.php](https://fabiensanglard.net/quake3/index.php)
- 지연 예측과 수정 기능이 흥미로우며, 복잡한 운영 변환(OT)을 사용하지 않음. 이는 더 간단하고, 공유 상태가 협업 편집 문서가 아닌 독립적인 진실의 원천이 필요하며, 개발이 빠르고 성능이 더 좋음.
- 원래 Q3A 클라이언트의 네트워크 코드는 LAN에서는 잘 작동했지만, 원격 플레이에서는 지연에 민감했음. Quake Live의 흥미로운 변화 중 하나는 원격 플레이를 위한 업데이트된 네트워크 코드였음. 인터넷 연결도 시간이 지나면서 전반적으로 개선됨.
- 사이트가 HN Hug of Death를 겪고 있는 것 같음: <연결이 시간 초과됨>
- 토요일 아침에 마차를 천천히 마시며 읽기에 좋은 글임. 삶의 작은 즐거움임.
- Q: 실시간 게임 프로토콜에 대한 현대적 접근 방식을 배울 수 있는 자원이 있는지?
- 아마도 스냅샷 ID 번호도 클라이언트에 전송되어 확인됨?
- 총알 방지 오픈 소스 미들웨어가 여전히 있는지?
