添加消息压缩响应标头后,websocket 帧是否会自动压缩?



底线:

我没有看到压缩的 websocket 消息,即使请求和响应上都存在 permessage-deflate 标头。

一些细节:

我有一个nodejs服务器,我使用Primus(下面有 engine.io(。 我使用Primus的"压缩"功能,以支持permessage-delate。

打开它后,我开始在响应上看到 permessage-deflate 标头。

但是我没有看到 websocket 框架本身被压缩。

我使用查尔斯代理嗅探流量,再次 - 帧看起来与我打开"压缩"功能之前相同。

插图:

下面是来自 websocket 握手的示例请求:

Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8,he;q=0.6,fr;q=0.4
Cache-Control:no-cache
Connection:Upgrade
Cookie:[some cookies]
Host:[our host]
Origin:https://[our host]
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:6nMxnGd0E8GrDg2s1B4tHQ==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36

这是相应的响应:

Connection:upgrade
Date:Tue, 11 Jul 2017 14:10:18 GMT
Sec-WebSocket-Accept:lLjOXWbLRVIHw2inxrhx0U1ryrM=
Sec-WebSocket-Extensions:permessage-deflate; client_no_context_takeover
Sec-WebSocket-Version:13
Server:nginx
Upgrade:websocket
WebSocket-Server:uWebSockets

这些示例取自 Chrome 开发工具网络检查器。 我在查尔斯代理嗅探器中看到类似的东西。

其他参考资料:

我看到了这个:

在 WebSockets 中实现 permessage-deflate

但我在那里找不到一个有效的答案。

所以。。。

我在这里错过了什么? 我是否需要实现更多内容? 我需要包含任何库吗?

版本:

  • 节点 - 4.2.4
  • 普利姆斯 - 7.0.2
  • 铬: 59.0.3071.115
  • FF:54.0.1
  • 查尔斯:4.1.4

非常感谢!

问题是uws即使被指示这样做也不会压缩数据。

请参阅此问题 https://github.com/socketio/engine.io/issues/474

如果您告诉engine.io使用ws而不是uws,它应该有效。您可以通过将EIO_WS_ENGINEenv 变量设置为ws或使用engine.iowsEngine选项来执行此操作。

我认为还有一个大小阈值,低于该阈值,消息不会被压缩。如果我没记错的话,它是 1 KiB。

我想我想通了。

在查尔斯代理嗅探器中 - 我找到了在哪里可以看到压缩数据的视图(对于那些想知道的人 - 我查看了 wss 的视图,它分解了 websocket 框架。压缩数据可以在http/https条目上看到,该条目表示websocket握手,并具有"压缩"选项卡(。

我想Chrome开发工具的网络嗅探器只是显示压缩后的数据,因此它是人类可读的。

为了回答我自己的问题,我认为我不需要进一步实现一些东西来压缩数据。

最新更新