Ruffles es una biblioteca UDP totalmente administrada diseñada para un alto rendimiento y baja latencia.
Hay muchas bibliotecas RUDP como ENET, Lidgren, Litenetlib. Si bien muchos de ellos son geniales, los volantes tienen como objetivo completar un nicho que no esté lleno, que es liviano las bibliotecas totalmente administradas.
Para comparar con los ejemplos anteriores, Enet es increíble y es más o menos lo que Ruffles quiere ser, pero no está administrado. Lidgren, Litenetlib y muchas otras bibliotecas administradas pueden sentirse demasiado hinchadas y contienen muchas características que son innecesarias y a menudo son mucho más lentas.
Ruffles tiene muchas características que otros Libs carecen. Vea a continuación un resumen y una explicación detallada de cada uno.
El protocolo de Ruffles requiere que se complete un desafío antes de que se pueda establecer una conexión. Actualmente, el desafío es un desafío como hashcash que suministra el servidor, la fuerza bruta resuelta por el cliente y se envía. (Utiliza la función hash Fowler-Noll-VO en lugar de SHA1 actualmente).
La amplificación de DOS se evita al requerir los tamaños de mensajes de conexión no proporsionales. Además, debido al desafío de conexión, no es computacionalmente factible atacar a la capa 4.
Ruffles tiene una cantidad fija de ranuras de conexión que se pueden usar para conexiones pendientes, esto limita la usabilidad de los ataques de llenado de ranuras en la capa 4. Las conexiones pendientes tienen un tiempo de espera fijo para resolver el desafío hashcash computacionalmente costoso antes de ser eliminado, la ranura estará disponible una vez más después de eso. Como esto solo limita los ataques de llenado de ranuras, los volantes también tienen un mecanismo de seguridad en el que se debe resolver un hashcash en el primer mensaje. El cliente genera este desafío y el servidor verificará que la fecha utilizada es reciente y que el IV aún no se ha utilizado, lo que obliga a los clientes a recomputar el desafío hashcash cada vez que desean inicializar un apretón de manos.
Con estas mitigaciones de seguridad, la única forma de derribar el servidor es agotar todos los recursos de CPU.
Ruffles maneja toda la gestión de la conexión para usted. Es un protocolo totalmente orientado a la conexión con paquetes de Keepalive de latidos enviados para garantizar que la conexión esté viva.
Ruffles está completamente libre de basura, esto se logra con un asignador de memoria personalizado en el espacio GC. Esto asegura que no se filtre ninguna memoria al recolector de basura a menos que con fines de tamaño de tamaño. Esto hace que los volantes se abran rápidamente. También evita las copias de la memoria tanto como sea posible. Debido a que los volantes aún se ejecutan en el espacio GC, el recolector de basura manejará cualquier filtración de memoria en los volantes y el usuario se notificará a medida que se llama al destructor de la memoria junto con una pila de donde la memoria filtrada se asignó originalmente. Ver implementación.
Actualmente hay algunas formas de enviar mensajes en volantes. Los tipos son:
Se garantiza que todos los mensajes se entregarán, el pedido no está garantizado, los duplicados se eliminan. Utiliza una ventana deslizante fija.
Se garantiza que todos los mensajes se entregarán con el pedido que también se garantiza, se retiran los duplicados. Utiliza una ventana deslizante fija.
Se garantiza que todos los mensajes se entregarán con el pedido que también se garantiza, se retiran los duplicados. Utiliza una ventana deslizante fija. Permite que los mensajes grandes se fragmenten.
La entrega no está garantizada ni el pedido. Los duplicados se dejan caer.
La entrega no está garantizada, pero el pedido es. Se dejan caer paquetes y duplicados más antiguos.
La entrega no está garantizada ni el pedido. Los duplicados no se dejan caer.
Paquetes UDP en bruto que no requieren una conexión.
No se garantizan que todos los mensajes se entreguen. Si envía múltiples mensajes, al menos uno tiene ganas de llegar. Si envía un solo mensaje, se garantiza que llegue. Los mensajes siempre estarán en orden. Los duplicados se dejan caer.
Se garantiza que todos los mensajes se entregarán, el pedido no está garantizado, los duplicados se eliminan. Utiliza una ventana deslizante fija. Permite que los mensajes grandes se fragmenten.
Ruffles está nativamente múltiple y utiliza un hilo de trabajador de fondo de forma predeterminada para manejar la E/S de la red.
Todas las API públicas en volantes están diseñadas para ser seguras y se puede acceder desde cualquier hilo.
Ruffles no tiene 100% de dependencia, por lo tanto, es muy portátil y debe ejecutarse en la mayoría de las plataformas.
Ruffles admite el modo de doble enchufe IPv6. Lo hace usando dos enchufes unidos al mismo puerto, lo que logra la funcionalidad completa de pila dual que es invisible para el usuario.
Los paquetes pequeños se retrasarán para el envío, esto les permite fusionarse en un paquete más grande. Esto se puede deshabilitar y habilitarse por paquete. El tamaño de retraso y la fusión máxima también se pueden configurar.
Los paquetes se pueden enviar como una fractura de Reliablesequenced o confiable, lo que permite que un solo paquete sea de un tamaño de hasta 2^15*1450 bytes = 47513600 bytes = 47.5 megabyte.
Los paquetes ACK se fusionan en bitfields para hacerlos mucho más compactos.
Se pueden recuperar estadísticas detalladas de las conexiones, incluidos los bytes enviados, paquetes enviados, horarios de ida y vuelta y más.
Descubre automáticamente la MTU más grande posible para cada conexión.
Limite la cantidad de tráfico que se puede enviar a una conexión. Los algoritmos personalizados se pueden adaptar con la interfaz iBandWidthTracker.
Esto es algo que quiero y planeo agregar
Aquí están las características que se consideran pero no decididas. Esto es para evitar la hinchazón.
El canal fragmentado actualmente no tiene ninguna velocidad de flujo para ACK Resistes.
Debido a un error de unidad, los volantes no funcionan correctamente en IL2CPP de forma predeterminada. El error ha sido reportado a la unidad. Si necesita ejecutar volantes con IL2CPP, compítelo con Esto ha sido parcheado. Siéntase libre de usar IL2CPP en su proyecto.MILLISECONDS_SELECT Define. Esto hará que el método de socket. Seleccionar use un tiempo de espera basado en milisegundos en lugar de microsegundos.