Enviando e Capturando Datagramas UDP com Wireshark

05/08/2025

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

  1. 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.

Pagina de Download
Pagina de Download

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.

Escolha o adaptador de rede Ethernet para começar a captura
Escolha o adaptador de rede Ethernet para começar a captura
A captura começou, vamos definir a porta 505 para enviar e receber o datagrama
A captura começou, vamos definir a porta 505 para enviar e receber o datagrama

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.