在WebSockets中实现permessage-deflate

时间:2015-05-20 11:28:51

标签: javascript websocket compression deflate inflate

我在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

1 个答案:

答案 0 :(得分:1)

服务器和客户端都压缩有效载荷数据部分    使用参数基于每个消息的WebSocket数据消息    在开幕式握手期间协商

握手中使用

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

  1. 当客户端发送websocket请求时,如果客户端浏览器支持,它会在websocket扩展标头中发送 permessage-deflate 。服务器知道客户端是否支持基于此标头的压缩。
  2. 如果服务器决定使用压缩,它将使用与ACK消息类似的相同标头进行响应。收到响应后,客户端根据服务器的响应决定是否压缩数据。
  3. 一旦服务器和客户端都决定使用压缩,他们就必须使用deflate压缩技术来压缩消息。 即,在创建websocket服务器时,您必须使用“perMessageDeflate”选项在服务器上启用压缩。 ws节点模块默认启用此功能。 ws模块负责标头标志,因此您无需隐式设置它。

      

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