Por que o UDP com confiabilidade (implementado na camada de aplicativos) não substitui o TCP?

25

O TCP fornece confiabilidade na camada de transporte, enquanto o UDP não. Então, o UDP é rápido. Porém, um protocolo na camada de aplicação pode implementar um mecanismo confiável ao usar o UDP.

Nesse sentido, por que o UDP com confiabilidade (implementado na camada de aplicativos) não substitui o TCP no caso em que o UDP é mais rápido que o TCP enquanto precisamos de confiabilidade?

mallea
fonte
6
Por que cada aplicativo fornece seu próprio mecanismo de confiabilidade quando pode simplesmente confiar em outro protocolo amplamente disponível como o TCP?
Nakrule 27/06
14
e como você propõe implementar a confiabilidade na camada de aplicativos sem diminuir a velocidade da pilha?
JFL
6
Como o cabeçalho UDP é menor que o do TCP, podemos tirar proveito do tamanho dos dados. ” O problema com esse pensamento é que você provavelmente consumirá grande parte da carga útil do UDP com cabeçalhos de protocolo da camada de aplicativo que diminuirão os dados utilizáveis ​​no Carga útil UDP. A diferença entre o tamanho do cabeçalho TCP e UDP é de apenas 12 bytes. Além disso, o UDP é realmente projetado para pequenas cargas úteis, por exemplo, 576 bytes; lembre-se de que o UDP simplesmente perderá datagramas e, quanto mais dados em um datagrama, mais dados serão perdidos quando um datagrama for perdido.
Ron Maupin
21
O Stack Overflow está repleto de programadores tentando, e falhando, criar protocolos do tipo TCP usando UDP. Os programadores mais experientes dizem para desistir e usar apenas o TCP. Todos pensam que podem fazer um trabalho melhor, mas é altamente improvável.
Ron Maupin
11
Sei que isso não faz parte da sua pergunta diretamente, mas um dos motivos pelo qual o UDP pode ser melhor é que você pode implementar apenas as peças de confiabilidade necessárias. Com o TCP, você obtém confiabilidade sobre pedidos e entregas. Isso significa que o TCP pode ter soluços enquanto aguarda o reenvio de uma mensagem anterior. Com o UDP, você pode decidir tudo o que deseja é a entrega, mas se alguma mensagem chegar fora de ordem, você não espera as que estão faltando, apenas as descarta. A armadilha que as pessoas encontram é tentar replicar o TCP 100%. Nesse caso, basta usar o TCP.
William Mariager

Respostas:

47

O TCP é o mais rápido que você pode fazer com suas propriedades de confiabilidade. Se você precisar apenas, digamos, de seqüenciamento e detecção de erros, o UDP pode ser criado para servir perfeitamente bem. Essa é a base para a maioria dos protocolos em tempo real, como voz, streaming de vídeo, etc., onde lag e jitter são mais importantes que a correção de erros "absoluta".

Fundamentalmente, o TCP diz que seus fluxos podem ser invocados eventualmente. A rapidez com que depende depende dos vários temporizadores, velocidades, etc. O tempo necessário para resolver erros pode ser imprevisível, mas as operações básicas são tão rápidas quanto possível quando não há erros. Se um sistema souber algo sobre os tipos de erros prováveis, poderá fazer algo que não é possível com o TCP. Por exemplo, se erros de bit único são especialmente prováveis, você pode usar a codificação de correção de erros para esses erros de bit: no entanto, isso é muito melhor implementado na camada de link. Como outro exemplo, se pequenas rajadas de perda de pacotes inteiros são comuns, você pode resolver isso com transmissão múltipla sem esperar pela perda, mas obviamente isso é caro em largura de banda. Ou então, diminua a velocidade até que a probabilidade de erro seja insignificante: também é caro em largura de banda. No final,

Em termos de implementação, você descobriria que os séculos de programadores investidos no TCP o tornarão mais rápido do que qualquer coisa geral que você possa se dar ao luxo de fazer, além de mais confiável nos casos extremos obscuros.

O TCP fornece: um método onipresente de conexão (essencial onde os sistemas de comunicação não têm controle comum), fornecendo um fluxo de bytes confiável, ordenado (e deduplicado), bidirecional, com janelas e janelas, com controle de congestionamento em redes multip hop de distância arbitrária.

