Ruffles é uma biblioteca UDP totalmente gerenciada, projetada para alto desempenho e baixa latência.
Existem muitas bibliotecas RUDP, como Enet, Lidgren, Litenetlib. Enquanto muitos deles são ótimos, as babados pretendem preencher um nicho que não é preenchido, que ser bibliotecas totalmente gerenciadas leves.
Para comparar com os exemplos acima, Enet é incrível e é praticamente o que Ruffles quer ser, mas não é gerenciado. Lidgren, Litenetlib e muitas outras bibliotecas gerenciadas podem parecer muito inchadas e conter muitos recursos desnecessários e geralmente são muito mais lentos.
Ruffles tem muitos recursos que outros LIBs não têm. Veja abaixo um resumo e uma explicação detalhada de cada um.
O protocolo Ruffles exige que um desafio seja concluído antes que uma conexão possa ser estabelecida. Atualmente, o desafio é um desafio de hashcash como fornecido pelo servidor, força bruta resolvida pelo cliente e enviada. (Usa a função FOWLER-NOLL-VO HASH em vez de SHA1 atualmente).
A amplificação do DOS é evitada exigindo tamanhos de mensagem de conexão desproporcionais. Além disso, devido ao desafio da conexão, não é computacionalmente viável atacar na camada 4.
O Ruffles possui uma quantidade fixa de slots de conexão que podem ser usados para conexões pendentes, isso limita a usabilidade dos ataques de enchimento de slots na camada 4. As conexões pendentes têm um tempo limite fixo para resolver o desafio de hashcash computacionalmente caro antes de ser nocauteado, o slot estará disponível mais uma vez depois. Como isso limita apenas ataques de enchimento de slots, os babados também têm um mecanismo de segurança em que um hashcash deve ser resolvido na primeira mensagem. Esse desafio é gerado pelo cliente e o servidor verificará se a data usada é recente e que o IV ainda não foi usado, forçando os clientes a recomputar o desafio do hashcash toda vez que desejam inicializar um handshake.
Com essas mitigações de segurança, a única maneira de reduzir o servidor é esgotar todos os recursos da CPU.
Ruffles lida com todo o gerenciamento de conexões para você. É um protocolo totalmente orientado para a conexão com pacotes de KeepAlive enviados para garantir que a conexão esteja viva.
Ruffles é totalmente livre de lixo, isso é realizado com um alocador de memória personalizado no espaço GC. Isso garante que nenhuma memória seja vazada para o coletor de lixo, a menos que seja para fins de redimensionamento. Isso faz de babados acelerando rapidamente. Também evita cópias de memória o máximo possível. Como os babados ainda são executados no espaço do GC, quaisquer vazamentos de memória em babados serão manuseados pelo coletor de lixo e o usuário será notificado, pois o destruidor da memória é chamado junto com um saco de onde a memória vazada foi originalmente alocada. Veja a implementação.
Atualmente, existem algumas maneiras de enviar mensagens em babados. Os tipos são:
Todas as mensagens são garantidas, o pedido não é garantido, as duplicatas são descartadas. Usa uma janela deslizante fixa.
Todas as mensagens são garantidas para serem entregues com o pedido também garantido, as duplicatas são descartadas. Usa uma janela deslizante fixa.
Todas as mensagens são garantidas para serem entregues com o pedido também garantido, as duplicatas são descartadas. Usa uma janela deslizante fixa. Permite que grandes mensagens sejam fragmentadas.
A entrega não é garantida nem a ordem. As duplicatas são descartadas.
A entrega não é garantida, mas o pedido é. Pacotes e duplicados mais antigos são descartados.
A entrega não é garantida nem a ordem. As duplicatas não são descartadas.
Pacotes UDP em bruto que não requerem uma conexão.
Todas as mensagens não são garantidas para serem entregues. Se você enviar várias mensagens, pelo menos uma é Gurenteed para chegar. Se você enviar uma única mensagem, é garantido que chegue. As mensagens sempre estarão em ordem. As duplicatas são descartadas.
Todas as mensagens são garantidas, o pedido não é garantido, as duplicatas são descartadas. Usa uma janela deslizante fixa. Permite que grandes mensagens sejam fragmentadas.
Ruffles é nativamente multi -rosqueado e usa um thread de trabalhadores em segundo plano por padrão para lidar com a E/S da rede.
Todas as APIs públicas em babados são projetadas para serem seguras de threads e podem ser acessadas em qualquer thread.
O Ruffles é 100% livre de dependência, é, portanto, muito portátil e deve ser executado na maioria das plataformas.
Ruffles suporta o modo de soquete duplo IPv6. Faz isso usando dois soquetes vinculados à mesma porta, realizando a funcionalidade completa da pilha dupla que é invisível para o usuário.
Pacotes pequenos serão adiados para o envio, isso permite que eles sejam mesclados em um pacote maior. Isso pode ser desativado e ativado por pacote. O atraso e o tamanho da mesclagem máxima também podem ser configurados.
Os pacotes podem ser enviados como fadmentados ou confiáveis, o que permite que um único pacote tenha um tamanho de até 2^15*1450 bytes = 47513600 bytes = 47,5 megabyte.
Os pacotes ACK são fundidos em campos de bits para torná -los muito mais compactos.
As estatísticas detalhadas podem ser recuperadas das conexões, incluindo os bytes enviados, pacotes enviados, horários de ida e volta e muito mais.
Descobre automaticamente o maior MTU possível para cada conexão.
Limite a quantidade de tráfego permitida para ser enviada para uma conexão. Os algoritmos personalizados podem ser adaptados com a interface ibandWidthTracker.
Isso é coisas que eu quero e planejo adicionar
Aqui estão os recursos que são considerados, mas não decididos. Isso é para evitar inchaço.
Atualmente, o canal fragmentado não possui nenhuma taxa de fluxo para o ACK se reassa.
Devido a um bug da unidade, o Ruffles não funciona corretamente no IL2CPP por padrão. O bug foi relatado à unidade. Se você precisar executar babados com o IL2CPP, compila -o com o Isso foi corrigido. Sinta -se à vontade para usar o IL2CPP em seu projeto.MILLISECONDS_SELECT Definir. Isso fará com que o método Socket.Select use um tempo limite baseado em milissegundos em vez de microssegundos.