네트워크 모델
- Quake 3의 네트워크 모델은 엔진의 가장 우아한 부분으로, 빠른 환경에서는 첫 전송에서 수신되지 않은 정보는 다시 전송할 가치가 없음을 강조함.
- UDP/IP를 사용하며, TCP/IP의 신뢰성 있는 전송은 지연을 초래하여 사용하지 않음.
- 네트워크 스택은 두 가지 상호 배타적인 계층으로 확장됨: 사전 공유 키를 사용한 암호화와 사전 계산된 허프만 키를 사용한 압축.
- 서버 측에서 UDP 데이터그램의 크기를 최소화하면서 UDP의 신뢰성 부족을 보완하는 시스템이 돋보임.
아키텍처
- 클라이언트 측은 간단하며, 각 프레임마다 서버에 명령을 보내고 게임 상태 업데이트를 받음.
- 서버는 마스터 게임 상태를 각 클라이언트에 전파해야 하며, UDP 패킷 손실을 고려해야 함.
- 세 가지 주요 요소: 마스터 게임 상태, 클라이언트의 명령을 Netchannel을 통해 전송, 32개의 최근 게임 상태를 순환 배열로 저장하는 스냅샷.
스냅샷 시스템
- 서버는 클라이언트에 업데이트를 전송할 때 항상 마스터 게임 상태를 클라이언트의 다음 히스토리 슬롯에 복사하고 다른 스냅샷과 비교함.
- 유효한 스냅샷이 없으면 "더미 스냅샷"을 사용하여 전체 업데이트를 생성함.
- 클라이언트가 이전 업데이트를 수신했음을 확인하면 부분 업데이트만 전송됨.
- 패킷이 손실된 경우에도 동일한 프로세스를 따르며, 이전에 수신되지 않은 정보와 새로운 정보를 단일 메시지로 전송함.
메모리 내성 및 C
- Quake3는 introspection 없이 스냅샷을 비교하며, 각 필드 위치는 배열과 전처리 지시문을 통해 미리 구성됨.
-
netField_t
구조체를 사용하여 필드의 위치와 크기를 정의하고, 이를 통해 차이를 네트워크로 전송함.
사전 분할
- NetChannel 모듈은 메시지를 1400바이트 청크로 나누어 전송하며, 이는 라우터가 패킷을 조각화하는 것을 방지함.
- 라우터 조각화는 네트워크 진입 시 패킷을 차단하고, 네트워크를 떠날 때는 모든 조각을 기다려야 하므로 비용이 많이 듦.
신뢰성 있는 및 신뢰성 없는 메시지
- 스냅샷 시스템은 네트워크에서 손실된 UDP 데이터그램을 보상하지만, 일부 메시지와 명령은 반드시 전달되어야 함.
- 이러한 보장은 NetChannel을 통해 추상화됨.