活用 ProudNet

ProudNet 伺服器

ProudNet 伺服器是 Proud::CNetServer 實例,具有以下角色。 另外,它還作爲P2P通信的relay服務器發揮着作用。

  • 接受並管理來自 ProudNet 用戶端的連接

  • 與客戶端進行通訊:RMI

  • 客戶端間P2P通訊的群組管理:參考P2P群組

ProudNet 客戶端

ProudNet 網路用戶端是 Proud::CNetClient 實例,具有以下角色。

ProudNet 協定類型

支援的訊息傳遞協定如下,您可以選擇一種並將其輸入為 RMI 函數呼叫中的參數。

協定類型註釋

Reliable messaging

雖然主機間收發信息的時間比unreliable長,但收發順序和到達是保證的。

Unreliable messaging

雖然主機間收發消息的時間比reliable短,但收發順序可能會不順,無法保證到達。

ClientServer 使用的通信協議

狀態Reliable P2P RMIUnreliable P2P RMIReliable C-S RMIUnreliable C-S RMI

正常

Reliable UDP

UDP

TCP

UDP

對等點之間的 UDP 通訊不良

Relay and Reliable UDP or TCP

Relay and TCP

TCP

UDP

雲端與伺服器之間的 UDP 通訊不良

Relay and TCP

Relay and TCP

TCP

TCP

  • Reliable UDP是ProudNet自身實現功能。

  • Relay由Server負責。

協議選擇技巧 第一次開發遊戲時,使用Proud.RmiContext.ReliableSend將所有信息發送到Reliable messaging。 然後參考訪問所有RMI呼叫時間,收集RMI消息收發明細。

一般來說,在遊戲程序中,20%以下的RMI信息種類佔全部收發量的80%以上,其中發送頻率非常高,即使發生20%以下的流失,也會找到沒有什麼問題的RMI,修改爲使用Unreliable messaging

ProudNet客戶端-服務器通信

在ProudNet中,客戶端和服務器之間的通信以信息爲單位構成,每個信息對應1次RMI呼叫,reliable、unreliable通信均可進行。

ProudNet P2P通訊效能

ProudNet擁有超越普遍化的打孔及接力技術的功能,非常強大,支持沒有連接等待時間的TCP等P2PReliable信息。 由於對敏感或有缺陷的NAT裝置具有抗性,因此可以自行解決低速網絡超負荷的P2P發送量,用戶要求連接P2P通信(Proud.CNetServerCreateP2PGroupProud.CNetServer.JoinP2PGroup)後,立即執行客戶端之間的信息。

部分NAT設備因對同一內部地址的外部地址映射管理不當而丟失,ProudNet在客戶端之間設有不同的UDP socket,只在必要的情況下嘗試打孔,最大限度地減少這種映射信息的丟失。

例如,如果已連接P2P,但未進行真正的P2P通信,則不進行打孔。 因此,在調用Proud.CNetServer.CreateP2PGroup , Proud.CNetServer.JoinP2PGroup後,仍然調用Proud.RmiContext.m_relayed, Proud.CNetClientInfo.m_RelayedP2P, Proud.CNetPeerInfo.m_RelayedP2P 值是 false, 但一旦您開始使用 P2P 通信, 將會更改爲 true 。

即使在上傳速度比下載速度慢的家用電腦(例如ADSL或ADSL2+)上打孔,也可能無法克服傳輸量,且發送端的發送電腦或NAT裝置可能無法正常運作。

此時,ProudNet使用內建的解析功能來偵測多播客戶端的過度傳輸,並將多播分發到中繼伺服器。

「連接埠預測技術」稱為 NAT 打洞策略。 該技術允許在symmetricNAT設備之間進行孔穿孔,但存在由於端口映射過多而產生的不良影響。 為了最大限度地減少副作用,ProudNet 最初避免過度打孔,然後逐漸轉向連接埠預測等激進方法。 因此,在某些NAT設備中,將路由切換到直接P2P需要一段時間,但這不是問題,因為它先使用打洞,然後使用中繼技術。

ProudNet的UDP通訊相關效能

ProudNet在使用UDP協議時,爲了提高通信性能,採用Coalesce, MTU discovery fail預防等方法。

在小容量通訊(例如延遲小於 1 毫秒的 LAN 環境)中,通訊負載似乎大於實際 RMI 資料容量。 然而,在通訊量增加或延遲較高的 WAN 環境中,與 LAN 中的少量通訊相比,通訊負載會降低。

在相距100公里以上的互聯網通信中,需要經過大量機型的Gateway設備的分組。 每個網關都指定了不同的可承受MTU大小,但當發送方超過定義的MTU大小時,就會發生ICMP分組分組。

一些用戶由於害怕ICMP攻擊而設置屏蔽所有類型的ICMP分組,在這種情況下,由於無法處理ICMP分組分組,MTU discovery失敗,最終導致兩個主機之間的UDP通信中斷。

ProudNet 具有防止這種情況發生的功能。

ProudNet 上的加密通信

ProudNet的加密通訊協定非常強大。

