Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

03 - Conexão

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Conexão na Camada de Aplicação

O estabelecimento de uma Conexão na Camada de Aplicação é o processo de criar um canal de comunicação lógico entre dois processos (software). Esse canal é sustentado pela camada de transporte (TCP ou UDP), mas é solicitado e gerido pela aplicação via sockets.

1. O Papel do Socket

Um Socket é a interface de programação (API) que permite a uma aplicação interagir com a pilha de rede do sistema operacional. É originado na API Berkeley Sockets (BSD, 1983) e padronizado pelo POSIX.

  • Quando uma aplicação quer enviar dados, ela os "escreve" em um socket (send(), write()).
  • Quando quer receber dados, ela os "lê" de um socket (recv(), read()).

O socket é identificado por uma Quíntupla (5-Tuple) exclusiva na Internet, que garante que nenhum pacote se perca:

  1. Protocolo de Origem (TCP ou UDP — às vezes omitido, tornando 4-tuple)
  2. IP de Origem
  3. Porta de Origem
  4. IP de Destino
  5. Porta de Destino

1.1 Tipos de Socket

Tipo Função
SOCK_STREAM TCP — fluxo de bytes confiável
SOCK_DGRAM UDP — datagrama sem conexão
SOCK_RAW Acesso direto ao IP (raw sockets, usado por ping, traceroute)
SOCK_SEQPACKET Mensagens confiáveis orientadas a registro (SCTP)

2. Fluxo da Conexão TCP

Para a maioria das aplicações (Web, SSH, E-mail), a conexão é Orientada à Conexão (TCP) e segue este fluxo:

2.1 Three-Way Handshake (Estabelecimento)

  1. Cliente → Servidor: SYN (seq=x)
  2. Servidor → Cliente: SYN, ACK (seq=y, ack=x+1)
  3. Cliente → Servidor: ACK (ack=y+1)

Após o handshake, ambos os lados têm números de sequência sincronizados e o canal está pronto para transferência de dados.

2.2 Transferência de Dados

  • O fluxo de bytes é enviado. A camada de transporte garante que, se um pacote for perdido, ele será reenviado (retransmissão via timeout ou fast retransmit após 3 ACKs duplicados).
  • A aplicação não precisa se preocupar com ordem ou perdas — é abstraída pelo socket.
  • Controle de fluxo via sliding window; controle de congestionamento via algoritmos como Cubic, BBR ou Reno.

2.3 Four-Way Handshake (Encerramento)

Quando a troca termina, as partes enviam pacotes (FIN e ACK) para fechar o socket e liberar os recursos (memória e porta):

  1. Lado A → Lado B: FIN (seq=m)
  2. Lado B → Lado A: ACK (ack=m+1)
  3. Lado B → Lado A: FIN (seq=n)
  4. Lado A → Lado B: ACK (ack=n+1)

Após o último ACK, o lado que enviou entra em estado TIME_WAIT por 2 × MSL (Maximum Segment Lifetime, geralmente 60–120s) para garantir que pacotes atrasados não afetem novas conexões na mesma 4-tupla.

3. Estados TCP

Estado Descrição
LISTEN Servidor aguardando conexões
SYN_SENT Cliente enviou SYN, aguarda SYN+ACK
SYN_RCVD Servidor recebeu SYN, enviou SYN+ACK
ESTABLISHED Conexão ativa, dados fluindo
FIN_WAIT_1/2 Lado ativo esperando FIN do outro
CLOSE_WAIT Lado passivo recebeu FIN, aguarda aplicação fechar
TIME_WAIT Aguarda 2×MSL antes de liberar porta
CLOSED Conexão totalmente encerrada

Muitas conexões presas em CLOSE_WAIT indicam bug na aplicação (não chamou close() no socket).

4. Conexões Sem Estado (UDP)

Algumas aplicações (DNS, DHCP, Streaming) usam o UDP, que não estabelece uma conexão formal.

  • O cliente simplesmente envia o datagrama com IP e Porta de destino.
  • Não há confirmação de recebimento.
  • Cada datagrama é tratado independentemente — podem chegar fora de ordem ou se perder.
  • Muito mais rápido e leve, mas exige que a camada de aplicação trate possíveis erros de perda de dados.
  • UDP pode usar connect() apenas para fixar o destino e receber ICMP Port Unreachable — sem trocar pacotes de controle.

5. Limite Máximo de Conexões

O limite teórico de conexões simultâneas em um servidor é determinado por:

  • Espaço de portas efêmeras: até 65.535 conexões por IP cliente.
  • Porta do servidor: única, mas pode ser compartilhada por milhões de 4-tuplas diferentes.
  • Memória RAM: cada socket TCP consome buffer (ex: 4 KB de receive + 4 KB de send, escalando para milhões = GBs).
  • somaxconn e tcp_max_syn_backlog: limites do kernel para filas de aceitação.

Em Linux, ajuste via:

sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
ulimit -n 1000000   # file descriptors por processo

Servidores modernos (Nginx, HAProxy) mantêm milhões de conexões simultâneas usando epoll (event-loop), padrão desde o kernel 2.6.

6. Gerenciamento de Sockets no S.O.

Em sistemas Linux/Unix, você pode visualizar as conexões e sockets ativos usando:

  • netstat -tunlp (legado, amplamente disponível)
  • ss -tunlp (moderno, mais rápido, lê do kernel via netlink)
  • lsof -i (lista sockets por processo)
# Conexões TCP estabelecidas
ss -t state established

# Conexões no estado TIME_WAIT
ss -ant | grep TIME-WAIT | wc -l

# Quem escuta na porta 443
sudo ss -tlnp 'sport = :443'

6.1 Estatísticas do Kernel

# Snippets de /proc para diagnóstico
cat /proc/net/tcp        # estado de todos os sockets TCP
cat /proc/sys/net/ipv4/tcp_tw_reuse

7. RFCs de Referência

RFC Título
RFC 793 TCP — definição original
RFC 7323 TCP High Speed / Window Scale
RFC 4987 SYN Cookies (defesa contra SYN flood)
RFC 768 UDP
RFC 9000 QUIC (UDP-based, usado por HTTP/3)

8. Resumo Técnico

Atributo Valor
Identificador único 5-tuple (proto, src IP, src port, dst IP, dst port)
Handshake TCP 3 vias (SYN, SYN+ACK, ACK)
Encerramento TCP 4 vias (FIN, ACK, FIN, ACK)
Estados TCP 11 estados distintos
Limite prático Memória + file descriptors + somaxconn

9. Conclusão

Conexões TCP/IP são o coração das aplicações de rede. Compreender sockets, o three-way handshake, a máquina de estados TCP, o comportamento do UDP e os limites práticos de concorrência permite diagnosticar lentidão, esgotamento de portas, ataques SYN flood e problemas de aplicação que não fecham sockets. A camada de aplicação é, na prática, abstraída pela API de sockets — mas o engenheiro de redes deve entender o que acontece "por baixo" para projetar sistemas robustos e escaláveis.