Quais as diferenças entre TCP e UDP?

Quais as diferenças entre o TCP e o UDP?

(Last Updated On: 19 de fevereiro de 2019)

Recentemente, eu estive trabalhando em uma aplicação de bate-papo online, para treinar minhas habilidades de programação. Para testá-la, enviei o programa para um amigo para tentarmos conversar através dele.

Quando começamos a conversar, logo notei que havia algo de muito estranho – as mensagens do meu amigo não faziam muito sentido. Não só isso, mas ele parecia não conseguir entender o que eu estava dizendo também! Olha só como estava a conversa para mim:

Conversa entre Yan e Yuri (visão do Yan)

Mandei para o email dele esse screenshot de como a conversa estava aparecendo pra mim, para ele entender minha confusão e ele respondeu meu email com a imagem de como a conversa estava para ele:

Conversa Yan e Yuri (visão do Yuri)

Ué! Agora sim fiquei confuso! Para mim, a conversa estava de um jeito, mas para meu amigo estava de outro… O que será que estava acontecendo com o meu programa?

A princípio, pensei que podia ter alguma relação com a nossa Internet, mas a conexão estava muito boa e, ainda, as mensagens estavam chegando bem rápido. O que, então, poderia ser?

Depois de diversas pesquisas, consegui entender qual era o problema – o protocolo que eu estava utilizando na camada de transporte. Mas como assim, um protocolo? Na camada de transporte? O que é tudo isso? Vamos com calma!

A camada de transporte

A Internet se baseia, no geral, em requisições e respostas. Se pensarmos na Web, temos um exemplo bastante concreto – usamos um navegador (como o Google Chrome ou o Mozilla Firefox) para fazer uma requisição para um servidor de determinado site. Se tudo der certo, esse servidor me devolve uma resposta com a página web que eu procurava.

Mas como é que funciona, de fato, uma requisição? O que está por trás disso?

Para descrever os passos de uma requisição, existem diversos modelos que descrevem os protocolos (isto é, as regras) por trás desse processo. Os modelos mais conhecidos são o OSI, que é dividido em 7 camadas, e o TCP/IP, que é dividido em 5 camadas.

Em ambos esses modelos, há uma mesma camada que é fundamental – a camada de transporte. Nos dois casos, a camada de transporte é, como o próprio nome indica, a responsável pela transferência de dados entre diferentes máquinas (seja um servidor, ou mesmo um computador pessoal).

A respeito dessa camada, temos dois protocolos principais: o TCP e o UDP. No programa de bate-papo que eu fiz, utilizei o UDP, simplesmente porque pensava que não havia muita diferença. Afinal, foi justamente esse o meu erro!

O protocolo UDP

O protocolo UDP (sigla para User Datagram Protocol) tem, como característica essencial, um atributo que pode parecer esquisito para os iniciantes no tema – a falta de confiabilidade.

Isso significa que, através da utilização desse protocolo, pode-se enviar datagramas de uma máquina à outra, mas sem garantia de que os dados enviados chegarão intactos e na ordem correta.

Além do mais, o UDP é um protocolo que não é voltado à conexão. Isso significa que o “aperto de mão”, ou, tecnicamente, handshake, não é necessário para que se estabeleça uma comunicação.

Dessa forma, com o UDP é possível enviar, pela mesma saída, dados para diversas máquinas diferentes sem problema algum.

Podemos fazer um paralelo com aqueles anúncios em alto-falante. O anúncio consegue sair em busca do destino, mas não temos certeza se o destinatário da mensagem conseguiu ouvi-la.

Entendendo o UDP, fica claro nosso problema – a falta de confiabilidade dele fez com que as mensagens trocadas pelo bate-papo se corrompessem de diversas formas! Mas se isso é natural desse protocolo, por que alguém escolheria usá-lo?!

As características já descritas do UDP podem parecer contraprodutivas no geral, mas elas formam um outro atributo que dá muito poder ao protocolo: a velocidade! No geral, o protocolo UDP permite uma comunicação bastante rápida, o que é muito vantajoso.

Velocidade alta mas confiabilidade baixa, ainda parece suspeito – não funcionou no nosso caso. Acontece que o UDP justamente não é feito para esse tipo de caso! Na verdade, o UDP tem sua grande vantagem quando se trata de serviços cuja velocidade é fundamental e a perda mínima de dados não muito desvantajosa.

Um exemplo é com jogos online, em que é normal alguns bytes se perderem na comunicação, mas que é sempre importante que a aplicação continue rodando com rapidez (sem se importar tanto com as perdas e falhas), para que não ocorra o famigerado lag.

Mas e agora? Se o UDP não serve para a gente, o que podemos usar em seu lugar?

O protocolo TCP

O protocolo TCP é, talvez, o mais utilizado na camada de transporte para aplicações na Web. Diferente do UDP, o TCP é voltado à conexão e tem como garantia a integridade e ordem de todos os dados.

Para manter a confiabilidade dos dados, o TCP utiliza um aperto de mãos de três vias, o three way handshake, também chamado de SYN,SYN-ACK,ACK.

O nome SYN,SYN-ACK,ACK é uma resumida descrição de como esse handshake funciona. A conexão entre dois hosts começa com o primeiro enviando ao segundo um pacote de sincronização (SYNchronize).

O segundo host recebe esse pacote e responde com a confirmação do sincronização (SYNchronize-ACKnowledgment). O primeiro host, por fim, manda uma confirmação (ACKnowledge) para o segundo, assim estabelecendo a conexão.

Com o TCP, de fato temos uma conexão entre um ponto e outro, comumente chamados de servidor e cliente. É interessante notar que o TCP permite o envio simultâneo de dados de ambos os pontos ao outro, durante todo o fluxo de comunicação.

Desse modo, o TCP é ideal para casos em que a confiabilidade dos dados é essencial, como quando se trata de mensagens de texto! Trocando o uso do UDP pelo TCP em minha aplicação, tudo vai funcionar bem, mesmo que com uma velocidade possivelmente um pouco menor.

Afinal, o importante é que a troca de dados, ou seja, de mensagens, seja efetuada com sucesso, de modo que quem está se comunicando consiga se entender!

Se adequando a cada caso

É certo que não existe um protocolo certo ou errado, nem um melhor ou pior que outro por essência. O que existe são situações diferentes, e essa é a chave para trabalhar com aplicações que se comunicam com diferentes máquinas.

Nesse post, entendemos algumas das diferenças entre os dois principais protocolos da camada de transporte dos modelos da Internet: o UDP e o TCP. Assim, entendemos a importância de ambos os protocolos e quando devemos preferir um ou outro.

Ao final, como resumo, podemos entender que o UDP serve melhor casos em que a integridade constante dos dados não é essencial (é menos importante que a velocidade da comunicação), como em livestreams de vídeos e jogos online.

Por outro lado, o TCP funciona melhor em casos que a confiabilidade do transporte de dados é o foco, como quando trabalhamos com comunicação em texto ou com documentos.

O mais importante, portanto, é entender as diferenças entre os protocolos e, assim, saber qual utilizar em cada caso. Assim, teremos uma aplicação mais funcional!

E aí, achou o tema do post interessante? Então dê uma olhada em nossa formação de administrador de redes, em que você se aprofundará ainda mais em redes de computadores e como elas funcionam!

FIQUE POR DENTRO

Desenvolvedor Python apaixonado por educação e segurança.
Explicit is better than implicit.
Twitter: @yanorestes
Email: yan.orestes@alura.com.br

Próximo ArtigoA profissional mãe