O protocolo WebSocket é um mecanismo de comunicação bidirecional full-duplex que opera sobre uma única conexão TCP. Foi padronizado pela IETF como RFC 6455 em 2011, com posterior refinamento no RFC 7936. A API correspondente foi estabelecida pelo W3C como padrão web.
Apesar de operar sobre TCP, o WebSocket mantém relação mínima com o HTTP, utilizando apenas o código de status 101 para realizar a troca de protocolos. Utiliza a porta TCP 80, facilitando sua passagem através de firewalls convencionais.
A principal vantagem do WebSocket reside na capacidade do servidor enviar dados ao cliente sem necessidade de requisições explícitas. Após o handshake inicial entre navegador e servidor, estabelece-se uma conexão persistente que permite transferência bidirecional de informações.
Os principais navegadores modernos incluindo Chrome, Internet Explorer, Firefox, Safari e Opera oferecem suporte nativo ao WebSocket, sendo necessário também implementação adequada no lado do servidor.
Contexto Histórico
Antes da padronização do WebSocket, aplicações web utilizavam técnicas como polling periódico, onde o cliente consultava o servidor em intervalos regulares via requisições HTTP. Este método apresanta ineficiências significativas, pois mesmo pequenas atualizações exigem cabeçalhos HTTP extensos, consumindo largura de banda e recursos do servidor.
Técnicas mais avançadas como Comet, baseadas em AJAX, permitiram comunicação bidirecional mas ainda dependiam de requisições individuais. Mesmo com conexões longas, o consumo de recursos permanecia elevado.
O WebSocket surgiu como solução eficiente para comunicação em tempo real, reduzindo significativamente o overhead de rede e processamento no servidor.
Vantagens Técnicas
Redução de Cabeçalho
O tamanho dos pacotes trocados entre cliente e servidor é minimizado, com cabeçalhos de aproximadamente 2 bytes nas versões iniciais do protocolo.
Push Server
O servidor pode enviar dados espontaneamente ao cliente, eliminando a necessidade de polling constante.
Processo de Handshake
O estabelecimento de uma conexão WebSocket requer um procedimento de negociação entre cliente e servidor, conhecido como handshake. As versões posteriores mantiveram compatibilidade com os mecanismos básicos definidos inicialmente.
Exemplo Prático
Exemplo utilizando a versão 13 do protocolo com navegador Chrome:
Solicitação do cliente:
GET /chat HTTP/1.1
Host: servidor.exemplo.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://exemplo.com
Sec-WebSocket-Version: 13
Resposta do servidor:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Mecanismo de Validação
O valor do campo Sec-WebSocket-Key é gerado aleatoriamente pelo cliente. O servidor concatena esta chave com a string mágica "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", aplica hash SHA-1 e codifica o resultado em Base64 para formar o valor de Sec-WebSocket-Accept.
Suporte nos Navegadores
A implementação do protocolo WebSocket nos navegadores é fundamental para seu funcionamento. Todos os navegadores modernos suportam a especificação atual (RFC 6455). A tabela abaixo apresenta o histórico de suporte por diferentes versões:
| Protocolo | Data | IE | Firefox PC | Firefox Mobile | Chrome | Safari | Opera | Android |
|---|---|---|---|---|---|---|---|---|
| hixie-75 | 2010-02-04 | 4 | 5.0.0 | |||||
| hixie-76/hybi-00 | 2010-05-10/23 | 4.0 (desativado) | 6 | 5.0.1 | 11.00 (desativado) | |||
| hybi-07 | 2011-04-22 | 61 | ||||||
| hybi-10 | 2011-07-11 | 71 | 7 | 14 | ||||
| RFC 6455 | 2011-12 | 10 | 11 | 11 | 16 | 6 | 12.10 | 4.4 |
1Nos navegadores baseados em Gecko versões 6-10, o objeto WebSocket era denominado "mozwebsocket", requerendo adaptações no código.
Implementações Servidor
Diversas plataformas e frameworks oferecem suporte à implementação de servidores WebSocket:
- PHP - phpwebsocket
- Java - Jetty (versão 7+), Netty, Tomcat (7.0.27+)
- Ruby - web-socket-ruby
- Node.js - WebSocket-Node, socket.io
- Python - gevent-socketio, django-socketio
- Erlang - Cowboy
- Perl - Mojolicious
- Proxy Reverso - Nginx
- Aplicação Corporativa - Oracle WebLogic (12.1.2+)