Pular para o conteúdo
Glossary 8 min de leitura 937 visualizações

Proxy TCP e UDP

Compare os protocolos de proxy TCP e UDP para entender suas características, casos de uso e como afetam a comunicação em rede.

Proxy TCP e UDP

Proxies TCP gerenciam fluxos de dados com estado, orientados a conexão, com entrega e ordem garantidas, enquanto proxies UDP encaminham datagramas sem conexão, oferecendo menor latência e overhead, mas sem confiabilidade, ordenação ou gerenciamento de sessão inerentes na camada de transporte. Essa diferença fundamental determina a implementação, as características de desempenho e as aplicações adequadas de cada um.

Entendendo os protocolos TCP e UDP

O Transmission Control Protocol (TCP) e o User Datagram Protocol (UDP) são os dois principais protocolos da camada de transporte na pilha IP. Suas características distintas influenciam diretamente como um serviço de proxy deve operar para tratar o tráfego de cada um.

TCP: orientado a conexão e confiável

O TCP estabelece uma conexão persistente e bidirecional entre um cliente e um servidor antes que qualquer transferência de dados ocorra. Essa natureza orientada a conexão fornece:
* Transferência de dados confiável: os segmentos de dados são confirmados pelo receptor. Se a confirmação não chega, o remetente retransmite os dados.
* Entrega ordenada de dados: os segmentos são remontados na ordem correta no destino, mesmo que cheguem fora de sequência.
* Controle de fluxo: impede que um remetente rápido sobrecarregue um receptor lento.
* Controle de congestionamento: gerencia o tráfego de rede para evitar o colapso por congestionamento.

Esses recursos tornam o TCP adequado para aplicações em que a integridade e a ordem dos dados são críticas.

UDP: sem conexão e não confiável

O UDP é um protocolo mais simples, sem conexão. Ele envia pacotes independentes, chamados datagramas, sem estabelecer uma conexão prévia nem garantir a entrega. Suas características incluem:
* Sem estabelecimento/encerramento de conexão: reduz overhead e latência.
* Entrega não confiável: os datagramas podem ser perdidos, duplicados ou chegar fora de ordem sem notificação ao remetente.
* Sem controle de fluxo ou de congestionamento: os dados são enviados no ritmo da aplicação.

O UDP é preferido em aplicações nas quais velocidade e baixa latência são mais importantes do que a entrega garantida, ou nas quais as aplicações tratam a confiabilidade em uma camada superior.

Proxy TCP

Um proxy TCP funciona estabelecendo duas conexões TCP separadas: uma com o cliente e outra com o servidor de destino. Ele atua como intermediário, encaminhando dados entre essas duas conexões.

Mecânica operacional

  1. Conexão cliente-proxy: o cliente inicia uma conexão TCP com o proxy.
  2. Conexão proxy-servidor: ao receber a solicitação de conexão do cliente, o proxy estabelece sua própria conexão TCP com o servidor de destino pretendido.
  3. Encaminhamento de dados: uma vez estabelecidas as duas conexões, o proxy lê os dados da conexão do cliente e os escreve na conexão do servidor, e vice-versa.
  4. Gerenciamento de estado: o proxy mantém o estado de cada sessão cliente-servidor, rastreando as duas conexões TCP associadas e seus respectivos fluxos de dados. Esse estado é crucial para o roteamento correto dos dados e o gerenciamento das conexões.
  5. Encerramento da conexão: quando o cliente ou o servidor fecha sua conexão, o proxy trata o encerramento gracioso da conexão correspondente e, por fim, da sua própria.

Casos de uso

Proxies TCP são usados em qualquer protocolo de camada de aplicação construído sobre TCP:
* Proxies HTTP/HTTPS: navegação na web, chamadas de API.
* Proxies SOCKS: proxy de uso geral para diversas aplicações TCP (por exemplo, SSH, FTP, P2P).
* Proxies SMTP/POP3/IMAP: serviços de e-mail.
* Proxies de banco de dados: MySQL, PostgreSQL etc.
* Proxies SSH: conexões de shell seguro.

Exemplo: lógica simples de proxy TCP (conceitual)

import socket

def tcp_proxy(listen_port, target_host, target_port):
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', listen_port))
    server_socket.listen(5)
    print(f"Listening on port {listen_port} for TCP traffic...")

    while True:
        client_conn, client_addr = server_socket.accept()
        print(f"Client {client_addr} connected.")

        target_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            target_socket.connect((target_host, target_port))
            print(f"Connected to target {target_host}:{target_port}.")

            # Em um proxy real, isso envolveria threads/E-S assíncrona para encaminhamento bidirecional
            # Para simplificar, este exemplo mostra apenas o estabelecimento da conexão.
            # A lógica de encaminhamento de dados entraria aqui.
            # Exemplo: client_conn.recv(4096) -> target_socket.send()
            # e target_socket.recv(4096) -> client_conn.send()

        except Exception as e:
            print(f"Could not connect to target: {e}")
        finally:
            client_conn.close()
            target_socket.close()

