Ruffles est une bibliothèque UDP entièrement gérée conçue pour des performances élevées et une faible latence.
Il existe de nombreuses bibliothèques RUDP telles que Enet, Lidgren, Linedetlib. Bien que beaucoup d'entre eux soient excellents, Ruffles vise à remplir un créneau qui n'est pas en grande partie rempli, qu'il s'agissait de bibliothèques légères entièrement gérées.
Pour comparer les exemples ci-dessus, Enet est incroyable et c'est à peu près ce que les volants veulent être, mais il n'est pas géré. Lidgren, Linedetlib et de nombreuses autres bibliothèques gérées peuvent se sentir trop gonflées et contenir de nombreuses fonctionnalités qui ne sont pas nécessaires et elles sont souvent beaucoup plus lentes.
Ruffles a de nombreuses fonctionnalités qui manquent d'autres LIB. Voir ci-dessous pour un résumé et une explication détaillée de chacun.
Le protocole Ruffles nécessite un défi pour terminer avant qu'une connexion puisse être établie. Actuellement, le défi est un défi de type hashcash qui est fourni par le serveur, une force brute résolue par le client et soumise. (Utilise la fonction de hachage Fowler-Noll-VO au lieu de SHA1 actuellement).
L'amplification DOS est évitée en nécessitant des tailles de message de connexion non proprimandées. De plus, en raison du défi de connexion, il n'est pas possible d'attaquer sur le calcul de la couche 4.
Ruffles a une quantité fixe de créneaux de connexion qui peuvent être utilisés pour les connexions en attente, ce qui limite la convivialité des attaques de remplissage de machines à sous sur la couche 4. Les connexions en attente ont un délai fixe pour résoudre le défi de hashcash coûteux en calcul avant d'être éliminé, la machine à sous sera à nouveau disponible après cela. Comme cela ne limite que les attaques de remplissage de machines à sous, Ruffles a également un mécanisme de sécurité où un hashcash doit être résolu dans le premier message. Ce défi est généré par le client et le serveur vérifiera que la date utilisée est récente et que l'IV n'a pas déjà été utilisée, forçant les clients à recomputer le défi Hashcash chaque fois qu'il souhaite initialiser une poignée de main.
Avec ces atténuations de sécurité, la seule façon de faire tomber le serveur est d'épuiser toutes les ressources CPU.
Ruffles gère toute la gestion des connexions pour vous. Il s'agit d'un protocole entièrement axé sur la connexion avec des paquets de rythme cardiaque envoyés pour s'assurer que la connexion est vivante.
Ruffles est entièrement sans ordures, ceci est accompli avec un allocateur de mémoire personnalisé dans l'espace GC. Cela garantit qu'aucune mémoire n'est divulguée au collecteur des ordures, sauf si à des fins de redimensionnement. Cela rend les volants en flambement rapidement. Il évite également autant que possible les copies de mémoire. Étant donné que les volants s'exécutent toujours dans l'espace GC, toutes les fuites de mémoire en volants seront gérées par le collecteur des ordures et l'utilisateur sera informé car le destructeur de la mémoire est appelé avec un stacktrace de l'endroit où la mémoire divulguée a été initialement allouée. Voir l'implémentation.
Il existe actuellement quelques façons d'envoyer des messages en volants. Les types sont:
Tous les messages sont garantis pour être livrés, la commande n'est pas garantie, les doublons sont supprimés. Utilise une fenêtre coulissante fixe.
Tous les messages sont garantis pour être livrés avec la commande également garantie, les doublons sont supprimés. Utilise une fenêtre coulissante fixe.
Tous les messages sont garantis pour être livrés avec la commande également garantie, les doublons sont supprimés. Utilise une fenêtre coulissante fixe. Permet de se fragmenter de gros messages.
La livraison n'est pas garantie ni la commande. Les doublons sont abandonnés.
La livraison n'est pas garantie mais la commande l'est. Des paquets et des doublons plus anciens sont abandonnés.
La livraison n'est pas garantie ni la commande. Les doublons ne sont pas abandonnés.
Des paquets UDP bruts qui ne nécessitent pas de connexion.
Tous les messages ne sont pas garantis pour être livrés. Si vous envoyez plusieurs messages, au moins un est Guranted pour arriver. Si vous envoyez un seul message, il est assuré d'arriver. Les messages seront toujours en ordre. Les doublons sont abandonnés.
Tous les messages sont garantis pour être livrés, la commande n'est pas garantie, les doublons sont supprimés. Utilise une fenêtre coulissante fixe. Permet de se fragmenter de gros messages.
Ruffles est nativement multi-file et utilise un thread de travailleur d'arrière-plan par défaut pour gérer les E / S du réseau.
Toutes les API publiques dans les volants sont conçues pour être sûres et accessibles à partir de n'importe quel fil.
Ruffles est sans dépendance à 100%, il est donc très portable et devrait fonctionner sur la plupart des plateformes.
Ruffles prend en charge le mode Dual Socket IPv6. Il le fait en utilisant deux sockets liés au même port, accomplissant ainsi une fonctionnalité complète de la pile double qui est invisible pour l'utilisateur.
Les petits paquets seront retardés pour l'envoi, ce qui leur permet d'être fusionné dans un paquet plus grand. Cela peut être désactivé et activé par paquet. Le retard et la taille de fusion maximale peuvent également être configurés.
Les paquets peuvent être envoyés en tant que filiabelesenquedfragmented ou fiablefragmented qui permet à un seul paquet d'être d'une taille allant jusqu'à 2 ^ 15 * 1450 octets = 47513600 octets = 47,5 mégaoctets.
Les paquets ACK sont fusionnés dans Bitfields pour les rendre beaucoup plus compacts.
Des statistiques détaillées peuvent être récupérées à partir de connexions, y compris les octets envoyés, les paquets envoyés, les temps aller-retour et plus encore.
Découvre automatiquement le plus grand MTU possible pour chaque connexion.
Limitez le montant du trafic autorisé à être envoyé à une connexion. Les algorithmes personnalisés peuvent être adaptés avec l'interface IbandwidthTracker.
C'est des choses que je veux et je prévois d'ajouter
Voici les fonctionnalités qui sont considérées mais non décidées. C'est pour empêcher le ballonnement.
Le canal fragmenté n'a actuellement aucun débit pour les renvois ACK.
En raison d'un bogue d'unité, Ruffles ne fonctionne pas correctement dans IL2CPP par défaut. Le bug a été signalé à Unity. Si vous avez besoin d'exécuter des volants avec IL2CPP, compilez-le avec les Cela a été corrigé. N'hésitez pas à utiliser IL2CPP dans votre projet.MILLISECONDS_SELECT définir. Cela fera que la méthode Socket.Select utilise un délai d'expiration basé sur une milliseconde au lieu de microsecondes.