在 WebSockets 中实现 permessage-deflate

use*_*657 3 javascript compression deflate websocket inflate

我在理解和实现 WebSockets 中的 permessage-deflate 扩展时遇到了问题。

到目前为止,我已经在握手代码中添加了“Sec-WebSocket-Extensions: permessage-deflate”。似乎一切正常。

但是,当我从服务器 (Node.js) 向客户端 (JS) 发送“TEST”消息时,似乎浏览器(Chrome 和 Firefox)并未解压缩数据本身。

如何使用 permessage-deflate 扩展正确实现数据压缩和解压缩?

请求头:

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
Run Code Online (Sandbox Code Playgroud)

响应头:

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
Run Code Online (Sandbox Code Playgroud)

Kau*_*hal 5

服务器和客户端都使用在打开握手期间协商的参数,在每条消息的基础上压缩 WebSocket 数据消息的有效载荷数据部分

在握手中使用permessage-deflate标头来指示连接是否应使用压缩。

  1. 当客户端发送 websocket 请求时,它会发送permessage-deflate 如果客户端浏览器支持它在 websocket 扩展标头中。服务器知道客户端是否支持基于此标头的压缩。
  2. 如果服务器决定使用压缩,它会使用与 ACK 消息类似的相同标头进行响应。客户端收到响应后,根据服务器的响应决定是否对数据进行压缩。

一旦服务器和客户端都决定使用压缩,他们就必须分别使用 deflate 压缩技术来压缩消息。即您必须在创建 websocket 服务器时使用“perMessageDeflate”选项在服务器上启用压缩。的WS节点模块默认启用此。ws 模块负责处理标头标志,因此您无需隐式设置它。

注意:Deflate 使用 LZ77 和 Huffman 编码的组合来压缩数据。client_max_window_bitsserver_max_window_bits=10标头标志用于设置 LZ77 算法使用的自定义缓冲区/“滑动窗口”以减少内存开销。