01 - Source Port
video: https://youtu.be/... no frontmatter da nota.Source Port (Porta de Origem)
1. Definição e Posicionamento no Cabeçalho
O campo Source Port (Porta de Origem) é o primeiro campo de 16 bits (2 octetos) do cabeçalho UDP, conforme definido pela RFC 768 (Postel, 1980). Sua função é identificar o processo (aplicação) no computador remetente que está enviando o datagrama.
Layout do cabeçalho UDP (8 bytes fixos):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Embora pareça simples, a Porta de Origem é um componente crítico para a comunicação bidirecional: ela fornece o "endereço de retorno" necessário para que o receptor possa enviar uma resposta. Sem este campo, a comunicação seria estritamente unidirecional.
2. Identificação do Processo Emissor
A Porta de Origem especifica qual soquete (socket) no host de origem gerou os dados. A identificação completa de um fluxo UDP é dada pelo quádruplo (4-tuple):
{IP_Origem, Porta_Origem, IP_Destino, Porta_Destino}
- Multiplexação: Se um computador está rodando várias aplicações (navegador, cliente DNS, cliente VoIP), todas podem enviar dados UDP simultaneamente. A Porta de Origem garante que, quando uma resposta chegar, o sistema operacional saiba exatamente para qual aplicação entregá-la.
- Endereço de Retorno: Para a rede, a comunicação é definida pelo quádruplo. A Porta de Origem completa essa identidade, permitindo que o receptor saiba não apenas "quem" (IP) enviou, mas "qual processo especificamente" enviou.
3. Faixa de Valores e Atribuição
O valor numérico varia de 0 a 65535 (16 bits sem sinal). A IANA (Internet Assigned Numbers Authority) divide esse espaço em três faixas (RFC 6335):
| Faixa | Designação | Uso típico como Source Port |
|---|---|---|
| 0 – 1023 | Well-Known (System) | Servidores respondendo (ex.: DNS na 53) |
| 1024 – 49151 | Registered (User) | Aplicações comerciais; raramente origem |
| 49152 – 65535 | Dynamic / Private (Ephemeral) | Selecionada pelo SO no cliente |
3.1 Portas Efêmeras (Ephemeral Ports)
Em comunicações cliente-servidor, a Porta de Origem é geralmente escolhida dinamicamente pelo SO na faixa efêmera. Cada SO tem sua faixa padrão:
| Sistema Operacional | Faixa Efêmera Padrão |
|---|---|
| Linux (kernel ≥ 3.2) | 32768 – 60999 |
| Windows 10/11 | 49152 – 65535 |
| FreeBSD / macOS | 49152 – 65535 |
| Solaris / AIX | 32768 – 65535 |
No Linux, a faixa pode ser consultada e ajustada:
cat /proc/sys/net/ipv4/ip_local_port_range
# saída típica: 32768 60999
echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range
3.2 Portas Bem Conhecidas como Origem
Se o emissor for um Servidor (ex.: DNS respondendo a uma consulta), ele usará uma Porta de Origem padrão (ex.: 53). Isso permite ao cliente confirmar que a resposta veio de uma fonte autorizada, e não de um atacante tentando envenenar o cache (DNS spoofing).
4. Opcionalidade (Valor 0)
Uma peculiaridade do campo Source Port no UDP é que ele é opcional em certos contextos (RFC 768).
- Valor Zero (0x0000): Se o datagrama não exigir resposta, o campo pode ser preenchido com zeros.
- Uso em Unicast sem Resposta: Exemplos incluem mensagens Syslog (UDP 514), onde um dispositivo envia um alerta para um servidor central, mas não espera confirmação.
- Uso em Multicast/Broadcast: Em streaming de vídeo IP ou beaconing de descoberta (mDNS), o receptor não responde a uma porta específica; o campo pode ser menos relevante.
Atenção: usar Source Port = 0 em sistemas modernos pode ser tratado como anomalia por firewalls de estado (stateful firewalls) e descartado.
5. Necessidade para o Datagrama de Resposta
A utilidade mais comum da Porta de Origem é permitir Protocolos de Solicitação-Resposta (Request-Reply).
Cenário DNS (consulta unidirecional + resposta)
Cliente 192.168.1.10 Servidor DNS 8.8.8.8
| |
| UDP: src=54321 dst=53 |
|----------------------------->|
| | (processa consulta)
| UDP: src=53 dst=54321 |
|<-----------------------------|
| |
Se o cliente colocasse 0 no campo Source Port, o servidor não teria destino válido para a resposta, e a comunicação falharia.
6. Source Port Randomization e Segurança
Historicamente, sistemas operacionais antigos alocavam portas efêmeras sequencialmente (próxima porta livre acima da última usada). Isso abriu vetores de ataque como:
- DNS Cache Poisoning (Kaminsky, 2008): O atacante precisava adivinhar apenas a Porta de Origem (16 bits) da consulta DNS legítima para forjar uma resposta. Com portas sequenciais, isso era trivial.
- Blind Spoofing de conexões TCP: Prever a porta de origem facilita adivinhar o número de sequência inicial (ISN).
Solução: Source Port Randomization (RFC 6056). Todos os SOs modernos selecionam portas efêmeras aleatoriamente dentro da faixa, aumentando a entropia de ~16 bits para quase os 16 bits completos.
/* Exemplo POSIX: o SO escolhe a porta de origem automaticamente
quando o socket não faz bind() explícito em uma porta. */
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in dst = {0};
dst.sin_family = AF_INET;
dst.sin_port = htons(53);
inet_pton(AF_INET, "8.8.8.8", &dst.sin_addr);
sendto(sockfd, query, qlen, 0, (struct sockaddr*)&dst, sizeof(dst));
7. Source Port e NAT (Preservation)
Em CGNAT e NAT residencial, o NAT traduz {IP_local, Porta_origem_local} para {IP_público, Porta_origem_pública}. Comportamentos definidos na RFC 4787:
- Endpoint-Independent Mapping (EIM): Mesma porta pública independente do destino (amigável a P2P).
- Address-Dependent Mapping: Porta pública varia conforme o IP de destino.
- Address and Port-Dependent Mapping (APDM): Porta pública varia conforme IP e porta de destino (hostil a P2P, comum em CGNAT).
A preservação da porta (port preservation) facilita protocolos como SIP/RTCP, mas nem sempre é possível por colisão.
8. Observação com tcpdump / Wireshark
Captura de pacotes UDP mostrando os campos:
$ tcpdump -n -i eth0 udp port 53
14:02:11.123456 IP 192.168.1.10.54321 > 8.8.8.8.53: 2854+ A? example.com. (29)
14:02:11.140789 IP 8.8.8.8.53 > 192.168.1.10.54321: 2854 1/0/0 A 93.184.216.34 (45)
Repare como o Source Port (.54321) da requisição se torna o Destination Port da resposta, e vice-versa.
9. Resumo Técnico
| Atributo | Valor |
|---|---|
| Tamanho | 16 bits (2 octetos) |
| Posição | Bytes 0-1 do cabeçalho UDP |
| Faixa | 0 a 65535 |
| Obrigatório? | Não (0 = sem porta) |
| Atribuição no cliente | Dinâmica (efêmera) |
| Atribuição no servidor | Estática (well-known) |
| Endianness | Big-endian (network byte order) |
| RFC de referência | RFC 768 (1980), RFC 6335 (2011) |
10. Conclusão
O campo Source Port, apesar de ocupar apenas 16 bits no cabeçalho UDP, é o elo que viabiliza a comunicação bidirecional na internet baseada em datagramas. Compreender seu mecanismo de alocação, sua faixa efêmera, seu papel no NAT e suas implicações de segurança (randomização, spoofing) é fundamental para qualquer engenheiro de redes que trabalhe com transporte não confiável.