Enviando e Capturando Datagramas UDP com Wireshark
O User Datagram Protocol (UDP) é um protocolo de transporte simples no qual os pacotes são enviados como datagramas independentes sem estabelecer conexões. Cada datagrama tem um cabeçalho de 8 bytes composto por quatro campos de 16 bits porta de origem, porta de destino, comprimento e checksum seguido pela seção de dados do aplicativo. A porta de origem identifica o processo que enviou o pacote, enquanto a porta de destino aponta para o serviço no host remoto. O campo comprimento indica o tamanho em bytes do cabeçalho mais os dados, podendo variar até 65 535 bytes e o checksum permite detectar erros. Aqui temos um artigo mais preciso sobre o protocolo UDP
Este artigo mostra como gerar e enviar um datagrama UDP via programação (exemplo em Python), configurar o Wireshark para capturar apenas esse pacote e interpretar o datagrama exibido.

Preparando o ambiente
Instale o Wireshark – disponível para Windows, macOS e Linux. O programa permite capturar pacotes em interfaces de rede. Baixe ele em www.wireshark.org.

Depois de baixado, execute o instalador em modo administrador e siga com a instalação.

Pressione "Next" para prossegui.

Aceite os termos de licença GNU/GPL e clique em "Noted"

Pressione "Next" para prosseguimos com a instalação

Role até a guia "External capture tools" e pressione o check box "UDPdump", uma extensão necessária nossa analise e pressione "Next"

Pressione mais uma vez o botão "Next"

Pressione mais uma "Next" para seguimos para a instalação

Prossiga para a instalação do NpCap e pressione "Next"

E por fim pressione botão "Install"


Durante o processo de instalação do Wireshark deve aparece uma segunda instalação do complemento Npmap clique em "I Agree" e novamente pressione "Install" para continuar a instalação.



E por fim clicamos em "Next" e "Finish" para concluir a instalação.


Escolhendo o adaptador de rede e filtro de captura
2. Escolha uma porta de comunicação – Ao abrir o programa defina um número de porta (por exemplo, 5005) que será usado pelo programa para enviar e receber. Essa informação será utilizada tanto no código quanto no filtro de captura do Wireshark.


Configure um filtro de captura para gravar apenas os datagramas na porta desejada. Os filtros usam primitivas como tcp|udp src|dst port. Para capturar apenas datagramas UDP destinados ou originados na porta 5005, insira no campo Filter da tela Capture Options o filtro "udp.port==5005" conforme a imagem.

🐍Modelo do script Python para nossa jornada de envio de datagrama UDP

📡 Entendendo o script em Python
Para compreender como funciona o envio e a captura de um datagrama UDP, é necessário definir um script Python com as seguintes etapas:
🔹 Definir o IP e a porta de destino
🔹 Criar um socket UDP
🔹 Preparar a mensagem a ser enviada
🔹 Enviar a mensagem para o IP e porta definidos
🔹 Exibir uma confirmação no terminal
🔹 Encerrar o socket
Neste exemplo, usaremos o IP 192.168.1.10 e a porta 5005 para a comunicação.
🧩 O que é um socket?
Um socket é uma interface de comunicação entre processos que permite a troca de dados entre dois dispositivos em uma rede (ex.: dois computadores via TCP/IP).
🔸 Ele representa um ponto final de uma conexão
🔸 Em Python, é criado a partir do módulo socket
A definição técnica de um socket é composta por:
<protocolo de transporte>, <endereço IP>, <porta>
Exemplo:
UDP, 192.168.1.10, 5005
⚙️ Criando o socket em Python
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
📌 AF_INET
🔹 Significa que será usada a família de endereços IPv4
🔹 Endereços no formato x.x.x.x (como 192.168.0.1)
🔹 Outras opções incluem AF_INET6 para IPv6
📌 SOCK_DGRAM
🔹
Define o protocolo como UDP (User Datagram Protocol)
🔹 Não orientado à conexão
🔹 Não garante entrega, ordem ou integridade dos dados
🔹 É leve, rápido e ideal para aplicações que toleram perdas (ex: streaming, DNS)
Comparativamente, o SOCK_STREAM é usado para TCP, que é confiável e orientado à conexão.
🌐 IP e Porta: o que são tecnicamente?
📍 Endereço IP (Internet Protocol)
🔹 É um identificador único para um dispositivo em uma rede.
🔹 Exemplo: 192.168.1.10 é um endereço de rede local (classe C).
🔹 No contexto do socket, o IP define para onde os dados serão enviados.
🔢 Porta
🔹É um número lógico que representa uma aplicação ou serviço específico no dispositivo.
🔹Varia de 0 a 65535.
🔹 Portas de 0 a 1023 → Portas bem conhecidas (HTTP, DNS, etc.)
🔹Portas de 1024 a 49151 → Portas registradas
🔹Portas de 49152 a 65535 → Portas dinâmicas/privadas
🔹Permite que múltiplas aplicações utilizem o mesmo IP simultaneamente sem conflito.
Um par IP: porta identifica unicamente um serviço de rede, como por exemplo:
192.168.1.10:5005
🧾 A mensagem: por que usar b''?
mensagem = b'Exemplo de datagrama UDP'
🔹O prefixo b transforma a string em uma sequência de bytes, que é o formato aceito pelo protocolo UDP.
🔹Protocolos de rede trabalham com dados binários, não com texto puro.
✅ Encerrando a comunicação com close()
sock.close()
🔹 Fecha o socket após o envio.
🔹 Libera os recursos alocados pelo sistema operacional.
🔹 Evita problemas como vazamento de descritores de arquivos e comportamentos indesejados.