El protocolo WebSocket (definido en el estándar RFC 6455) comienza como una conexión HTTP y luego se transforma en un canal persistente y bidireccional.
Este proceso de transformación se llama handshake (apretón de manos):
El cliente (por ejemplo, un navegador usando la API WebSocket) abre una conexión:
const ws = new WebSocket("ws://localhost:8080/chat");
Esto genera una petición HTTP estándar, pero con cabeceras especiales:
GET /chat HTTP/1.1
Host: localhost:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: http://localhost:3000
Campos importantes:
Si el servidor acepta, responde:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Campos importantes:
El servidor toma la clave del cliente (Sec-WebSocket-Key
) y calcula:
Sec-WebSocket-Accept = Base64( SHA-1( Sec-WebSocket-Key + GUID ) )
Donde la GUID es la cadena fija 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
. Conceptos relacionados: SHA‑1, Base64.
Ejemplo:
Sec-WebSocket-Key = dGhlIHNhbXBsZSBub25jZQ==
Concatenar GUID → dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
SHA-1 (hash binario)
Base64 → s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
El servidor devuelve este valor en Sec-WebSocket-Accept
. Esto garantiza que el servidor entiende el protocolo WebSocket.
101 Switching Protocols
y validada la cabecera, el protocolo cambia oficialmente a WebSocket.const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8080 }, () => {
console.log("Servidor WebSocket en ws://localhost:8080");
});
wss.on("connection", (ws) => {
console.log("Cliente conectado (handshake exitoso)");
ws.send("Conexión establecida!");
});
<script>
const ws = new WebSocket("ws://localhost:8080");
ws.onopen = () => console.log("Handshake completado");
ws.onmessage = (e) => console.log("Servidor:", e.data);
</script>
Para este ejemplo se usa Node.js y la librería ws.
ws://localhost:8080
).Verás algo como:
Request
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JtP3zBxGJdd+2ZsHGyVQ==
Sec-WebSocket-Version: 13
Response
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: Z6Fx0DdFfCzD4V4Zf2oV1OxT9fQ=
Ejemplo de cliente seguro:
const ws = new WebSocket("wss://mi-servidor.com/socket");
En producción, usa siempre wss:// para proteger los datos y evitar ataques de intermediarios (man‑in‑the‑middle).
Upgrade: websocket
.101 Switching Protocols
y una clave validada (Sec-WebSocket-Accept
).