我在理解和实现 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
响应头:
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
服务器和客户端都压缩有效负载数据部分
使用参数基于每条消息的 WebSocket 数据消息
在开幕握手期间协商
许可放气握手中使用标头来指示连接是否应使用压缩。
- 当客户端发送 websocket 请求时,它会发送许可放气如果客户端浏览器支持,则在 websocket 扩展标头中。服务器根据此标头知道客户端是否支持压缩。
- 如果服务器决定使用压缩,它会使用类似于 ACK 消息的相同标头进行响应。客户端收到响应后根据服务器的响应决定是否压缩数据。
一旦服务器和客户端都决定使用压缩,它们就必须分别使用 deflate 压缩技术来压缩消息。
即您必须使用以下命令在服务器上启用压缩“每条消息放气”创建 websocket 服务器时的选项。这ws https://github.com/websockets/ws节点模块默认启用此功能。 ws 模块负责处理标头标志,因此您无需隐式设置它。
注:Deflate使用LZ77和Huffman编码的组合来压缩
数据.The客户端最大窗口位; server_max_window_bits=10标头标志用于设置 LZ77 算法使用的自定义缓冲区/“滑动窗口”,以减少内存开销。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)