Tipos de Sockets em TCP e UDP: Escolhendo o Caminho Adequado
Tags: sockets, python, tcp, udp
Published: 2023-11-28 11:48:45

---
title: Tipos de Sockets em TCP e UDP: Escolhendo o Caminho Adequado
published: true
description: A escolha do tipo de socket desempenha um papel fundamental na transmissão eficiente de dados.
tags: sockets, python, tcp, udp
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xhhvej5hjumjthxvg9o6.png
# Use a ratio of 100:42 for best results.
# published_at: 2023-11-28 10:14 +0000
---

Seguindo o pontapé inicial, depois de uma rápida apresentação sobre [Sockets com Python](https://dev.to/paulosouzainfo/introducao-aos-sockets-em-python-3iha), vamos falar sobre protocolos TCP e UDP.

Nas comunicações de rede, a escolha do tipo de socket desempenha um papel fundamental na transmissão eficiente de dados. Vou tentar falar um pouco sobre os tipos de sockets com o uso de protocolos TCP (Transmission Control Protocol) e UDP (User Datagram Protocol), buscando de forma clara explicar suas características e fornecendo insights sobre as situações ideais para cada um.

Basicamente, as abreviações de cada protocolo já respondem ao que cada um se propõe, sendo:
- O **TCP** é um **Protocolo de Controle de Transmissão**
- O **UDP** é um **Protocolo de Datagrama de Usuário**

O termo _"controle de transmissão"_ refere-se à transmissão de dados em uma rede de computadores, onde o TCP é um protocolo de comunicação confiável e orientado à conexão, e seu controle de transmissão atua na entrega confiável e ordenada dos dados.

O _"datagrama de usuário"_ refere-se à um modelo de comunicação sem conexão. Ao contrário do TCP, o UDP não estabelece uma conexão antes de enviar dados e não fornece garantias de entrega, ordem ou verificação de integridade dos dados.

Um datagrama **é uma unidade de informação** que é transmitida através de uma rede de computadores. Assim sendo, cada datagrama é tratado como uma entidade independente, e não há um acordo prévio de uma conexão antes da transmissão.

### TCP: Uma Dança Coreografada de Confiança

O TCP opera sob um paradigma de comunicação orientada à conexão. Este tipo de socket é como uma dança coreografada, onde cada passo é cuidadosamente planejado e verificado para garantir a entrega precisa e confiável dos dados.

Imagine uma conversa formal entre dois interlocutores onde cada palavra é cuidadosamente ouvida e confirmada. É basicamente isso.

Abaixo, segue o exemplo de um servidor TCP em Python com acesso apenas em localhost na porta 8080.
```
import socket

# Configuração do servidor TCP
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen()

# Aguardando conexão
client_socket, client_address = server_socket.accept()

# Recebendo dados
data = client_socket.recv(1024)
print(f'Dados recebidos via TCP: {data.decode()}')

# Fechando a conexão
client_socket.close()
server_socket.close()
```

#### Confiabilidade:
O TCP é altamente confiável, garantindo que os dados sejam entregues sem erros e na ordem correta. Ele emprega mecanismos como ACK (acknowledgment) e retransmissões para assegurar que nenhum dado seja perdido.

#### Controle de Fluxo:
Um dos pontos fortes do TCP é o seu controle de fluxo que  gerencia a taxa de transferência de dados entre emissor e receptor, evitando congestionamentos e garantindo uma transmissão suave.

#### Sincronização:
A comunicação orientada à conexão do TCP requer um aperto de mão (handshake) inicial entre as partes envolvidas. Esse processo sincronizado estabelece a base para uma comunicação segura e eficiente.

#### Quando Escolher TCP:
O TCP é a escolha preferencial em cenários onde a integridade dos dados é crucial, como transferência de arquivos, transmissão de áudio e vídeo, e aplicações que demandam comunicação confiável.

### UDP: Velocidade e Simplicidade em uma autoestrada digital, mas sem pedágios :)

Diferentemente do TCP, o UDP opera em um modo de comunicação sem conexão. Imagine uma autoestrada digital onde os dados viajam rapidamente, mas sem a necessidade de verificações constantes de velocidade.

Agora, imagine a mesma conversa entre dois interlocutores só que de forma mais rápida e direta, onde não há tempo para confirmações constantes e os dois falam sem parar de assuntos diferentes e, ao mesmo tempo. Você como ouvinte só capta o que você entendeu e continua andando.

Abaixo, segue um exemplo de um servidor UDP em Python com acesso apenas em localhost na porta 8081.
```
import socket

# Configuração do servidor UDP
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 8081))

# Recebendo dados
data, client_address = server_socket.recvfrom(1024)
print(f'Dados recebidos via UDP: {data.decode()}')

# Fechando a conexão
server_socket.close()
```

#### Velocidade:
O UDP é mais rápido e eficiente do que o TCP, pois não carrega o fardo de estabelecer e manter uma conexão constante. Isso o torna ideal para aplicações que priorizam a velocidade sobre a confiabilidade.

#### Comunicação Sem Conexão:
Sem a necessidade de handshakes e verificações rigorosas, o UDP é adequado para situações onde uma comunicação rápida e simples é suficiente.

#### Broadcasting:
O UDP é frequentemente usado em cenários de broadcasting, onde a mesma mensagem é enviada para vários destinatários simultaneamente.

#### Quando Escolher UDP:
O UDP é a escolha acertada quando a velocidade é mais importante, como em jogos online, transmissões ao vivo e aplicações de VoIP, onde a perda ocasional de pacotes é tolerável.

### Finalização
Se considerarmos a comunicação digital como uma sinfonia, o TCP seria a partitura meticulosamente seguida por uma orquestra, enquanto o UDP seria o improviso de um DJ tocando músicas escolhidas aleatoriamente e sem parar. 

Com isso em mente, você já pode escolher o melhor caminho seguir.

_* A lot o thanks for this great article and image in [Privacy Canada](https://privacycanada.net/tcp-vs-udp/)_ in helping me to compose this article.