TLDR;
- TCP - orientado a fluxo, requer uma conexão, confiável, lento
- UDP - orientado a mensagens, sem conexão, não confiável, rápido
Antes de começarmos, lembre-se de que todas as desvantagens de algo são uma continuação de suas vantagens . Existe apenas uma ferramenta certa para um trabalho, sem panacéia. O TCP / UDP coexiste há décadas e por um motivo.
TCP
Ele foi projetado para ser extremamente confiável e faz seu trabalho muito bem. É tão complexo porque realiza uma tarefa difícil: provar um transporte confiável através do protocolo IP não confiável.
Como toda a lógica complexa do TCP está encapsulada na pilha de rede, você fica livre de muitas tarefas trabalhosas e propensas a erros de baixo nível na camada de aplicação.
Ao enviar dados pelo TCP, você grava um fluxo de bytes no soquete no remetente, onde são divididos em pacotes, transmitidos pela pilha e enviados pelo fio. No lado do receptor, os pacotes são remontados novamente em um fluxo contínuo de bytes.
Manter essa bela abstração tem um custo em termos de complexidade e desempenho. Se o 1º pacote do fluxo de bytes for perdido, o receptor atrasará o processamento dos pacotes subsequentes, mesmo aqueles que já chegaram.
Além disso, para ser confiável, o TCP implementa isso:
- O TCP requer uma conexão estabelecida, que requer três viagens de ida e volta (handshake de três vias "infame").
- O TCP possui um recurso chamado "início lento" quando aumenta gradualmente a taxa de transmissão após estabelecer uma conexão para permitir que um receptor acompanhe os dados.
- Todo pacote enviado precisa ser reconhecido ou o remetente para de enviar mais dados
- E assim por diante ...
Tudo isso é agravado em redes sem fio lentas e não confiáveis, enquanto o TCP foi projetado para redes com fio em que os atrasos são previsíveis e a perda de pacotes não é tão comum. Além disso, como muitas pessoas já mencionaram, para algumas coisas o TCP simplesmente não funciona (DHCP). No entanto, quando relevante, o TCP ainda funciona excepcionalmente bem.
Usando uma analogia de email, uma sessão TCP é semelhante a contar uma história à sua secretária, que a divide em emails e envia um serviço de email ruim para um editor. Por outro lado, outra secretária reúne e-mails em um único pedaço de texto. Alguns e-mails são perdidos, outros são corrompidos; portanto, é necessário um procedimento muito complexo para uma entrega confiável, e sua história de 10 páginas pode levar muito tempo para chegar ao editor.
UDP
O UDP, por outro lado, é orientado a mensagens; portanto, um receptor grava uma mensagem (pacote) no soquete e depois é transmitido para um receptor como está, sem nenhuma divisão / montagem.
Comparado ao TCP, sua especificação é muito simples. Basicamente, tudo o que você faz é adicionar uma soma de verificação ao pacote para que um receptor possa detectar sua corrupção. Todo o resto deve ser implementado por você, um desenvolvedor de software. Agora leia a volumosa especificação de TCP e tente reimplementar algumas partes dela.
Algumas pessoas seguiram esse caminho e obtiveram resultados muito decentes, a ponto de o HTTP / 3 usar QUIC - um protocolo baseado em UDP. No entanto, isso é mais uma exceção. Aplicativos comuns do UDP são aplicativos de streaming e conferência de áudio / vídeo como Skype, Zoom ou Google Hangout, onde perder pacotes não é tão importante em comparação com um atraso introduzido pelo TCP.