경고
암호화 코드를 포함한 RNL은 지금까지 감사되지 않았습니다. 따라서 RNL은 중요한 데이터가 있는 처리가 없는 실시간 게임 및 멀티미디어 응용 프로그램에만 사용되며 중요한 데이터가 있는 심각한 응용 프로그램에는 적합하지 않습니다!
설명
RNL은 "실시간 네트워크 라이브러리"를 의미합니다.
RNL은 ENet, yojimbo, libgren 등에서 영감을 받아 실시간 애플리케이션 및 게임을 위한 UDP 기반 네트워크 라이브러리입니다.
RNL은 I/O 바인딩이 아닌 시뮬레이션 바인딩이고 완전한 상태 저장인 실시간 게임에 사용되는 일반적인 패턴을 중심으로 설계되었으므로 비동기 IO는 그다지 의미가 없습니다. 따라서 RNL 코어 디자인은 멀티 스레드가 아닌 단일 스레드입니다. 그러나 여러 다른 스레드 내에서 여러 TRNLHost 인스턴스를 사용할 수 있으므로(스레드당 1개에서 매우 적은 인스턴스), 이 하나의 머신이 여러 호스트를 호스팅할 수 있을 만큼 강력하고 빠른 한 동일한 머신에서 여러 네트워크 게임 매치를 호스팅할 수 있습니다. 네트워크 게임이 동시에 일치합니다.
그리고 게임 클라이언트 측에서는 간섭이 거의 없고 기타 유사한 문제가 발생하지 않도록 가능한 경우 전체 네트워크 항목이 자체(가능한 경우 CPU 코어 고정) 스레드에서 실행되어야 합니다. (주제에서 벗어남: 오디오 버퍼 언더런 문제 등을 좋아하지 않는 한, 적절한 시점에 충분한 CPU 시간을 얻지 못한 경우 오디오 스레드에도 동일하게 적용됩니다. :-) )
그리고 단일 게임 세계에서 많은 클라이언트가 있는 대규모 게임의 경우 여러 개의 세분화된 TRNLHost 인스턴스를 사용해야 합니다. 그러면 각 TRNLHost는 여러 스레드에서 연결된 소수의 클라이언트만 처리해야 하며 이는 여러 물리적 전용 서버에서 수행됩니다. 하나의 매우 큰 게임 세계의 느낌을 모방하기 위해 서로 통신할 수 있습니다. 적어도 단일 TRNLHost 인스턴스는 전형적인 낮은 클라이언트 수를 위해 설계되었습니다. 이는 에고슈터, 레이싱 게임 등의 일반적인 경우이기 때문입니다. 즉, 다수의 클라이언트가 있는 대규모 게임 세계의 경우: 분할 및 정복(예: 분할 및 정복 개념 아이디어의 예로서 부분적으로 섹터 경계가 겹치는 게임 세계 섹터)
나를 지원
Patreon에서 저를 지원해주세요
특징
- 대부분 완전히 객체 지향적인 코드 디자인
- IPv6 지원
- 크로스 플랫폼
- Windows(FreePascal 및 Delphi 포함)
- Linux(프리파스칼 사용)
- *BSD(프리파스칼 포함)
- Android(FreePascal 및 Delphi 포함)
- Darwin(MacOS(X) 및 iOS)(FreePascal 및 Delphi 사용)
- UDP 기반 프로토콜
- 시퀀싱
- 채널
- 다음과 같이 무료로 구성 가능한 채널 유형이 있습니다.
- 믿을 수 있는 주문
- 신뢰할 수 있는 정렬되지 않은
- 신뢰할 수 없는 주문
- 신뢰할 수 없음
- 신뢰할 수 있음
- 조각화 및 재조립
- 집합
- 적응성
- 이식성
- 순수 클라이언트/서버 모델과 물론 기존 클라이언트/서버 모델 대신 P2P 모델 또는 혼합 P2P와 클라이언트/서버 하이브리드 모델을 사용할 가능성
- 암호학적으로 안전한 의사 난수 생성기(CSPRNG)
- arc4random을 기반으로 하지만 기본 빌딩 블록으로 RC4 대신 ChaCha20을 사용합니다.
- 여러 엔트로피 소스(백도어가 있을 수 있으므로 단일 엔트로피 소스를 절대 신뢰해서는 안 되기 때문)
- 최신 x86 프로세서에서 rdseed/rdrand 명령어를 선택적인 추가 유사 하드웨어 기반 엔트로피 소스로 사용하는 것을 포함합니다(이러한 명령어가 현재 실행 중인 프로세서에서 지원되는 경우).
- 상호인증
- STS(Station-to-Station)와 같은 프로토콜을 기반으로 합니다. 이 프로토콜은 당사자가 메시지 서명에 사용되는 서명 키를 가지고 있다고 가정하여 기본적인 일반 Diffie와 달리 중간자 공격에 대한 축소 보안을 제공합니다. 그러한 확장이 없는 Hellman 방법.
- 장기 개인/공개 키는 ED25519 키이며 서명 목적으로만 사용됩니다.
- 타원 곡선 임시 Diffie-Hellman(곡선 25519)을 사용한 순방향 비밀성
- 다른 사실과 함께 이것의 결과는 각 연결이 항상 양쪽에 새로운 개인 및 공개 단기 키를 가지므로 새로운 공유 비밀 단기 키도 있다는 것입니다.
- 단기 개인/공개 키는 X25519 키이며 단기 공유 비밀 키는 AEAD 기반 암호화 목적으로만 사용됩니다.
- AEAD(Authenticated Encryption with Associated Data) 패킷 암호화
- 암호화는 ChaCha20, 암호화 메시지 인증코드는 Poly1305 기반
- 애플리케이션 패킷 데이터의 재생 보호
- 연결 설정 단계의 다양한 보호 메커니즘과 암호화된 패킷 시퀀스 번호를 기반으로 합니다.
- 추가적인 공격 표면 축소 메커니즘으로서의 지연된 연결 설정 메커니즘
- DDoS 증폭에 대한 추가 공격 표면 축소 메커니즘인 연결 및 인증 토큰(이 항목을 생성하고 처리하기 위해 HTTPS 기반 마스터 백엔드와 같이 별도의 대역 외 통신 채널이 있어야 하는 선택적 옵션) 공격
- 연결 토큰은 일반 텍스트로 전송되므로 토큰을 확인하기 전에 먼저 연결 토큰을 해독할 필요 없이 연결 시도의 첫 번째 데이터 패킷에서 빠른 방법으로 확인됩니다. 이 시점에서 CPU 시간을 절약하십시오. 이 옵션은 주로 DDoS 증폭 공격에 사용됩니다. 즉, 연결 시도의 첫 번째 데이터 패킷에서 연결 토큰이 일치하지 않으면 서버가 즉시 응답하지 않으므로 DDoS 증폭 공격은 단순히 아무것도 아님. 결과적으로 이러한 토큰은 짧은 기간 동안만 유효해야 하며 이는 인프라의 마스터 백엔드 측에도 적용됩니다.
- 인증 토큰은 개인/공개 키 교환, 공유 비밀 키 생성 등이 성공적으로 처리된 후 암호화되어 전송됩니다. 인증 토큰은 연결 토큰과 달리 DDoS 공격에 대한 대응 수단이 아니며, 이름에서 알 수 있듯이 별도의 대역 외 통신 채널 인증 용도로만 사용됩니다. 무단 연결로부터 보호합니다. "클라이언트"가 모든 실제 작업이 발생하는 실제 서버에 연결하기 전에 인프라의 마스터 백엔드 측에서 자세히 확인할 수 있습니다.
- 연결 시도 속도 제한기
- 구성 가능한 대역폭 속도 제한기
- 선택적 가상 네트워크 기능(예: 싱글 플레이어 게임 매치를 위한 빠른 네트워크 API 없는 로컬 루프백 솔루션, 여전히 서버/클라이언트 개념 기반이어야 함)
- 네트워크 간섭 시뮬레이터(예: 테스트 케이스 등)
- 구성 가능한 시뮬레이션된 패킷 손실 확률(수신 및 발신 패킷 각각)
- 구성 가능한 시뮬레이션 대기 시간(수신 및 발신 패킷 각각)
- 구성 가능한 시뮬레이션 지터(수신 및 발신 패킷 각각)
- 구성 가능한 시뮬레이션된 중복 패킷 확률(수신 및 발신 패킷 각각)
- 동적 연결 챌린지 요청 응답 난이도 조정 메커니즘
- 계수 값으로 구성 가능
- 기록 평활화 초당 프레임 스타일 결정 메커니즘을 기반으로 하지만 대신 초당 프레임 수, 초당 연결 시도 수를 나타냅니다.
- 선택 가능한 추가 압축 알고리즘
- Deflate(zlib 비트 스트림 호환 LZ77 및 표준 Huffman 하이브리드, 여기 압축기 측 구현에서는 고정-정적-표준-허프만만 있지만 압축 해제기 측은 모든 기능을 갖추고 있습니다)
- LZBRRC(엔트로피 범위 코더 백엔드와 함께 LZ77 스타일 압축기)
- BRRC(순수 0 엔트로피 범위 코더)
- CRC32 대신 CRC32C(끝에 C 없음)
- 그리고 더 많은 것들이 있습니다. . .
무작위 우선순위로 계획된 기능(Todo라고도 함)
코드 기여자를 위한 일반 지침
코드 기여자를 위한 일반 지침
특허
zlib 라이센스
IRC 채널
프리노드의 IRC 채널 #rnl
감사해요
- 기본 API 디자인 구현 아이디어에 영감을 준 ENet의 Lee Salzman에게 감사드립니다.
- 보안 지향 구현 아이디어에 영감을 준 Glenn Fiedler에게 감사드립니다.
- 보안 지향 구현 아이디어에 대한 영감을 주신 Sergey Ignatchenko("No Bugs" Hare)에게 감사드립니다.