Se um aplicativo não exige onipresença (seu software é executado nos dois lados) ou não precisa de todos os recursos do TCP, muitas pessoas usam com vantagem outros protocolos, geralmente sobre o UDP. Os exemplos incluem TFTP (minimalista, com tratamento de erros realmente ineficiente, QUIC, que é projetado para reduzir as despesas gerais (ainda marcadas como experimental)) e bibliotecas como lidgren, que possui controle refinado sobre exatamente quais recursos de confiabilidade são necessários. ]

jonathanjo
fonte
7
Protocolos "UDP com confiabilidade" personalizados também são extremamente comuns em videogames. Há uma tonelada de bibliotecas de rede com várias implementações. Eles geralmente desejam que os pacotes sejam solicitados e tenham correção de erros, sem desejar retransmissão de pacotes perdidos (e receber atrasos de todos os pacotes futuros).
BlueRaja - Danny Pflughoeft
Parece que você está dizendo "O TCP é a solução geral ideal, por isso é suportado nativamente". +1
ikegami 27/06
11
@ BlueRaja-DannyPflughoeft E às vezes você quer pacotes não ordenados confiáveis ​​(por exemplo, efeitos visuais aplicados a jogadores próximos).
user253751 28/06
@ BlueRaja-DannyPflughoeft se você tiver uma biblioteca de protocolos de exemplo típica, ficarei feliz em incorporar a resposta
jonathanjo
11
@ jonathanjo Um que eu usei é o lidgren , que suporta 5 métodos de entrega diferentes (role para baixo) . O Unity e o Unreal Engine também têm suas próprias APIs de rede, criadas sobre o UDP.
BlueRaja - Danny Pflughoeft
10

UDP com confiabilidade pode realmente ser um substituto para o TCP. Já temos um exemplo disso: chama-se QUIC .

Da Wikipedia:

Entre outros aplicativos, o QUIC aprimora o desempenho de aplicativos da Web orientados a conexão que atualmente estão usando o TCP. Isso é feito estabelecendo um número de conexões multiplexadas entre dois pontos de extremidade no UDP (User Datagram Protocol).

A vantagem de usar o UDP em vez de criar um novo protocolo de camada de transporte é que os roteadores e outros dispositivos de rede já o entendem.

Andrea Corbellini
fonte
QUIC tem uma característica um pouco diferente do TCP. Em alguns cenários (rede confiável ou nenhuma criptografia necessária), na verdade, é mais lento: quora.com/…
freakish
Você também pode adicionar datachannels WebRTC à lista que usa UDP via sctp. De fato, quando as conexões UDP não são possíveis entre pares, o WebRTC fará failover para o TCP, deixando uma queda notável no desempenho.
JSON
@freakish mais lento é uma generalização neste caso. Por exemplo, o QUIC adiciona dados adicionais aos pacotes para reduzir a retransmissão que afeta a taxa de transferência, mas não a latência.
JSON
4

Você pode usar o UDP para implementar a funcionalidade TCP na camada de aplicativo (confiabilidade, adaptabilidade). Você também pode usar o TCP em primeiro lugar, a menos que algo que seu aplicativo realmente precise não possa ser feito com o TCP. Se você implementar essas funções, provavelmente terminará muito pior do que com o TCP. A sobrecarga adicionada também diminui a eficiência geral.

O TCP não é lento - apenas requer um aperto de mão antes de transmitir e a janela de transmissão para se adaptar ao canal. Pode muito bem moldar sua taxa de transferência para o canal de transmissão em questão e se adaptar às mudanças durante o fluxo, o que o UDP não pode fazer (por si só).

No entanto, os protocolos acima da camada de transporte não são abordados aqui.

Zac67
fonte
3
"Você pode usar o UDP para implementar a funcionalidade TCP na camada de aplicativo (confiabilidade, adaptabilidade)" - acredito que é praticamente assim que QUIC, µTP e frequentemente SCTP já estão implementados. (Apesar disso, eu normalmente os considero na metade superior da camada de transporte, enquanto o UDP fica na metade inferior.)
grawity
11
@grawity Isso depende do seu POV - da perspectiva do aplicativo, uma camada intermediária é uma extensão da camada de transporte. Formalmente e da perspectiva da rede (dispositivo), tudo faz parte da camada de aplicativo.
Zac67 27/06
4

