coldwa.st
Todos os guiasProgramaçãoWebDadosFerramentasBases de dadosHaskellConceitosCabal e buildsToolchainCompiladorDesempenhoEditor e HLS

Programação · Web · Redes

O que é um WebSocket?

Por ColdwastAtualizado em 26 jun 20268 min de leitura#websocket#realtime#networking
Cabos de rede ligados a um rack de servidores num centro de dados
Um WebSocket mantém uma única ligação aberta em ambos os sentidos — em vez de abrir um novo pedido para cada mensagem, o cliente e o servidor continuam a conversar pela mesma linha.

A maior parte da web funciona por pedido e resposta: o navegador pergunta, o servidor responde, a ligação fecha. Isso é ótimo para carregar uma página, mas desmorona quando se quer atualizações ao vivo — uma mensagem de chat, uma cotação de bolsa, uma jogada multijogador — que o servidor precisa de enviar no momento em que acontecem. Um WebSocket é a resposta padrão. Este guia explica o que é um WebSocket, em que difere do HTTP comum, e quando se precisa mesmo de um.

A ideia central: uma ligação, ambos os sentidos

Um WebSocket é uma ligação persistente e bidirecional (full-duplex) entre um cliente — normalmente um navegador — e um servidor. Uma vez aberta, qualquer dos lados pode enviar uma mensagem a qualquer momento, sem que o outro tenha de pedir primeiro. É essa a diferença fundamental em relação a uma API HTTP normal: HTTP é um pedido, uma resposta, e acabou; um WebSocket mantém-se aberto e transporta mensagens em ambos os sentidos durante o tempo que for preciso.

Como a ligação já está aberta, as mensagens chegam com muito pouca sobrecarga e quase nenhum atraso. Não há cabeçalhos repetidos, nem um novo handshake por mensagem — apenas uma pequena frame de dados em cada sentido. É isso que torna os WebSockets adequados a tudo o que tenha de parecer instantâneo.

Como arranca um WebSocket: o handshake HTTP

Um WebSocket não surge do nada — começa como um pedido HTTP comum. O navegador envia um pedido normal com um cabeçalho Upgrade: websocket, pedindo essencialmente ao servidor para trocar de protocolo. Se o servidor concordar, responde com o estado 101 Switching Protocols, e a partir daí a mesma ligação TCP deixa de falar HTTP e passa a falar o protocolo WebSocket. É por isso que os WebSockets viajam pelas mesmas portas da web (80 e 443) e atravessam a maioria das firewalls que já permitem o tráfego web.

Depois do handshake, os dados movem-se como frames leves. Cada mensagem pode ser texto — muitas vezes JSON — ou binária, e não há uma forma fixa de pedido/resposta: as mensagens simplesmente fluem quando há algo a enviar.

ws vs wss

Os URL de WebSocket usam o seu próprio esquema. ws:// é uma ligação não cifrada, e wss:// é a versão cifrada, protegida com TLS exatamente como o está https://. Na prática, deve usar sempre wss:// em produção — é cifrado e é muito menos provável que seja bloqueado por proxies e redes empresariais que desconfiam do tráfego ws:// em claro.

Código-fonte HTML e JavaScript apresentado num ecrã
No navegador, abre um WebSocket a partir do JavaScript com o objeto nativo WebSocket e depois fica à escuta das mensagens à medida que chegam.

Quando usar um WebSocket (e quando não)

Os WebSockets brilham sempre que o servidor tem de enviar dados ao cliente assim que acontecem:

  • Chat e mensagens — as mensagens aparecem no instante em que são enviadas.
  • Painéis e cotações ao vivo — tickers de bolsa, métricas, resultados desportivos.
  • Colaboração — documentos e quadros partilhados onde as edições sincronizam ao vivo.
  • Jogos multijogador — atualizações de estado de baixa latência em ambos os sentidos.
  • Notificações — tudo o que o utilizador deve ver sem recarregar.

Não são a ferramenta certa para tudo. Se o cliente apenas pergunta e o servidor apenas responde — carregar uma página, submeter um formulário, obter um registo — uma simples API HTTP é mais simples, cacheável e mais fácil de escalar. Recorra a um WebSocket quando for o servidor a ter de iniciar a conversa.

WebSockets vs polling vs SSE

Antes dos WebSockets, o truque habitual para dados «ao vivo» era o polling: o cliente pergunta ao servidor «há algo novo?» de poucos em poucos segundos. Funciona, mas é um desperdício — a maioria dos pedidos volta vazia, e as atualizações continuam atrasadas pelo intervalo de polling. Um WebSocket substitui tudo isso por uma ligação aberta e zero pedidos desperdiçados.

Há também os Server-Sent Events (SSE), que dão um fluxo de sentido único do servidor para o cliente sobre HTTP simples. SSE é mais simples quando só precisa que o servidor envie (um feed de notícias, uma barra de progresso). Escolha um WebSocket quando precisar que as mensagens fluam em ambos os sentidos, e SSE quando um sentido chega.

Uma nota sobre a infraestrutura

Como um WebSocket mantém uma ligação aberta, muda a forma como faz o deploy. As ligações de longa duração precisam de um servidor e de um proxy reverso configurados para as manter vivas em vez de as encerrar por timeout, e escalar muitas ligações simultâneas é um problema de design por si só. É esse o compromisso: um WebSocket dá-lhe comunicação instantânea e bidirecional em troca de manter um estado aberto no servidor.

Em resumo

Um WebSocket é uma ligação única, persistente e bidirecional que permite ao servidor e ao navegador trocar mensagens no momento em que acontecem — sem o ritmo de pedir-e-esperar do HTTP. Começa a vida como um pedido HTTP que é atualizado (upgrade) e depois transporta frames leves em ambos os sentidos. Use wss://, recorra a ele quando o servidor precisar de enviar dados ao vivo, e mantenha-se numa API HTTP normal quando bastar um simples pedido e resposta.