03 - Conexão
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:
- Protocolo de Origem (TCP ou UDP — às vezes omitido, tornando 4-tuple)
- IP de Origem
- Porta de Origem
- IP de Destino
- 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)
- Cliente → Servidor:
SYN(seq=x) - Servidor → Cliente:
SYN, ACK(seq=y, ack=x+1) - 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):
- Lado A → Lado B:
FIN(seq=m) - Lado B → Lado A:
ACK(ack=m+1) - Lado B → Lado A:
FIN(seq=n) - 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 receberICMP 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).
somaxconnetcp_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.