Em uma rede limpa, eles são bastante equivalentes. Há casos em que o TCP fica paralisado por períodos (alguém já viu uma tela HTTP congelar no carregamento?), Mas ele não entrega lixo ou mistura pacotes e raramente desiste completamente.

O UDP pode dar à camada de aplicativos mais controle sobre o tráfego à custa de uma enorme quantidade de trabalho.

A resposta para sua pergunta é que, às vezes, é feita dessa maneira. Jogos que exigem baixa latência costumam fazer exatamente isso. É muito mais trabalho, mas vale a pena a capacidade de controlar exatamente quantos pacotes pendentes você pode ter e com que frequência eles são tentados novamente.

Portanto, a diferença geral é que o TCP é uma implementação de uso geral muito boa, mas há objetivos específicos que o UDP pode fazer que o TCP seja muito ruim ou não exista - por exemplo:

  • NUNCA desista (com o TCP, a conexão algumas vezes trava e você precisa interromper a conexão e reiniciá-la)
  • Enviando um fluxo rápido de pacotes que não exigem respostas e você não se importa de perder alguns ocasionalmente (onde apenas o pacote mais recente é importante, outros podem ser descartados) - pense em atualizações de posição do jogo - você pode ficar um pouco "Salte" em vez de cada etapa, mas você obtém o mesmo resultado com mais rapidez e confiabilidade.
  • Lidando com redes duvidosas analisando a queda de pacotes e alterando dinamicamente com que frequência e quando você tenta novamente - talvez até o tamanho máximo do pacote.

Mas, em geral, não vale a pena, o TCP é bastante ideal; então, por que fazer todo o trabalho extra e adicionar uma (grande) chance de adicionar bugs e falhas de segurança?

Bill K
fonte
3

O UDP não é rápido porque é UDP. O TCP não é lento porque é TCP.

Ambos os protocolos são projetados com certas garantias e o TCP bruto tem mais garantias que o UDP bruto.

E a regra geral é: o preço das garantias é o desempenho .

Não há nada que o proíba de implementar garantias TCP sobre UDP. Mas, então, você recebe mais garantias e precisa pagar o preço. Portanto, você reduz o desempenho para TCP ou pior (devido à sobrecarga UDP). A menos que você conheça melhor a implementação do TCP, o que é improvável. E se você o fizer (espero), você o revela e tornamos o TCP padrão mais rápido. E estamos de volta onde começamos. :)

Você pode jogar com essas garantias também. Modifique levemente isso, modifique levemente isso. E então você acaba com um protocolo como o QUIC, que é sobre o UDP e é muito semelhante ao TCP + TLS. Em muitos casos, é mais rápido que o TCP (embora, de acordo com este artigo, latência de até 5% e buffer de até 15%, o que a IMO não seja grande coisa), mas em alguns cenários (por exemplo, rede confiável ou sem necessidade de criptografia), na verdade é mais lento (veja uma explicação aqui ).

Você também pode enfraquecer essas garantias e isso faz mais sentido. Por exemplo, digamos que você esteja transmitindo e os pacotes antigos não sejam interessantes. Somente o mais recente. Mas o congestionamento ainda é importante. Então você recebe algumas garantias do TCP, mas não todas. E sim, as pessoas realmente fazem isso (por exemplo, jogos em tempo real). Isso oferece um melhor desempenho ao custo de algumas garantias.

esquisito
fonte
1

Sua ideia seria boa no espaço profundo.

A resposta correta é "depende" e "porque isso danificaria a rede como um todo". O TCP / IP é muito gentil com as redes e se ajusta automaticamente à velocidade certa para ser rápido, mas não gerar toneladas de pacotes de retorno ICMP.

Quando um roteador com RAM insuficiente recebe subitamente qualquer tipo de pacote - digamos, do Tsunami, Bittorrent ou FDT - ele o solta e dispara de volta para o remetente um pequeno pacote de desrespeito à falha. Agora seu servidor UDP precisa rastrear e retransmitir essa parte manualmente. Alguns roteadores ISP moldam tanto o Bittorrent que isso machuca o tsunami?

