我在WebSockets中了解并实现了一个渗透扩展扩展的问题。
到目前为止,我已经添加了' Sec-WebSocket-Extensions:permessage-deflate'内部握手代码。它似乎工作得很好。
然而,当我发送" TEST"从服务器(Node.js)到客户端(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
答案 0 :(得分:1)
服务器和客户端都压缩有效载荷数据部分 使用参数基于每个消息的WebSocket数据消息 在开幕式握手期间协商
握手中使用permessage-deflate 标头来指示连接是否应使用压缩。
一旦服务器和客户端都决定使用压缩,他们就必须使用deflate压缩技术来压缩消息。 即,在创建websocket服务器时,您必须使用“perMessageDeflate”选项在服务器上启用压缩。 ws节点模块默认启用此功能。 ws模块负责标头标志,因此您无需隐式设置它。
注意:Deflate使用LZ77和Huffman编码的组合进行压缩 data。 client_max_window_bits ; server_max_window_bits = 10 标头标志用于设置LZ77算法使用的自定义缓冲区/“滑动窗口”,以减少内存开销。