我在WebSockets中理解和实现permessage-deflate扩展有一个问题。
到目前为止,我已经在握手代码中添加了'Sec-WebSocket-Extensions: permessage-deflate'。似乎一切正常。然而,当我从服务器(Node.js)发送"TEST"消息到客户端(JS)时,似乎浏览器(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数据消息在开始握手时协商
permessage-deflate报头用于在握手中指示是否应该使用压缩。
- 当客户端发送websocket请求时,如果客户端浏览器支持,它会在websocket扩展头中发送permessage-deflate。服务器根据这个报头知道客户端是否支持压缩。
- 如果服务器决定使用压缩,它用与ACK消息相似的相同报头响应。客户端在收到响应后,根据服务器的响应决定是否压缩数据。
一旦服务器和客户端决定使用压缩,它们必须分别使用deflate压缩技术压缩消息。也就是说,在创建websocket服务器时,你必须通过使用"perMessageDeflate"选项在服务器上启用压缩。ws节点模块默认启用此功能。ws模块负责处理标头标志,因此您不需要隐式地设置它。
注意:Deflate使用LZ77和Huffman编码的组合来压缩数据。 client_max_window_bits ;server_max_window_bits=10报头标志用于设置LZ77算法使用的自定义缓冲区/"滑动窗口",以减少内存开销。