底线:
我没有看到压缩的 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_ENGINE
env 变量设置为ws
或使用engine.io
的wsEngine
选项来执行此操作。
我认为还有一个大小阈值,低于该阈值,消息不会被压缩。如果我没记错的话,它是 1 KiB。
我想我想通了。
在查尔斯代理嗅探器中 - 我找到了在哪里可以看到压缩数据的视图(对于那些想知道的人 - 我查看了 wss 的视图,它分解了 websocket 框架。压缩数据可以在http/https条目上看到,该条目表示websocket握手,并具有"压缩"选项卡(。
我想Chrome开发工具的网络嗅探器只是显示压缩后的数据,因此它是人类可读的。
为了回答我自己的问题,我认为我不需要进一步实现一些东西来压缩数据。