需要加密的訊息使用對稱金鑰進行加密,此時使用的對稱金鑰使用公鑰進行加密並在主機之間進行交換。 這些加密金鑰無法被第三方破解,因為它們不僅在伺服器和用戶端中,而且在客戶端之間的 P2P 通訊中都被分配了唯一的值。

此外,加密訊息的內部內容每次傳輸到另一台主機時都會發生顯著變化,從而防止駭客在捕獲資料包後重新傳輸相同或相似訊息的嘗試。 但是,它的處理速度比非加密訊息傳遞要低,因此請謹慎使用。

ProudNet 使用 128 位元 RSA 作為非對稱金鑰演算法,使用 AES 或 Fast 作為對稱金鑰演算法。 由於單獨使用RSA需要太多的計算量,因此將其與對稱金鑰演算法結合使用。

它不僅為客戶端和伺服器之間的通訊提供了加密功能,還為P2P通訊提供了加密功能,提供了出色的安全性。 此外,RMI中使用的對稱金鑰是高度可靠的,因為它是在初始伺服器連線時使用RSA演算法公鑰加密後進行交換的。

ProudNet 用戶端連線到伺服器時發生的 Proud::INetServerEvent::OnConnectionRequest 事件中的自訂欄位未加密。 請不要透過此方式傳遞您的訊息。

- ProudNet加密技術

ProudNet 根據效能和安全性等級提供各種加密功能。 若要傳送加密訊息,請呼叫 RMI 方法或在 SendUserMessage 系列方法中輸入的參數中的 Proud.RmiContext.m_encryptMode 中選擇所需的加密方法。

Proud::RmiContext rmiContext;
rmiContext.m_encryptMode = Proud::EncryptMode::EM_Secure;
// proxy 函數示例
Proxy.RequestLogon(Proud::HostID::HostID_Server, rmiContext, m_Name, password);
Proud::RmiContext rmiContext;
rmiContext.m_encryptMode = Proud::EncryptMode::EM_Fast;
Proxy.RequestLogon(Proud::HostID::HostID_Server, rmiContext, m_Name, password);

或者您可以像這樣輕鬆地使用它。

Proxy.RequestLogon(Proud::HostID::HostID_Server,Proud::RmiContext::SecureReliableSend, m_Name, password); 
// 使用 EM_Secure
Proxy.RequestLogon(Proud::HostID::HostID_Server,Proud::RmiContext::FastEncryptedReliableSend, m_Name, password); 
// 使用 EM_Fast

在P2P群組中使用加密功能時 CStartServerParameterBase::m_enableP2PEncryptedMessaging 的值必須設為 true

在 C# 中,您可以使用 StarSeverParameterBase.enableP2PEncryptedMessaging

- 加密金鑰長度:加密等級和效能之間的平衡

ProudNet 的加密過程涉及主機之間的內部金鑰交換。 此時,使用者可以設定交換和接收的金鑰長度,設定時必須考慮系統的效能和加密等級。

加密金鑰的長度可以在啟動伺服器時在參數 Proud.CStartServerParameter.m_encryptedMessageKeyLengthProud.CStartServerParameter.m_fastEncryptedMessageKeyLength 中設定。

  • Proud.CStartServerParameter.m_encryptedMessageKeyLength 參數

這是指使用 AES 加密時金鑰的長度,您可以設定 Proud.EncryptLevel.EncryptLevel_LowProud.EncryptLevel.EncryptLevel_MiddleProud.EncryptLevel.EncryptLevel_High 的金鑰長度。

  • Proud.CStartServerParameter.m_fastEncryptedMessageKeyLength 參數

指的是使用快速加密時的金鑰長度,可以設定Proud.FastEncryptLevel.FastEncryptLevel_LowProud.FastEncryptLevel.FastEncryptLevel_Middle Proud.FastEncryptLevel.FastEncryptLevel_High的金鑰長度。

AES 加密比 Fast 稍慢,但提供高品質的加密。

然而,對於不重要的數據,例如角色移動訊息,或需要大量發送和接收的訊息,您可以使用Fast,因為它的效能很快。

- ProudNet的Fast AES演算法性能比較

下面是ProudNet的Fast AES演算法的效能比較。 測量了執行 100,000 次加密和解密(每次一次)所需的時間。

測試規格

項目規格

OS

Windows 7 Professional K

CPU

Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 3.40GHz

RAM

16.0GB

System type

64-bit Operating System

ProudNet 訊息壓縮功能

ProudNet允許對訊息進行壓縮和傳輸,並且透過使用主機的CPU來減少通訊量,從而提高效率。 若要壓縮訊息,請呼叫 RMI 方法或在呼叫 SendUserMessage 方法時將參數 Proud.RmiContext.m_compressMode 設定為 Proud.CM_None 以外的值。

Proud::RmiContext rmi = Proud::RmiContext::ReliableSend;
rmi.m_compressMode = Proud::CompressMode::CM_Zip;
 
Proxy.SendFileChunk(Proud::HostID::HostID_Server, rmi, dataBlock);

Last updated