# Exemplo de uso (execute em thread/processo separado para o encaminhamento real)
# tcp_proxy(8080, 'www.example.com', 80)

Proxy UDP

Um proxy UDP encaminha datagramas sem conexão. Como o UDP não tem conexões explícitas, o principal desafio de um proxy UDP é rotear corretamente os datagramas de resposta de volta ao cliente de origem.

Mecânica operacional

  1. Datagrama cliente-proxy: o cliente envia um datagrama UDP ao proxy.
  2. Datagrama proxy-servidor: o proxy recebe o datagrama e o encaminha ao servidor de destino pretendido.
  3. Tratamento da resposta (mapeamento com estado): para rotear a resposta do servidor de volta ao cliente correto, o proxy precisa armazenar temporariamente um mapeamento entre o (IP de origem, porta de origem) do cliente e o (IP de origem, porta de origem) do proxy usado para enviar o datagrama ao servidor.
  4. Encaminhamento da resposta: quando o servidor responde ao proxy, este usa o mapeamento armazenado para reescrever o endereço/porta de destino do datagrama de resposta de volta para o endereço/porta do cliente original antes de encaminhá-lo.
  5. Tempo limite da sessão: esses mapeamentos costumam ter vida curta e expiram após um período de inatividade, já que o UDP não tem encerramento explícito de conexão.

Desafios

  • NAT traversal: proxies UDP frequentemente executam Network Address Translation (NAT) para gerenciar vários clientes atrás de um único IP público.
  • Tráfego assimétrico: se as respostas seguirem um caminho diferente, ou se o servidor iniciar o tráfego, o proxy pode não ver todos os pacotes relevantes, o que dificulta o gerenciamento de estado.
  • Amplificação de DDoS: sem os controles adequados, proxies UDP podem ser abusados em ataques de amplificação DDoS, caso encaminhem requisições de origens falsificadas para servidores de alta banda.

Casos de uso

Proxies UDP são usados em protocolos que priorizam velocidade ou nos quais as aplicações tratam a confiabilidade:
* Proxies DNS: resolução de nomes de domínio.
* Proxies NTP: sincronização de tempo.
* Proxies VoIP/RTP: comunicação de voz e vídeo em tempo real.
* Proxies para jogos: jogos multiplayer online.
* Proxies SNMP: gerenciamento de rede.

Exemplo: lógica simples de proxy UDP (conceitual)

import socket
import time

def udp_proxy(listen_port, target_host, target_port):
    proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    proxy_socket.bind(('0.0.0.0', listen_port))
    print(f"Listening on port {listen_port} for UDP traffic...")

    # Armazena (client_addr, client_port) -> (proxy_addr, proxy_port, timestamp)
    # para rotear as respostas de volta
    client_map = {}
    TIMEOUT = 60 # segundos

    while True:
        data, client_address = proxy_socket.recvfrom(4096)

        # Armazena o mapeamento do cliente
        client_map[client_address] = (proxy_socket.getsockname()[0], proxy_socket.getsockname()[1], time.time())

        # Encaminha ao destino
        proxy_socket.sendto(data, (target_host, target_port))

        # Verifica respostas do destino (simplificado; um proxy real usaria select/poll)
        proxy_socket.settimeout(0.1) # Tempo limite curto para checar respostas
        try:
            reply_data, server_address = proxy_socket.recvfrom(4096)
            # Encontra o cliente original desta resposta
            # Em um cenário real, o proxy teria enviado a requisição original
            # a partir de uma porta efêmera específica e feito o mapeamento. Este exemplo é simples demais.
            # Uma solução mais robusta envolve criar um novo socket para cada par cliente-servidor
            # ou gerenciar um pool de portas efêmeras e mapeá-las.

            # Neste exemplo simples, assumimos que a resposta é do último cliente que enviou tráfego
            # NÃO é assim que um proxy UDP de produção funciona.

            # Simplificado: apenas devolve ao último cliente conhecido
            if client_address in client_map:
                proxy_socket.sendto(reply_data, client_address)
                print(f"Forwarded reply from {server_address} to {client_address}")

        except socket.timeout:
            pass # Ainda sem resposta

        # Limpa mapeamentos antigos
        current_time = time.time()
        for addr, (p_ip, p_port, ts) in list(client_map.items()): # Itera sobre uma cópia
            if current_time - ts > TIMEOUT:
                del client_map[addr]

# Exemplo de uso (execute em thread/processo separado para o encaminhamento real)
# udp_proxy(53, '8.8.8.8', 53)

Comparação: proxy TCP vs. proxy UDP

