WebSocket: entenda como essa ponte de dados funciona

Introdução Se você já desenvolveu aplicações que precisam se comunicar em tempo real como chats, jogos online ou sistemas de notificação, provavelmente já ouviu falar do WebSocket. Mas você realmente entende o que é esse protocolo e o que acontece "por baixo dos panos" quando uma conexão WebSocket é estabelecida? Esse post pretende explicar os conceitos: Definição de protocolo Definição do WebSocket e relação com HTTP WebSocket handshake Web Socket Frames Entendendo conceitos primordiais Antes de partir para explicação sobre o protocolo Web Socket, é essencial termos um entendimento sólido sobre o que é um protocolo afinal. Um protocolo pode ser entendido como um conjunto de regras que ditam como as informações transmitidas em uma conexão são formatadas, transportadas, recebidas e interpretadas entre os dispositivos de uma rede. Ou seja, é o que permite que sua aplicação desenvolvida com Java, possa se comunicar com uma API desenvolvida com Python por exemplo, independente da linguagem de programação usada para construir o programa, o protocolo é a linguagem comum que torna possível essa comunicação. Como essa comunicação acontece? Como dito anteriormente, o protocolo dita como uma comunicação vai ser formatada para ser enviada pela rede de uma API para outra, logo naturalmente é necessário que ambos os lados dessa comunicação estejam seguindo o mesmo protocolo. Talvez você se pergunte, "como assim o dado precisa ser formatado antes de ser enviado?", isso acontece pois quando se trata de rede, resumindo para facilitar a compreensão, os dados transportados na rede são dados em linguagem de máquina, o velho 0 e 1. Então se você quer enviar a string "Hello world", antes ela é transformada em código binário, e ai sim, esse valor binário é o valor que vai ser transmitido na rede. Cada protocolo tem suas próprias regras para fazer essa "tradução", então essa mesma string, ao ser formatada por diferentes protocolos, se tornará um código binário diferente. Por isso a comunicação só vai funcionar se ambos os lados da conexão usarem o mesmo protocolo, além é claro de outros detalhes de segurança. Entendendo o WebSocket O WebSocket é um protocolo que permite uma conexão contínua, persistente e bidirecional entre aparelhos, ou seja, é o protocolo que torna possível uma comunicação de via dupla entre o client e o server através de uma mesma conexão. Então enquanto com HTTPS estamos acostumados com esse fluxo: Nesse protocolo uma conexão é iniciada com uma requisição e assim que o server envia a response, ela é encerrada. Com o WebSocket, o negócio é diferente: Vamos nos aprofundar nessa solicitação, aceitação de conexão e no conceito dos frames mais para frente, mas nesse momento, o que quero destacar é que uma vez feita a conexão, o client consegue enviar e receber várias mensagens do servidor, dentro da mesma conexão. Uma outra forma de visualizar a diferença do fluxo de comunicação nesses protocolos, é entender uma conexão como uma ponte: Enquanto no HTTPS essa ponte suporta apenas uma comunicação feita em uma direção por vez, com o WebSocket, varias mensagens, como carros, podem passar por essa ponte em diferentes direções ao mesmo tempo. Como iniciar uma conexão com o WebSocket WebSocket handshake Embora o websocket e o http sejam protocolos distintos, precisamos utilizar o protocolo http para conseguir iniciar uma conexão websocket. Vamos entender isso melhor voltando para aquele diagrama que apresentei inicialmente: Começamos com o Client handshake request, que é quando o client faz uma request GET HTTP com um header que solicita um upgrade para o protocolo WebSocket. Essa requisição vai ser basicamente assim: GET /chat HTTP/1.1 Host: example.com:8000 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 Agora o que acontece é o Server handshake response que é uma response especial que indica se o server aceita ou não a mudança do protocolo atual (HTTP) para o protocolo WebSocket: HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Em caso de aprovação e sucesso dessa mudança de protocolo, a resposta do servidor sempre será uma resposta de status 101, qualquer outro status será entendido pelo client como um erro nesse handshake. Então até o momento, ainda estamos utilizando o protocolo http, uma vez que esse processo de handshake é finalizado com sucesso, ai sim é realizado a troca de protocolo. WebFrames Agora que entendemos como essa conexão é iniciada, vamos analisar como a comunicação nela acontece. Enquanto o HTTP como já sabemos é uma comunicação feita através de responses e requests, o WebSocket utiliza frames para se comunicar, esses frames são unidades de informação, uma estrutura de dados que consiste basicamente em um header e um payload. Existem vários tipos de F

Jun 9, 2025 - 22:10
 0
WebSocket: entenda como essa ponte de dados funciona

Introdução

Se você já desenvolveu aplicações que precisam se comunicar em tempo real como chats, jogos online ou sistemas de notificação, provavelmente já ouviu falar do WebSocket. Mas você realmente entende o que é esse protocolo e o que acontece "por baixo dos panos" quando uma conexão WebSocket é estabelecida?
Esse post pretende explicar os conceitos:

  • Definição de protocolo
  • Definição do WebSocket e relação com HTTP
  • WebSocket handshake
  • Web Socket Frames

Entendendo conceitos primordiais

Antes de partir para explicação sobre o protocolo Web Socket, é essencial termos um entendimento sólido sobre o que é um protocolo afinal.
Um protocolo pode ser entendido como um conjunto de regras que ditam como as informações transmitidas em uma conexão são formatadas, transportadas, recebidas e interpretadas entre os dispositivos de uma rede. Ou seja, é o que permite que sua aplicação desenvolvida com Java, possa se comunicar com uma API desenvolvida com Python por exemplo, independente da linguagem de programação usada para construir o programa, o protocolo é a linguagem comum que torna possível essa comunicação.

