1P by neo 4일전 | favorite | 댓글 1개

네트워크 모델

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

아키텍처

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

스냅샷 시스템

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

메모리 내성 및 C

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

사전 분할

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

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

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