Rufflesは、高性能と低遅延のために設計された完全に管理されたUDPライブラリです。
Enet、Lidgren、Litenetlibなど、多くのRUDPライブラリがあります。それらの多くは素晴らしいですが、Rufflesは、ほとんど満たされていない1つのニッチを埋めることを目指しています。
上記の例と比較するために、Enetは驚くべきものであり、Rufflesが望んでいるものですが、それは管理されていません。 Lidgren、Litenetlib、および他の多くの管理されたライブラリは、あまりにも肥大化していると感じ、不要な多くの機能を含むことができ、しばしばはるかに遅くなります。
Rufflesには、他のLibが欠けている多くの機能があります。それぞれの要約と詳細な説明については、以下を参照してください。
Rufflesプロトコルは、接続を確立する前に完了するためのチャレンジを必要とします。現在、課題は、サーバーによって提供され、クライアントによって解決され、提出されたブルートフォースによって提供されるハッシュカッシュのようなチャレンジです。 (現在SHA1の代わりにFowler-Noll-VOハッシュ機能を使用しています)。
DOS増幅は、非均一な接続メッセージサイズを必要とすることにより防止されます。さらに、接続チャレンジのため、レイヤー4に攻撃することは計算可能ではありません。
Rufflesには、保留中の接続に使用できる固定額の接続スロットがあります。これにより、レイヤー4のスロット充填攻撃の使いやすさが制限されます。これはスロット充填攻撃のみを制限するため、フリルには、ハッシュカッシュを最初のメッセージで解決する必要があるセキュリティメカニズムもあります。この課題はクライアントによって生成され、サーバーは使用されている日付が最近であり、IVがまだ使用されていないことを確認し、クライアントがハッシュシェイクを初期化するたびにハッシュカッシュチャレンジを再計算することを強制します。
これらのセキュリティ緩和により、サーバーを倒す唯一の方法は、すべてのCPUリソースを使い果たすことです。
フリルは、すべての接続管理を処理します。これは、接続が生存していることを確認するために送信されるハートビートのキープライブパケットを備えた完全な接続指向のプロトコルです。
フリルは完全にゴミが無料で、これはGCスペースのカスタムメモリアロケーターで達成されます。これにより、サイズ変更の目的でない限り、ゴミコレクターにメモリが漏れないようにします。これにより、フリルが激しくなります。また、メモリコピーを可能な限り回避します。フリルはまだGCスペースで動作するため、フリルのメモリリークはガベージコレクターによって処理され、メモリのデストラクタが漏れたメモリが元々割り当てられた場所のスタックトレースとともに呼び出されると、ユーザーは通知されます。実装を参照してください。
現在、Rufflesでメッセージを送信する方法がいくつかあります。タイプは次のとおりです。
すべてのメッセージが配信されることが保証されており、注文は保証されず、複製は削除されます。固定スライドウィンドウを使用します。
すべてのメッセージは、注文も保証されていることで配信されることが保証され、複製は削除されます。固定スライドウィンドウを使用します。
すべてのメッセージは、注文も保証されていることで配信されることが保証され、複製は削除されます。固定スライドウィンドウを使用します。大きなメッセージを断片化できます。
配達は保証されておらず、注文もありません。複製はドロップされます。
配達は保証されていませんが、注文は保証されます。古いパケットと複製が削除されます。
配達は保証されておらず、注文もありません。複製はドロップされません。
接続を必要としない生のUDPパケット。
すべてのメッセージが配信されることは保証されていません。複数のメッセージを送信する場合、少なくとも1つは到着するためにGuranteedです。単一のメッセージを送信すると、到着することが保証されています。メッセージは常に順調です。複製はドロップされます。
すべてのメッセージが配信されることが保証されており、注文は保証されず、複製は削除されます。固定スライドウィンドウを使用します。大きなメッセージを断片化できます。
Rufflesはネイティブにマルチスレッド化されており、デフォルトではネットワークI/Oを処理するためにバックグラウンドワーカースレッドを使用します。
フリルのすべてのパブリックAPIは、スレッドが安全であるように設計されており、あらゆるスレッドからアクセスできます。
フリルは100%依存関係がないため、非常にポータブルであり、ほとんどのプラットフォームで実行されるはずです。
RufflesはIPv6デュアルソケットモードをサポートします。これは、同じポートにバインドされた2つのソケットを使用して、ユーザーには見えない完全なデュアルスタック機能を達成することで行います。
小さなパケットは送信のために遅延します。これにより、1つの大きなパケットにマージできます。これを無効にして、パケットごとに有効にすることができます。遅延と最大マージのサイズも構成できます。
パケットは、1つのパケットを最大2^15*1450バイト= 47513600バイト= 47.5メガバイトのサイズにすることができるように、レアブルセキュアンスフレーミングまたは信頼性の高いものとして送信できます。
ACKパケットはビットフィールドに統合され、よりコンパクトになります。
詳細な統計は、送信されたバイト、送信されたパケット、往復時間などを含む接続から取得できます。
各接続に対して可能な最大のMTUを自動的に発見します。
接続に送信されることが許可されているトラフィックの量を制限します。カスタムアルゴリズムは、iBandWidThtrackerインターフェイスに適合させることができます。
これは私がしたいものであり、追加する計画です
考慮されているが決定されていない機能は次のとおりです。これは膨満感を防ぐためです。
断片化されたチャネルには現在、ACKリセンズの流量はありません。
Unityのバグのため、DefaultではRufflesはIL2CPPで適切に機能しません。バグは統一されています。 IL2CPPでフリルを実行する必要がある場合は、 これはパッチが適用されています。プロジェクトでIL2CPPを自由に使用してください。MILLISECONDS_SELECT Defineでコンパイルします。これにより、Socket.Selectメソッドは、マイクロ秒の代わりにミリ秒ベースのタイムアウトを使用します。