Como essa comunicação acontece?

Como dito anteriormente, o protocolo dita como uma comunicação vai ser formatada para ser enviada pela rede de uma API para outra, logo naturalmente é necessário que ambos os lados dessa comunicação estejam seguindo o mesmo protocolo.
Talvez você se pergunte, "como assim o dado precisa ser formatado antes de ser enviado?", isso acontece pois quando se trata de rede, resumindo para facilitar a compreensão, os dados transportados na rede são dados em linguagem de máquina, o velho 0 e 1.
Então se você quer enviar a string "Hello world", antes ela é transformada em código binário, e ai sim, esse valor binário é o valor que vai ser transmitido na rede.
Cada protocolo tem suas próprias regras para fazer essa "tradução", então essa mesma string, ao ser formatada por diferentes protocolos, se tornará um código binário diferente. Por isso a comunicação só vai funcionar se ambos os lados da conexão usarem o mesmo protocolo, além é claro de outros detalhes de segurança.

Entendendo o WebSocket

O WebSocket é um protocolo que permite uma conexão contínua, persistente e bidirecional entre aparelhos, ou seja, é o protocolo que torna possível uma comunicação de via dupla entre o client e o server através de uma mesma conexão.
Então enquanto com HTTPS estamos acostumados com esse fluxo:

Diagrama sobre fluxo do protocolo HTTPS

Nesse protocolo uma conexão é iniciada com uma requisição e assim que o server envia a response, ela é encerrada.
Com o WebSocket, o negócio é diferente:

Diagrama sobre fluxo do protocolo HTTPS

Vamos nos aprofundar nessa solicitação, aceitação de conexão e no conceito dos frames mais para frente, mas nesse momento, o que quero destacar é que uma vez feita a conexão, o client consegue enviar e receber várias mensagens do servidor, dentro da mesma conexão.
Uma outra forma de visualizar a diferença do fluxo de comunicação nesses protocolos, é entender uma conexão como uma ponte:

Desenho ilustrativo da diferença entre os protocolos HTTPS e WebSocket

Enquanto no HTTPS essa ponte suporta apenas uma comunicação feita em uma direção por vez, com o WebSocket, varias mensagens, como carros, podem passar por essa ponte em diferentes direções ao mesmo tempo.

Como iniciar uma conexão com o WebSocket

WebSocket handshake

Embora o websocket e o http sejam protocolos distintos, precisamos utilizar o protocolo http para conseguir iniciar uma conexão websocket.
Vamos entender isso melhor voltando para aquele diagrama que apresentei inicialmente:

Trecho do diagrama do protocolo websocket
Começamos com o Client handshake request, que é quando o client faz uma request GET HTTP com um header que solicita um upgrade para o protocolo WebSocket. Essa requisição vai ser basicamente assim:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

Agora o que acontece é o Server handshake response que é uma response especial que indica se o server aceita ou não a mudança do protocolo atual (HTTP) para o protocolo WebSocket:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Em caso de aprovação e sucesso dessa mudança de protocolo, a resposta do servidor sempre será uma resposta de status 101, qualquer outro status será entendido pelo client como um erro nesse handshake.
Então até o momento, ainda estamos utilizando o protocolo http, uma vez que esse processo de handshake é finalizado com sucesso, ai sim é realizado a troca de protocolo.

Ilustração de um handshake de sucesso

WebFrames

Agora que entendemos como essa conexão é iniciada, vamos analisar como a comunicação nela acontece. Enquanto o HTTP como já sabemos é uma comunicação feita através de responses e requests, o WebSocket utiliza frames para se comunicar, esses frames são unidades de informação, uma estrutura de dados que consiste basicamente em um header e um payload. Existem vários tipos de Frames que podem ser classificados como:

  • Control Frames: Frames que comunicam o estado sobre o WebSocket, é divido em vários tipos como close frame que é usado para encerrar uma conexão, os pings e closing handshake.
  • Data Frames: Frames que carregam os dados da comunicação. Os Data Frames podem ser fragmentados, ou seja, 1 informação pode ser divida em vários frames para ser transportada. Esses data frames também possuem seus tipos.

Vamos observar a estrutura básica de um frame, disponibilizado pelo Datatracker:

Exemplo de frame básico

Vamos analisar as partes fundamentais dessa estrutura:

  • FIN: O primeiro bit do byte, este informa se o frame é o último fragmento ou não daquela informação. Se for 1 é o fragmento final, se for 0 significa que existem mais fragmentos para serem recebidos para que a mensagem seja considerada completa.
  • OPCODE: Composto pelos últimos 4 bits do primeiro byte. Esses 4 bits definem o tipo de frame.

Tipos de Data Frame

Quando falamos de Data Frames, eles são divididos em diferentes tipos e como mostrado anteriormente, esse tipo é determinado no OPCODE. Por exemplo:

  • 0001 = Informa que é um text frame, que contém um text data codificado em UTF-8.
  • 0010 = Informa que é um binary frame, ou seja, contém conteúdo binário.

Conclusão

O protocolo Web Socket permite uma conexão de duas direções e persistente, tornando possível um melhor desempenho em aplicações que exigem uma troca de dados em tempo real como por exemplo um aplicativo de chat.
Embora na prática, ao implementar esse protocolo em projetos, é comum comum utilizar bibliotecas que facilitam esse processo pro desenvolvedor como por exemplo o Socket.IO em aplicações com Javascript, é fundamental termos conhecimento de como esses processos funcionam.
Um exemplo desse protocolo funcionando na prática, desenvolvido com React e NodeJs, pode ser conferido no GitHub.

Leituras que auxiliaram essa publicação: