警告
RNL 包括其密碼學代碼到目前為止尚未經過審計,因此 RNL 僅適用於即時遊戲和多媒體應用程序,而不處理任何關鍵數據,但不適用於具有關鍵數據的嚴肅應用程式!
描述
RNL 代表“即時網路庫”
RNL 是一個基於 UDP 的網路庫,用於即時應用程式和遊戲,其靈感來自 ENet、yojimbo、libgren 等。
RNL 是圍繞著即時遊戲中使用的常見模式設計的,這些模式是模擬綁定的,而不是 I/O 綁定的,並且完全有狀態,因此非同步 IO 沒有多大意義。因此RNL核心設計是單線程的,而不是多線程的。但是您可以在多個不同的線程中使用多個TRNLHost 實例(每個線程只有一個到很少的實例),這樣您就可以在同一台機器上託管多個網絡遊戲比賽,只要這台機器足夠強大且速度夠快,可以託管多個網路遊戲比賽網路遊戲同時進行比賽。
在遊戲客戶端,如果可能的話,整個網路的東西應該在自己的(如果可能的話,CPU 核心固定的)線程中運行,以減少可能的干擾和其他類似問題。 (題外話:這同樣適用於音訊線程,除非人們喜歡可能的音訊緩衝區欠載問題等,因為它在正確的時間點沒有獲得足夠的 CPU 時間。:-) )
對於在單一遊戲世界中擁有大量客戶端的大型遊戲,您應該使用多個細分的TRNLHost 實例,以便每個TRNLHost 必須在多個線程中僅處理少數連接的客戶端,並且依次在多個實體專用伺服器上,這也依次可以互相交流以模仿單一非常大的遊戲世界的印象。至少一個 TRNLHost 實例是為典型的低客戶端數量而設計的,因為這些是自我射擊遊戲、賽車遊戲等的典型情況。或者換句話說,對於擁有大量客戶端的大型遊戲世界:分而治之(例如,部分扇區邊界重疊的遊戲世界扇區僅作為分而治之概念想法的示例)
支持我
在 Patreon 支持我
特徵
- 大部分是完全物件導向的程式碼設計
- IPv6支援
- 跨平台
- Windows(使用 FreePascal 和 Delphi)
- Linux(使用 FreePascal)
- *BSD(使用 FreePascal)
- Android(使用 FreePascal 和 Delphi)
- Darwin(MacOS(X) 和 iOS)(使用 FreePascal 和 Delphi)
- 基於UDP的協議
- 定序
- 頻道
- 可靠性
- 碎片與重組
- 聚合
- 適應性
- 可移植性
- 可以使用對等模型,甚至是混合的對等和客戶端/伺服器混合模型,而不是僅使用純客戶端/伺服器模型,當然也可以使用經典的客戶端/伺服器模型
- 加密安全偽隨機數產生器 (CSPRNG)
- 基於 arc4random 但以 ChaCha20 取代 RC4 作為基本構建塊
- 多個熵源(因為你永遠不應該信任單一熵源,因為它可能有後門)
- 包括在較新的 x86 處理器上使用 rdseed/rdrand 指令作為可選的附加基於準硬體的熵源(如果目前運行的處理器支援這些指令)
- 相互認證
- 基於類似站對站 (STS) 的協議,該協議假設各方擁有簽名金鑰,用於對訊息進行簽名,從而提供針對中間人攻擊的小型化安全性,這與基本的普通 Diffie 不同Hellman 方法沒有任何此類擴展。
- 長期私鑰/公鑰是 ED25519 金鑰,僅用於簽署目的
- 使用橢圓曲線短暫 Diffie-Hellman 的前向保密(曲線 25519)
- 與其他事實一起的結果是,每個連接雙方總是有新的不同的私鑰和公鑰,因此也有新的共享秘密短期金鑰
- 短期私鑰/公鑰是 X25519 金鑰,短期共用金鑰僅用於基於 AEAD 的加密目的
- 帶有關聯資料的身份驗證加密 (AEAD) 資料包加密
- 基於ChaCha20作為密碼和Poly1305作為密碼訊息認證碼
- 應用程式包資料重播保護
- 延遲連線建立機製作為附加攻擊面縮小機制
- 連接和身份驗證令牌(作為可選選項,您應該有一個單獨的帶外通信通道,例如用於生成和處理這些內容的基於 HTTPS 的主後端)作為針對 DDoS 放大的附加攻擊面縮小機制攻擊
- 連接令牌以明文形式傳輸,以便在連接嘗試的第一個資料包時以快速方式檢查它們,而無需在檢查令牌之前先解密連接令牌,因此為了在這一點上節省CPU時間。此選項主要用於防禦 DDoS 放大攻擊,這意味著如果連接嘗試的第一個資料包中的連接令牌不匹配,伺服器將不會立即回應,因此 DDoS 放大攻擊將簡單地進入沒有什麼。因此,這些令牌應該只在短時間內有效,這也適用於基礎設施的主後端。
- 在成功處理私鑰/公鑰交換、共享金鑰產生等之後,身份驗證代幣將被加密傳輸。與連接令牌相比,身份驗證令牌不是針對 DDoS 類別攻擊的對策,而是身份驗證令牌,顧名思義,僅用於單獨的帶外通信通道身份驗證目的,換句話說,作為附加防止未經授權的連接,您可以在「客戶端」連接到真正的伺服器(所有實際操作發生的地方)之前,在基礎設施的主後端端更詳細地檢查它。
- 連線嘗試速率限制器
- 可配置的頻寬速率限制器
- 可選的虛擬網路功能(例如,用於單人遊戲匹配的快速無網路 API 的本地環回解決方案,該解決方案仍應基於伺服器/客戶端概念)
- 網路幹擾模擬器(例如用於測試用例等)
- 可配置的模擬資料包遺失機率(分別針對傳入和傳出資料包)
- 可配置的模擬延遲(每個針對傳入和傳出資料包)
- 可設定的模擬抖動(分別針對傳入和傳出資料包)
- 可配置的模擬重複資料包機率(分別針對傳入和傳出資料包)
- 動態連線挑戰請求回應難度調整機制
- 可配置因子值
- 基於歷史平滑每秒幀數樣式的確定機制,但只是每秒幀數、每秒連線嘗試次數
- 更多壓縮演算法可供選擇
- Deflate(zlib 位元流相容的 LZ77 和規格霍夫曼混合體,在此實作中壓縮器端僅固定靜態規格霍夫曼,但解壓縮器端功能齊全)
- LZBRRC(LZ77 式壓縮器以及熵範圍編碼器後端)
- BRRC(純 0 階熵範圍編碼器)
- CRC32C 取代 CRC32(末端不含 C)
- 還有很多更多的東西。 。 。
依優先順序隨機順序排列的計畫功能(又稱 Todo)
代碼貢獻者的一般準則
代碼貢獻者的一般準則
執照
zlib許可證
IRC頻道
Freenode 上的 IRC 頻道 #rnl
謝謝
- 感謝 ENet 的 Lee Salzman 作為基本 API 設計實現思路的靈感
- 感謝 Glenn Fiedler 為面向安全的實施想法提供靈感
- 感謝 Sergey Ignatchenko(“No Bugs”Hare)為我們提供了安全導向的實施想法的靈感