Ruffles ist eine vollständig verwaltete UDP -Bibliothek, die für hohe Leistung und niedrige Latenz ausgelegt ist.
Es gibt viele RUDP -Bibliotheken wie Enet, Lidgren, Litenetlib. Während viele von ihnen großartig sind, zielen Rüschen darauf ab, eine Nische zu füllen, die größtenteils nicht gefüllt ist, dass es leichte, vollständig verwaltete Bibliotheken ist.
Um mit den obigen Beispielen zu vergleichen, ist Enet erstaunlich und so ziemlich das, was Rüschen sein wollen, aber es ist nicht verwaltet. Lidgren, Litenetlib und viele andere verwaltete Bibliotheken können sich zu aufgebläht fühlen und viele Funktionen enthalten, die unnötig sind und oft viel langsamer sind.
Ruffles hat viele Merkmale, die andere Bibliotheken fehlen. Im Folgenden finden Sie eine Zusammenfassung und eine detaillierte Erklärung von jedem.
Das Ruffles -Protokoll erfordert eine Herausforderung, bevor eine Verbindung hergestellt werden kann. Derzeit ist die Herausforderung eine Hashcash -ähnliche Herausforderung, die vom Server bereitgestellt wird, die vom Client gelöst und eingereicht wird. (Verwendet Fowler-noll-VO-Hash-Funktion anstelle von SHA1 derzeit).
Die DOS -Amplifikation wird verhindert, indem unkomplizierte Verbindungsnachrichtengrößen erforderlich sind. Darüber hinaus ist es aufgrund der Verbindungsherausforderung nicht rechnerisch machbar, auf Schicht 4 anzugreifen.
Rüschen verfügen über eine feste Menge an Verbindungsschlitzen, die für anhängige Verbindungen verwendet werden können. Dies begrenzt die Verwendbarkeit von Schlitzfüllangriffen auf Schicht 4. Ausstehende Verbindungen haben eine feste Zeitüberschreitung, um die rechnerisch teure Hashcash -Herausforderung zu lösen, bevor Sie ausgeschlagen werden. Der Steckplatz wird danach erneut verfügbar sein. Da dies nur die Schlitzfüllangriffe begrenzt, hat Ruffles auch einen Sicherheitsmechanismus, bei dem in der ersten Nachricht ein Hashcash gelöst werden muss. Diese Herausforderung wird vom Client generiert, und der Server wird überprüfen, ob das verwendete Datum in letzter Zeit ist und dass die IV noch nicht verwendet wurde, was die Clients dazu zwingt, die Hashcash -Herausforderung jedes Mal wiederzuberechnen, wenn sie einen Handshake initialisieren möchten.
Mit diesen Sicherheitsminderungen besteht die einzige Möglichkeit, den Server zu senken, darin, alle CPU -Ressourcen zu erschöpfen.
Ruffles kümmert sich um alle Verbindungsmanagements für Sie. Es handelt sich um ein vollständig verbindungsorientiertes Protokoll mit Heartbeat Keepalive -Paketen, um sicherzustellen, dass die Verbindung lebt.
Rüschen sind vollständig müllfrei, dies wird mit einem benutzerdefinierten Speicher Allocator im GC -Raum erreicht. Dies stellt sicher, dass kein Speicher an den Müllsammler weitergegeben wird, es sei denn, zur Änderungszwecke. Dies macht Rüschen schnell. Es vermeidet auch Speicherkopien so weit wie möglich. Da Rüschen immer noch im GC -Raum läuft, werden vom Müllkollektor alle Speicherlecks in Rüschen behandelt und der Benutzer wird benachrichtigt, da der Destruktor des Speichers zusammen mit einer Stacktrace von dem ursprünglich verteilten Speicher angerufen wird. Siehe Implementierung.
Derzeit gibt es einige Möglichkeiten, Nachrichten in Rüschen zu senden. Die Typen sind:
Alle Nachrichten werden garantiert geliefert, die Bestellung ist nicht garantiert, Duplikate werden fallen gelassen. Verwendet ein festes Schiebenfenster.
Es wird garantiert, dass alle Nachrichten mit der Bestellung garantiert werden, dass Duplikate fallen gelassen werden. Verwendet ein festes Schiebenfenster.
Es wird garantiert, dass alle Nachrichten mit der Bestellung garantiert werden, dass Duplikate fallen gelassen werden. Verwendet ein festes Schiebenfenster. Ermöglicht, dass große Botschaften fragmentiert werden.
Die Lieferung ist weder garantiert noch die Bestellung. Duplikate werden fallen gelassen.
Die Lieferung ist nicht garantiert, aber die Bestellung ist. Ältere Pakete und Duplikate werden fallen gelassen.
Die Lieferung ist weder garantiert noch die Bestellung. Duplikate werden nicht fallen gelassen.
Roh -UDP -Pakete, für die keine Verbindung erforderlich ist.
Es wird nicht garantiert, dass alle Nachrichten geliefert werden. Wenn Sie mehrere Nachrichten senden, ist mindestens einer gurantiert. Wenn Sie eine einzige Nachricht senden, wird garantiert eintreffen. Nachrichten werden immer in Ordnung sein. Duplikate werden fallen gelassen.
Alle Nachrichten werden garantiert geliefert, die Bestellung ist nicht garantiert, Duplikate werden fallen gelassen. Verwendet ein festes Schiebenfenster. Ermöglicht, dass große Botschaften fragmentiert werden.
Ruffles sind nativ mit mehreren Threads und verwendet standardmäßig einen Hintergrund -Worker -Thread, um die Netzwerk -E/A zu verarbeiten.
Alle öffentlichen APIs in Rüschen sind so konzipiert, dass sie fadensicher sind und von jedem Thread aus zugegriffen werden können.
Rüschen sind zu 100% abhängig, es ist daher sehr tragbar und sollte auf den meisten Plattformen ausgeführt werden.
Ruffles unterstützt den IPv6 -Dual -Socket -Modus. Dies geschieht mit zwei an denselben Port gebundenen Sockeln, wodurch die für den Benutzer unsichtbare vollständige Dual -Stack -Funktionalität durchgeführt wird.
Kleine Pakete werden zum Senden verzögert. Dadurch können sie in ein größeres Paket verschmolzen werden. Dies kann auf der Basis pro Paket deaktiviert und aktiviert werden. Die Verzögerung und die maximale Zusammenführungsgröße können ebenfalls konfiguriert werden.
Pakete können als ReliableSequaCedfragmented oder zuverlässig gesendet werden, wodurch ein einzelnes Paket eine Größe von bis zu 2^15*1450 Bytes = 47513600 Bytes = 47,5 Megabyte hat.
ACK -Pakete werden zu Bitfields zusammengeführt, um sie viel kompakter zu machen.
Detaillierte Statistiken können aus Verbindungen abgerufen werden, einschließlich der gesendeten Bytes, der gesendeten Pakete, den Rundreisezeiten und mehr.
Entdeckt automatisch die größte MTU, die für jede Verbindung möglich ist.
Begrenzen Sie die Menge an Verkehr, die an eine Verbindung gesendet werden darf. Benutzerdefinierte Algorithmen können an die IBandWidthTracker -Schnittstelle angepasst werden.
Das ist Dinge, die ich möchte und planen zu planen, hinzuzufügen
Hier sind die Funktionen, die berücksichtigt werden, aber nicht entschieden werden. Dies soll das Aufblähen verhindern.
Der fragmentierte Kanal hat derzeit keine Durchflussrate für ACK.
Aufgrund eines Unity -Fehlers funktioniert Ruffles in IL2CPP standardmäßig nicht ordnungsgemäß. Der Fehler wurde der Einheit gemeldet. Wenn Sie Rüschen mit IL2CPP ausführen müssen, kompilieren Sie es mit der Define Dies wurde gepatcht. Nutzen Sie IL2CPP in Ihrem Projekt.MILLISECONDS_SELECT . Dadurch wird die Socket.Select -Methode ein Millisekunden -Timeout anstelle von Mikrosekunden verwendet.