Protocolo

TCP

Na arquitetura IP da casa inteligente, TCP ocupa a camada de transporte entre aplicações como HTTP, MQTT, SSH e Modbus TCP e o protocolo IP. A especificação consolidada está na RFC 9293, de 2022. Diferente de UDP, cria conexão, ordena bytes, retransmite perdas e controla fluxo. A decisão de projeto troca menor simplicidade por confiabilidade; exige estados, buffers e handshake. Uma queda de Wi‑Fi interrompe a conexão, portanto clientes precisam de keepalive, timeout e reconexão.

↗ Wikidata · Q8803
📖Definição aprofundada

TCP é um protocolo de transporte orientado a conexão que oferece às aplicações um fluxo bidirecional de bytes confiável, ordenado e sem duplicação intencional. Ele não preserva limites de mensagem. Se uma aplicação envia dois blocos de 100 bytes, o receptor pode ler 50, 150 e 50. O protocolo de aplicação precisa ter framing, como comprimento, delimitador ou estrutura. HTTP/1.1 usa regras de mensagem; MQTT usa cabeçalho com comprimento; Modbus TCP usa MBAP. TCP identifica conexões por endereços IP e portas de origem e destino. O cliente normalmente escolhe porta efêmera e conecta à porta conhecida do servidor, como 80 HTTP, 443 HTTPS, 1883 MQTT ou 8883 MQTT/TLS. A porta não garante o protocolo; é convenção. O handshake de três vias usa SYN, SYN-ACK e ACK para sincronizar números de sequência. Depois, segmentos transportam dados. O receptor confirma bytes com ACK. Perdas são detectadas por timeout ou ACKs e retransmitidas. A janela de recepção implementa controle de fluxo para não exceder buffers. O controle de congestionamento ajusta a taxa à rede. A RFC 9293, publicada em agosto de 2022, consolida a especificação principal e substitui a base da RFC 793 de 1981, incorporando décadas de correções. Algoritmos de congestionamento e extensões estão em RFCs adicionais. Em LAN residencial, a latência é baixa, mas perdas de Wi‑Fi, roaming, economia de energia e interferência acontecem. TCP recupera perdas, porém a retransmissão adiciona atraso. Uma mensagem posterior não é entregue à aplicação antes do byte perdido no mesmo fluxo. Esse head-of-line blocking é uma razão para QUIC e HTTP/3 usarem streams independentes sobre UDP. TCP continua adequado a MQTT, HTTP/1.1, HTTP/2, SSH, RTSP interleaved, banco e protocolos industriais. O custo é manter conexão e estado. Um microcontrolador precisa de memória para buffers. Milhares de dispositivos exigem servidor dimensionado. NAT e firewall descartam conexões ociosas. Keepalive de aplicação, como PINGREQ/PINGRESP do MQTT, é mais explícito que TCP keepalive. O cliente precisa detectar ausência e reconectar. Um socket aberto não prova que o equipamento remoto está funcional. Escrever pode parecer sucesso até o buffer. A aplicação precisa de confirmação semântica. TCP não cifra, não autentica e não autoriza. TLS adiciona. Sem TLS, qualquer nó no caminho pode ler e alterar quando tem capacidade. Em rede local, segmentação ajuda, mas não substitui. A confiabilidade é de bytes entre pilhas, não de ação física. Receber comando não significa relé comutou. O protocolo de aplicação deve confirmar.

