with socket simple nodejs node library javascript websocket compression deflate inflate

javascript - simple - websocket node js express



Implementación de permessage-deflate en WebSockets (1)

Ambos, el servidor y el cliente comprimen la porción de datos de la carga útil de los mensajes de datos de WebSocket por mensaje usando los parámetros negociados durante el saludo de apertura.

El encabezado permessage-deflate se usa en el handshake para indicar si una conexión debería usar compresión.

  1. Cuando un cliente envía una solicitud de websocket, envía un mensaje de desinfección de mensaje en el encabezado de extensiones de websocket SI el navegador del cliente lo admite. El servidor sabe si un cliente admite la compresión en función de este encabezado.
  2. Si el servidor decide usar compresión, responde con el mismo encabezado similar a un mensaje ACK. El cliente después de recibir la respuesta decide si comprime o no los datos en función de la respuesta del servidor.

Una vez que tanto el servidor como el servidor deciden usar compresión, tienen que comprimir el mensaje individualmente utilizando la técnica de compresión desinflada. Es decir, deberá habilitar la compresión en el servidor utilizando la opción "perMessageDeflate" al crear el servidor websocket. el módulo de nodo ws lo habilita de manera predeterminada. El módulo ws se ocupa de los indicadores de encabezado para que no necesite configurarlo implícitamente.

Nota: Deflate usa una combinación de codificación LZ77 y Huffman para comprimir datos. Client_max_window_bits ; server_max_window_bits = 10 banderas de encabezado se utilizan para establecer un búfer personalizado / ''ventana deslizante'' utilizado por el algoritmo LZ77 para disminuir la sobrecarga de memoria.

Tengo un problema para comprender e implementar una extensión de desinflado permessage en WebSockets.

Hasta ahora, he agregado ''Sec-WebSocket-Extensions: permessage-deflate'' dentro del código de handshake. Parece que funciona todo bien.

Sin embargo, cuando envío un mensaje de "PRUEBA" desde el servidor (Node.js) al Cliente (JS), parece que el navegador (tanto Chrome como Firefox) no está descomprimiendo los datos en sí.

¿Cómo implementar adecuadamente la compresión y descompresión de datos usando la extensión permessage-deflate?

Encabezado de solicitud:

GET ws://localhost/ HTTP/1.1 Host: localhost Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Origin: null Sec-WebSocket-Version: 13 User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4 Sec-WebSocket-Key: X3RofjiYbzVR8zUPI5ZI6w== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Sec-WebSocket-Protocol: Exodus_101

Encabezado de respuesta:

HTTP/1.1 101 Web Socket Protocol Handshake Upgrade: WebSocket Connection: Upgrade sec-websocket-accept: sFO1Id30BZe63QWcm894hnnb+Pg= Sec-WebSocket-Protocol: Exodus_101 Sec-WebSocket-Extensions: permessage-deflate