O protocolo Tsunami usa UDP com um canal de controle no TCP. http://tsunami-udp.sourceforge.net/ Encontrei um estudo que mostra que é mais lento do que uma coisa chamada FDT.

O lendário protocolo Fast Data Transfer (FDT) do CERN é capaz de saturar qualquer rede usando vários fluxos TCP. Provavelmente é mais rápido, porque causa menos retransmissões do que o Tsunami, que inunda a rede com tanto UDP, que parte dele não é totalmente transmitido.

O UDP é usado por aplicativos não confiáveis: streaming de áudio, entrada / atualização de jogo IO, "ping" é realmente ICMP, mas não é garantido, Bittorrent, mosh ssh é incrivelmente responsivo, telefonia VOIP, multicast, DNS é enviado pelo UDP AFAIK. Qualquer coisa que não se importe com o estranho pacote ausente e possa "recuperar" instantaneamente.

O TCP / IP foi realmente a invenção mais importante que permitiu aos desenvolvedores de aplicativos, basta definir e esquecer. Um soquete é um par de endereços IP e portas e foi projetado para poder ser configurado e permanecer por horas, dias e até semanas sem se reconectar. E-mail, web, IRC e literalmente todos os aplicativos matadores usam TCP. Mas você pode obter pausas estranhas no download que de repente aumentam mais rapidamente ... e no espaço profundo as conexões podem esgotar o tempo, tornando as transferências no estilo Tsunami melhores para transferências interestelares de arquivos - você pode encontrar algo lá !!

A prova está nas considerações finais deste extrato de estudo científico, que mencionam a distância cada vez maior sobre o assunto: espaço profundo De: https://uscholar.univie.ac.at/get/o:300623.pdf

Sem congestionamento, o desempenho do FDT e do GridFTP com TCP é maior que o Tsunami e o UDT. O rendimento mais alto do FDT é de 2,34 Gb / s com um RTT de 1 ms, mas diminui rapidamente após 100 ms em comparação com o GridFTP, que tem um desempenho melhor que o FDT quando o link RTT é maior que 100 ms. Curiosamente, o rendimento do tsunami não diminuiu com o aumento da RTT, mostrando que ele tem o controle de congestionamento mais eficaz com o aumento da RTT.

Então, novamente ... na verdade, existe um protocolo espacial muito parecido com o e-mail, que seria melhor para o espaço. Os aplicativos não devem se importar com valores de tempo limite, como para sempre.

Tomachi
fonte
0

TCP! = UDP + Confiabilidade

O TCP não é simplesmente UDP com confiabilidade adicional. O TCP oferece mais recursos do que apenas confiabilidade. Você pode ler sobre eles em muitos dos RFCs.

Qualquer um desses recursos "poderia" ser implementado na camada de aplicação. Eventualmente, torna-se um ponto em que você começa a reinventar a roda.

Para citar alguns recursos que o TCP possui ...

  • Criação e terminação de conexões: realiza handshakes e fechamentos de conexão

  • Controle de fluxo: garante que o remetente e o receptor transmitam a taxas em que ambos podem lidar com a taxa de dados.

  • Controle de congestionamento de ponta a ponta: permite que os nós finais acelerem sua taxa de transferência com base em perdas. Leia sobre início lento, prevenção de congestionamentos e recuperação rápida.

Na minha experiência, o UDP é usado quando a velocidade é uma preocupação com a confiabilidade. Você pode adicionar algum nível de confiabilidade no nível do aplicativo que não seja 100% tão confiável quanto o TCP. Por exemplo, se você ainda deseja um desempenho rápido, pode implementar a correção de erro direta (FEC) em que transmite os dados mais de uma vez. Você ainda obtém um bom desempenho e algum nível de confiabilidade (observe bastante a confiabilidade do TCP) sem todo o bate-papo de vaivém para obter pacotes perdidos. O objetivo é aumentar a utilização da rede, mas pode ser adequado para aplicativos em tempo real, como jogos ou streaming.

jaybers
fonte
Você pode descrever nesses recursos extras como sendo sobre confiabilidade, em última análise.
user207421 29/06