- A infraestrutura de rede é composta por switches, bridges, roteadores, load balancers, firewalls etc.
- O sistema operacional controla a comunicação de rede, classificando pacotes, colocando-os em filas e aplicando regras de firewall.
- Então, o que aconteceria se usássemos um protocolo da camada de transporte inexistente?
- O SO permitiria? Os pacotes seriam realmente entregues? O firewall bloquearia?
- Foi feito um experimento direto para verificar isso.
Visão geral dos protocolos da internet
- A internet funciona com várias camadas de protocolos transmitindo dados
- Quando uma aplicação envia uma requisição, o SO a transmite encapsulando-a com cabeçalhos de várias camadas de rede
- Camada de transporte (Transport Layer): é onde ficam protocolos como TCP (6) e UDP (17)
- O que aconteceria se alterássemos o campo
Protocol do cabeçalho IP para inserir um número não usado?
Experimento #1: teste direto no meu PC
Método do experimento
- Definição do HDP (protocolo falso): criação de um novo protocolo de camada de transporte totalmente diferente dos existentes
- Implementação de servidor e cliente: desenvolvimento de programas para enviar e receber pacotes
- Teste em loopback: observação de como o SO processa os pacotes internamente
Execução
$ sudo cargo run --bin server # executa o servidor
$ fortune | cowsay | sudo cargo run --bin client 127.0.0.1 # executa o cliente
Resultado
- O SO processou normalmente os pacotes HDP, que foram recebidos de volta pela interface de loopback
- Foram feitos testes adicionais alterando o número do protocolo IP
- 1 (ICMP), 2 (IGMP), 6 (TCP) → não detectado no servidor
- 50, 51 (protocolos relacionados ao IPSec) → o próprio envio foi bloqueado no cliente
- 256 (fora do intervalo de números de protocolo IP) → erro na etapa da chamada
socket()
Análise da causa
- Em alguns casos, o SO bloqueia determinados números de protocolo por estarem reservados pelo sistema
- No Darwin (macOS baseado em BSD), ao definir protocol=0 na chamada
socket(), alguns pacotes são filtrados automaticamente
- Protocolos relacionados ao IPSec provavelmente são bloqueados por motivos de segurança
- Como o número de protocolo IPv4 tem 8 bits, só são válidos os valores de 0 a 255
Experimento #2: envio de pacotes pela internet
Plano do experimento
- Configuração de uma VPS da DigitalOcean: montagem do ambiente de teste em um servidor em nuvem em Frankfurt, Alemanha
- Envio de pacotes HDP: transmissão dos pacotes do meu PC (na Arábia Saudita) para o servidor da DigitalOcean
- Análise da reação dos equipamentos de rede: verificar se os pacotes chegam e se o firewall os bloqueia
Resultado esperado
- Os pacotes HDP poderiam ser entregues normalmente, ou algum ISP ou o firewall da DigitalOcean poderia bloqueá-los
Resultado real
- Apenas o primeiro pacote foi entregue, e os seguintes foram bloqueados
- Resultado verificado com
tcpdump:
- Os pacotes saíram normalmente do meu PC
- No servidor da DigitalOcean, apenas o primeiro pacote foi detectado
- Os pacotes seguintes foram bloqueados em algum ponto (NAT, firewall, ISP etc.)
Análise da causa
- A DigitalOcean não oferece suporte a protocolos IP não padronizados
- É bastante provável que a principal causa seja a política de firewall do provedor de nuvem
- Não está claro por que apenas o primeiro pacote chegou
Novo teste na AWS
- O experimento foi repetido na AWS usando duas instâncias
- Dentro do mesmo datacenter, os pacotes HDP foram enviados e recebidos normalmente
- Porém, ao transmitir pela internet, ocorreu o mesmo problema da DigitalOcean: apenas o primeiro pacote chegava
Principais problemas
- NAT (Network Address Translation): como funciona com base em portas TCP/UDP, não há como lidar com um novo protocolo como o HDP
- Firewall/filtragem de rede: a maioria dos ISPs e provedores de nuvem bloqueia protocolos IP não aprovados
- Problemas de otimização em equipamentos de rede: alguns dispositivos podem simplesmente descartar pacotes não padronizados
Conclusão: usar TCP e UDP é a melhor opção
- As implementações da stack de rede variam entre os sistemas operacionais
- O comportamento de
socket() no Linux, macOS e Windows é diferente em cada um
- Firewalls e dispositivos NAT bloqueiam protocolos não padronizados
- Mesmo que funcione em uma rede privada, na internet isso é quase impossível
- Não há ganho de desempenho
- Já existem alternativas comprovadas, como o QUIC implementado sobre UDP
- Use TCP/UDP
- Ao usar protocolos padrão, NAT baseado em portas, firewall e roteamento passam a ser suportados automaticamente
Material adicional
5 comentários
Acho que ler https://www.saturnsoft.net/network/2019/03/21/quic-http3-1/ também pode ajudar.
Lembro que, antigamente, quando jogava multiplayer de StarCraft via Hamachi, existia o IPX, e me recordo de ter ficado bem curioso sobre o que exatamente era aquilo naquela época.
Pensando bem, o NAT acabaria bloqueando tudo... Se o IPv6 se consolidar completamente e o NAT desaparecer (embora isso pareça improvável), talvez também seja possível se comunicar usando um protocolo criado por você mesmo.
Oh, boa tentativa...
A ideia de abalar as bases da rede foi boa, mas todos os equipamentos de rede deste mundo são especializados em TCP/UDP, então...
Quando você não sabe que equipamento de rede é algo feito em escala... até parece possível... mas, quando descobre, percebe que, a menos que você faça muito sucesso e consiga fazer todo mundo usar o seu protocolo, não dá para fazer isso...
Comentários no Hacker News