Arquitetura e Funcionamento
Conexão e estados
O handshake de três vias cria estado em ambos os lados. SYN solicita, SYN-ACK aceita e ACK confirma. Números iniciais de sequência ajudam distinguir dados antigos. O servidor mantém fila de conexões. Ataques SYN flood exploram. SYN cookies e limites mitigam. Depois, estados como ESTABLISHED, FIN-WAIT, CLOSE-WAIT e TIME-WAIT acompanham fechamento. Fechar corretamente usa FIN; abortar usa RST. Muitos sockets em CLOSE-WAIT indicam aplicação que não fecha. TIME-WAIT evita confundir segmentos de conexão antiga, mas consome tuplas. Em gateways com conexões frequentes, pooling reduz. Um dispositivo que abre HTTP a cada segundo desperdiça handshake e TLS. Keep-alive HTTP reutiliza. Em MQTT, uma conexão longa é normal. Após mudança de IP ou Wi‑Fi, a conexão antiga morre. O cliente deve reconectar com backoff. Reconectar todos após falta de energia pode sobrecarregar broker; jitter distribui.
Confiabilidade e ordem
Cada byte possui posição. O receptor confirma cumulativamente e pode usar SACK para informar blocos recebidos fora de ordem. O emissor retransmite. Duplicatas de segmentos são removidas pela pilha. Isso não impede duplicação na aplicação. Se o servidor processa um POST e a resposta se perde, o cliente retenta e pode criar duas operações. Idempotência continua. A ordem é por conexão. Duas conexões não têm ordem comum. Em MQTT, mensagens em uma conexão seguem regras do protocolo; sessões e QoS adicionam. TCP preserva bytes, não registros. O leitor deve acumular até formar mensagem. Assumir que um `recv()` retorna um pacote completo causa bugs. Em Modbus TCP, o campo de comprimento orienta. Em protocolo proprietário, use framing robusto e limite de tamanho para evitar memória. A confiabilidade aumenta latência em perda. Para voz em tempo real, UDP pode ser preferível porque dado atrasado perde valor.
Fluxo e congestionamento
A janela anunciada pelo receptor limita quantos bytes podem ficar sem confirmação. Se a aplicação lê devagar, a janela diminui e pode chegar a zero. Isso é backpressure. O emissor deve respeitar. Buffers enormes podem esconder atraso e criar bufferbloat. O controle de congestionamento usa congestion window, slow start, avoidance e recuperação. Algoritmos como CUBIC e BBR variam por sistema. O protocolo evita inundar a rede. Em casa com upload saturado por câmera, TCP reduz, mas filas do roteador podem adicionar segundos. SQM com fq_codel ou CAKE melhora. A automação de luz pode ficar lenta não por servidor, mas por buffer. Priorizar tráfego ou limitar câmera ajuda. Nagle combina pequenos segmentos; TCP_NODELAY reduz atraso em mensagens pequenas, mas aumenta pacotes. Use conforme protocolo. MQTT e jogos podem desativar; transferências não. Delayed ACK interage. Medir antes. A rede Wi‑Fi tem retransmissão na camada 2 além do TCP, aumentando atraso.
Segurança e operação
O checksum detecta corrupção acidental, não ataque. Um invasor no caminho pode forjar. TLS fornece confidencialidade, integridade e autenticação. MQTT 8883 e HTTPS 443 são exemplos. Certificados precisam ser validados. Em dispositivos, armazenar CA e atualizar. TCP keepalive do sistema envia sondas após ociosidade, mas defaults podem ser de horas. Aplicação precisa de heartbeat compatível. Timeouts de conexão e leitura evitam espera infinita. Firewall stateful acompanha conexões. NAT expira. Port forwarding expõe. Não abrir 1883 sem TLS e autenticação à internet. Use VPN ou broker gerenciado. Logs incluem IP, porta, duração, bytes e resets, não payload sensível. `ss`, `netstat`, tcpdump e Wireshark diagnosticam. Capturas podem conter tokens. Proteger. Um RST pode indicar porta fechada, aplicação reiniciada ou firewall. Timeouts podem ser perda, bloqueio ou rota. Observabilidade de camada de aplicação completa.
Análise Técnica
✓ Vantagens
  • Entrega bytes confiáveis e ordenados, simplificando protocolos que precisam receber toda a configuração, comando ou arquivo sem lacunas.
  • Controle de fluxo impede que emissor sobrecarregue o receptor, importante em microcontroladores e gateways com memória limitada.
  • Controle de congestionamento permite coexistir na Internet e adapta a taxa a perdas e capacidade, sem cada aplicação reinventar.
  • É suportado por todos os sistemas IP e por protocolos amplamente usados em casa inteligente, como HTTP, MQTT, SSH e Modbus TCP.
  • TLS sobre TCP oferece uma pilha madura para segurança, certificados, mTLS e bibliotecas em linguagens e dispositivos.
✗ Desvantagens
  • Handshake, estado e buffers aumentam consumo de memória e latência comparado a UDP, especialmente para mensagens únicas.
  • Perda de um segmento bloqueia a entrega dos bytes posteriores naquele fluxo, mesmo se pertencem a operações independentes.
  • Não preserva fronteiras de mensagem; aplicações precisam implementar framing e leitura parcial corretamente.
  • Conexões ociosas podem ser removidas por NAT, firewall ou Wi‑Fi; keepalive, heartbeat e reconexão são necessários.
  • Confiabilidade de transporte não garante execução única nem confirmação física; retries podem duplicar ações sem idempotência.
💡 Cenário Prático: TCP para MQTT, HTTP e Modbus numa casa conectada
Um broker MQTT local escuta 8883 com TLS e autenticação. Sensores mantêm conexão, enviam PING no intervalo e reconectam com backoff e jitter. O servidor limita conexões e tamanho. Home Assistant acessa por VLAN permitida. Modbus TCP opera na porta 502 apenas em rede industrial segmentada, sem exposição. Um gateway consulta equipamentos e publica estados no broker, evitando que muitos clientes abram conexões no PLC. APIs HTTP reutilizam conexões por pool. Timeouts de conexão de poucos segundos e leitura conforme operação são definidos. Comandos possuem ID e confirmação de estado. O roteador usa SQM para evitar que upload de câmera aumente a latência. O monitoramento acompanha conexões, retransmissões e resets. TLS termina no serviço ou proxy confiável. Certificados renovam. Portas não são abertas na WAN. Acesso remoto usa VPN. Em microcontroladores, buffers são dimensionados e o parser trata leituras parciais. O firmware não assume um pacote por `recv`. Após falta de energia, dispositivos esperam atraso aleatório para não criar tempestade de SYN e autenticação.