Se você tiver uma situação em que uma conexão TCP seja potencialmente muito lenta e uma 'conexão' UDP seja potencialmente muito não confiável, o que você deve usar? Existem vários protocolos UDP padrão confiáveis, que experiência você tem com eles?
Discuta um protocolo por resposta e se outra pessoa já mencionou aquele que você usa, considere votá-lo e usar um comentário para elaborá-lo, se necessário.
Estou interessado nas várias opções aqui, das quais TCP está em uma extremidade da escala e UDP está na outra. Várias opções confiáveis de UDP estão disponíveis e cada uma traz alguns elementos de TCP para UDP.
Eu sei que muitas vezes o TCP é a escolha correta, mas ter uma lista de alternativas geralmente é útil para ajudar alguém a chegar a essa conclusão. Coisas como Enet, RUDP, etc. que são construídas em UDP têm vários prós e contras, você já os usou, quais são suas experiências?
Para evitar dúvidas, não há mais informações; esta é uma pergunta hipotética e que eu esperava que gerasse uma lista de respostas que detalhassem as várias opções e alternativas disponíveis para alguém que precisa tomar uma decisão.
fonte
Respostas:
É difícil responder a essa pergunta sem algumas informações adicionais sobre o domínio do problema. Por exemplo, que volume de dados você está usando? Com que frequência? Qual é a natureza dos dados? (por exemplo, são dados únicos, únicos? Ou é um fluxo de dados de amostra? etc.) Para qual plataforma você está desenvolvendo? (por exemplo, desktop / servidor / incorporado) Para determinar o que você quer dizer com "muito lento", que meio de rede você está usando?
Mas em termos (muito!) Gerais, acho que você vai ter que tentar muito superar o tcp em velocidade, a menos que possa fazer algumas suposições rígidas sobre os dados que está tentando enviar.
Por exemplo, se os dados que você está tentando enviar são tais que você pode tolerar a perda de um único pacote (por exemplo, dados regularmente amostrados onde a taxa de amostragem é muitas vezes maior do que a largura de banda do sinal), então você provavelmente pode sacrificar alguma confiabilidade de transmissão, garantindo que você possa detectar corrupção de dados (por exemplo, através do uso de um bom crc)
Mas se você não pode tolerar a perda de um único pacote, você terá que começar a introduzir os tipos de técnicas de confiabilidade que o tcp já possui. E, sem colocar uma quantidade razoável de trabalho, você pode descobrir que está começando a construir esses elementos em uma solução de espaço do usuário com todos os problemas de velocidade inerentes a ela.
fonte
E quanto ao SCTP . É um protocolo padrão da IETF (RFC 4960)
Ele tem capacidade de agrupamento que pode ajudar na velocidade.
Atualização: uma comparação entre TCP e SCTP mostra que os desempenhos são comparáveis, a menos que duas interfaces possam ser usadas.
Atualização: um bom artigo introdutório .
fonte
ENET - http://enet.bespin.org/
Trabalhei com o ENET como um protocolo UDP confiável e escrevi uma versão amigável de soquetes assíncronos para um cliente meu que o está usando em seus servidores. Funciona muito bem, mas não gosto da sobrecarga que o ping ponto a ponto adiciona às conexões ociosas; quando você tem muitas conexões, fazer ping em todas elas regularmente é muito trabalhoso.
ENET lhe dá a opção de enviar múltiplos 'canais' de dados e para que os dados enviados não sejam confiáveis, confiáveis ou sequenciados. Também inclui o ping ponto a ponto mencionado anteriormente, que atua como um keep alive.
fonte
Temos alguns clientes da indústria de defesa que usam UDT (UDP-based Data Transfer) (consulte http://udt.sourceforge.net/ ) e estão muito satisfeitos com isso. Vejo que também tem uma licença BSD amigável.
fonte
RUDP - Protocolo de Datagrama de Usuário Confiável
Isso fornece:
Parece um pouco mais configurável com relação a keep alives do que ENet, mas não oferece tantas opções (ou seja, todos os dados são confiáveis e sequenciados, não apenas os bits que você decidir que deveriam ser). Parece bastante simples de implementar.
fonte
Como outros apontaram, sua pergunta é muito geral, e se algo é ou não 'mais rápido' que o TCP depende muito do tipo de aplicativo.
O TCP é geralmente o mais rápido possível para streaming confiável de dados de um host para outro. No entanto, se seu aplicativo faz muitos pequenos picos de tráfego e espera por respostas, o UDP pode ser mais apropriado para minimizar a latência.
Existe um meio-termo fácil. O algoritmo de Nagle é a parte do TCP que ajuda a garantir que o remetente não sobrecarregue o receptor de um grande fluxo de dados, resultando em congestionamento e perda de pacotes.
Se você precisa da entrega confiável e em ordem do TCP, e também da resposta rápida do UDP, e não precisa se preocupar com o congestionamento do envio de grandes fluxos de dados, desative o algoritmo de Nagle:
fonte
Qualquer um que decidir que a lista acima não é suficiente e que deseja desenvolver seu PRÓPRIO UDP confiável deve definitivamente dar uma olhada nas especificações QUIC do Google, pois isso cobre muitos casos complicados e possíveis ataques de negação de serviço. Eu não brinquei com uma implementação disso ainda, e você pode não querer ou precisar de tudo o que ele oferece, mas vale a pena ler o documento antes de embarcar em um novo design UDP "confiável".
Um bom ponto de partida para o QUIC é aqui , no Blog do Chromium.
O documento de design QUIC atual pode ser encontrado aqui .
fonte
A palavra-chave em sua frase é 'potencialmente'. Eu acho que você realmente precisa provar a si mesmo que o TCP é, de fato, muito lento para suas necessidades se você precisar de confiabilidade em seu protocolo.
Se você deseja obter confiabilidade do UDP, então basicamente irá reimplementar alguns dos recursos do TCP no topo do UDP, o que provavelmente tornará as coisas mais lentas do que apenas usar o TCP em primeiro lugar.
fonte
O protocolo DCCP, padronizado no RFC 4340 , "Datagram Congestion Control Protocol" pode ser o que você está procurando.
Parece implementado no Linux .
fonte
Pode ser RFC 5405 , "Diretrizes de uso de UDP Unicast para designers de aplicativos" será útil para você.
fonte
Você considerou compactar seus dados?
Conforme declarado acima, não temos informações sobre a natureza exata do seu problema, mas compactar os dados para transportá-los pode ajudar.
fonte
RUDP . Muitos servidores de soquete para jogos implementam algo semelhante.
fonte
A melhor maneira de obter confiabilidade usando UDP é construir a confiabilidade no próprio programa de aplicação (por exemplo, adicionando mecanismos de reconhecimento e retransmissão)
fonte