Recurso Proxy TCP Proxy UDP
Conexão Orientado a conexão (estabelece dois fluxos) Sem conexão (encaminha datagramas)
Confiabilidade Entrega garantida, retransmissões Sem entrega garantida, datagramas podem se perder
Ordem Entrega em ordem garantida Sem ordem garantida, datagramas podem chegar fora de ordem
Estado Altamente com estado (gerencia o estado da conexão) Moderadamente com estado (gerencia mapeamentos de endereço para respostas)
Overhead Maior (handshakes, confirmações) Menor (cabeçalho mínimo, sem handshakes)
Latência Maior (por causa dos mecanismos de confiabilidade) Menor (envia e esquece)
Complexidade Trata o ciclo de vida da conexão, controle de fluxo Gerencia mapeamentos efêmeros, NAT traversal
Protocolos comuns HTTP/S, FTP, SSH, SMTP, MySQL, PostgreSQL DNS, NTP, RTP (VoIP), jogos, SNMP

Considerações práticas para implementações de proxy

Estado e uso de recursos

  • Proxies TCP: cada conexão TCP ativa consome recursos (memória para buffers, descritores de arquivo). Um número alto de conexões simultâneas pode esgotar os recursos do proxy. O proxy precisa gerenciar o ciclo de vida completo de duas conexões por sessão de cliente.
  • Proxies UDP: o uso de recursos por "sessão" (par cliente-servidor) costuma ser mais leve, principalmente para armazenar o mapeamento temporário de endereços. Ainda assim, gerenciar um grande número de mapeamentos efêmeros e tratar possíveis timeouts com eficiência exige um projeto cuidadoso.

Desempenho e escalabilidade

  • Proxies TCP: o desempenho pode ser afetado pelo overhead de estabelecer e manter conexões, especialmente em conexões de vida curta. As otimizações costumam envolver pooling de conexões ou multiplexação.
  • Proxies UDP: oferecem maior throughput para aplicações tolerantes à perda de pacotes, graças ao baixo overhead. A escalabilidade costuma ser obtida distribuindo o tráfego entre várias instâncias de proxy com balanceadores de carga.

Implicações de segurança

  • Proxies TCP: podem inspecionar e filtrar o tráfego na camada de aplicação (por exemplo, proxies HTTP para filtragem de conteúdo, WAFs). Podem terminar conexões TLS (proxy HTTPS) para inspecionar tráfego criptografado.
  • Proxies UDP: a inspeção de pacotes é mais difícil devido à natureza sem conexão e a protocolos frequentemente específicos da aplicação. Proxies UDP mal configurados podem ser usados em ataques de amplificação DDoS. Implementar limitação de taxa e validação de origem é essencial.

Serviços de proxy híbridos

Algumas soluções de proxy, como o SOCKS5, oferecem suporte a proxy TCP e UDP. Quando um cliente solicita uma associação UDP, o servidor SOCKS5 normalmente vincula uma porta UDP do seu lado e retransmite os datagramas UDP entre o cliente e o destino, executando a tradução de endereços necessária para as respostas. Isso permite que um único serviço de proxy atenda a uma gama mais ampla de aplicações de rede.

Atualizado: 04.03.2026
Voltar à categoria

Leia também

Glossary 3 min

O que é um proxy móvel? Proxies 4G/5G explicados

Um proxy móvel roteia o tráfego através de um dispositivo 4G/5G real, te dando um IP de operadora compartilhado por milhares de usuários reais — o tipo mais difícil de bloquear. Veja como funcionam e quando usá-los.

Glossary 3 min

O que é um proxy ISP? Proxies residenciais estáticos explicados

Um proxy ISP é um IP estático hospedado em datacenter mas registrado em um ISP residencial — confiança residencial com velocidade de datacenter e IP fixo. Veja como funcionam e quando usá-los.

Glossary 3 min

Proxy HTTP vs HTTPS: qual é a diferença?

Um proxy HTTP pode ler seu tráfego web; um proxy HTTPS o tunela criptografado via CONNECT. Veja a diferença real, o que o proxy consegue ver e qual usar.

Glossary 4 min

O que é um proxy? Guia completo para iniciantes

Um servidor proxy é um intermediário que esconde seu IP real roteando o tráfego por outro IP. Veja como os proxies funcionam, os principais tipos e como escolher o certo.

Glossary 4 min

SOCKS5 vs proxy HTTP: diferenças, velocidade e quando usar cada um

Proxies SOCKS5 e HTTP resolvem problemas diferentes. Um proxy HTTP entende tráfego web e consegue cacheá-lo ou filtrá-lo; o SOCKS5 encaminha às cegas qualquer conexão TCP/UDP — torrents, jogos, e-mail, não só navegação. Nenhum dos dois criptografa o tráfego sozinho. Veja exatamente quando cada um ganha.

Glossary 1 min

CDN e proxies: como funcionam

CDN e proxies — como funcionam juntos — um termo da área de proxies e tecnologias de rede.

Experimente nossos proxies

20,000+ proxies em 100+ países do mundo

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.