Pergunta

Se você tem uma situação onde uma conexão TCP é potencialmente muito lento e 'conexão' a ??UDP é potencialmente muito pouco fiáveis ??o que você usa? Existem vários protocolos UDP confiável padrão lá fora, que experiências você tem com eles?

Por favor, discutir um protocolo por resposta e se alguém já mencionou o que você usa, em seguida, considerar votando-os e utilizando um comentário para elaborar, se necessário.

Estou interessado nas várias opções aqui, dos quais TCP está em uma extremidade da escala e UDP está na outra. Várias opções de UDP confiáveis ??estão disponíveis e cada um traz alguns elementos do TCP para UDP.

Eu sei que muitas vezes TCP é a escolha correta, mas ter uma lista das alternativas é frequentemente útil para ajudar um chegar a essa conclusão. Coisas como Enet, RUDP, etc que são construídos sobre UDP têm vários prós e contras, você usou-los, quais são suas experiências?

Para que não restem dúvidas, não há mais informação, esta é uma pergunta hipotética e um que eu esperava obter uma lista de respostas que detalham as várias opções e alternativas disponíveis para alguém que precisa para tomar uma decisão.

Foi útil?

Solução

É difícil responder a essa pergunta sem algumas informações adicionais sobre o domínio do problema. Por exemplo, o volume de dados você está usando? Com que frequência? Qual é a natureza dos dados? (Por ex. É único, uma fora de dados? Ou é uma corrente de dados de amostra? Etc.) O que plataforma você está desenvolvendo para? (Eg. Desktop / servidor / embedded) Para determinar o que você quer dizer com "muito lento", o meio de rede você está usando?

Mas em (muito!) Termos gerais eu acho que você vai ter que tentar realmente difícil de bater tcp para a velocidade, a menos que você pode fazer algumas suposições difíceis sobre os dados que você está tentando enviar.

Por exemplo, se os dados que você está tentando enviar é tal 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 provavelmente você pode sacrificar alguma confiabilidade da transmissão, garantindo que você pode detectar a corrupção de dados (por exemplo., através da utilização de uma boa CRC)

Mas se você não pode tolerar a perda de um único pacote, então você vai ter que começar a introduzir os tipos de técnicas para a confiabilidade que o TCP já tem. E, sem colocar em uma quantidade razoável de trabalho, você pode achar que você está começando a construir esses elementos em uma solução user-space com todos os problemas de velocidade inerentes para ir com ele.

Outras dicas

E sobre SCTP . É um protocolo padrão pelo IETF (RFC 4960)

Tem chunking capacidade que poderia ajudar para a velocidade.

Update: um entre TCP e SCTP mostra que as performances são comparáveis ??menos duas interfaces pode ser utilizado.

Update: um bom artigo introdutório .

ENET - http://enet.bespin.org/

Eu tenho trabalhado com ENET como um protocolo UDP confiável e escrito um assíncrono soquetes versão amigável para um cliente meu que é usá-lo em seus servidores. Ele funciona muito bem, mas eu não gosto a sobrecarga que o peer to de ping pares contribui para conexões ocioso; quando você tem muitas conexões ping todos eles regularmente é um monte de trabalho ocupado.

ENET lhe dá a opção de enviar vários 'canais' de dados e para os dados enviados para não ser confiável, confiável ou seqüenciado. Ele também inclui o já mencionado peer to de ping pares que atua como manter viva.

Temos alguns clientes da indústria de defesa que usam UDT (transferência de dados baseados em UDP) (ver http: //udt.sourceforge .net / ) e estamos muito felizes com ele. Eu vejo que é tem uma licença BSD amigável também.

RUDP - confiável User Datagram Protocol

Este fornece:

  • Reconhecimento de pacotes recebidos
  • O janelamento e controle de congestionamento
  • retransmissão de pacotes perdidos
  • Overbuffering (Mais rápido do que streaming em tempo real)

Parece um pouco mais configurável no que diz respeito a manter alives então ENet mas não lhe dá tantas opções (ou seja, todos os dados é confiável e seqüenciado não apenas os bits que você decidir deve ser). Parece bastante simples de implementar.

Como os outros têm para fora pontas, sua pergunta é muito geral, e se algo é ou não 'mais rápido' do que TCP depende muito do tipo de aplicação.

TCP é geralmente tão rápido quanto ele ganha para streaming confiável de dados a partir de um hospedeiro para outro. No entanto, se seu aplicativo faz um monte de pequenas rajadas de tráfego e esperando por respostas, UDP podem ser mais apropriadas para minimizar a latência.

Existe um meio termo fácil. O algoritmo do Nagle é a parte do TCP que ajuda a garantir que o remetente não sobrecarregar o receptor de um grande fluxo de dados, resultando em congestionamento e perda de pacotes.

Se você precisar a in-ordem de entrega confiável, de TCP, e também a resposta rápida do UDP, e não precisa se preocupar com o congestionamento de enviar grandes fluxos de dados, você pode desativar o algoritmo de Nagle:

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");

Qualquer um que decide que a lista acima não é suficiente e que querem desenvolver sua UDP confiável PRÓPRIO deve definitivamente dar uma olhada na especificação Google QUIC como isto abrange muitos casos de canto complicado e potencial de ataques de negação de serviço. Eu não tenho jogado com uma implementação deste ainda, e você pode não querer ou precisar tudo o que ele oferece, mas o documento é bem vale a pena ler antes de embarcar em um novo projeto "confiável" UDP.

Um bom ponto de partida para QUIC é aqui , mais no Blog do Chromium.

O documento atual projeto QUIC pode ser encontrada aqui .

Se você tem uma situação onde uma conexão TCP é potencialmente muito lento e 'conexão' a ??UDP é potencialmente muito pouco fiáveis ??o que você usa? Existem vários protocolos UDP confiável padrão lá fora, que experiências você tem com eles?

A palavra-chave na sua frase é 'potencialmente'. Eu acho que você realmente precisa provar para si mesmo que TCP é, de fato, muito lento para as suas necessidades, se você precisa de confiabilidade em seu protocolo.

Se você quiser obter confiabilidade fora do UDP, então você vai basicamente para ser re-implementação de algumas das características da TCP em cima de UDP que provavelmente vai tornar as coisas mais lento do que apenas usando TCP em primeiro lugar.

Protocolo DCCP, padronizado em RFC 4340 , "Datagram Congestion Control Protocol" pode ser o que você está procurando.

Parece implementado em Linux .

Pode ser RFC 5405 , "Instruções de uso Unicast UDP para designers de aplicativos" vontade ser útil para você.

Será que você considerar comprimir os seus dados?

Como dito acima, não temos informações sobre a natureza exata do seu problema, mas comprimindo os dados para transportá-los poderia ajudar.

RUDP . Muitos servidores de socket para jogos de implementar algo similar.

A melhor maneira de alcançar a confiabilidade usando UDP é construir a confiabilidade no próprio programa de aplicação (por exemplo, através da adição de mecanismos de reconhecimento e de retransmissão)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top