node.js ws permessagedeflate zlib解压缩和pako之间的区别?

时间:2017-06-03 00:18:06

标签: node.js websocket zlib pako permessagedeflate

我有一个node.js ws websocket接收压缩数据。

文档对于膨胀机制非常浅薄,但从阅读源文件来看,它显然是内置的,应该根据接收数据的类型自动激活。

但是,在附加ws.on('message',function(data){})事件时,它会返回< Buffer >

由于我知道这些流之前已经用Pako充气,我试图安装它,它实际上使用以下代码:

pako.inflate(data, { to: 'string' })

根据我的理解,两个模块都使用zlib解压缩,但是ws模块以某种方式错过了它。

有人可以给出合理的解释或者至少有一个假设吗?

1 个答案:

答案 0 :(得分:2)

ws支持的是一个名为“permessage-deflate”的特定WebSocket扩展。

此扩展记录在RFC 7692中,因为它是协议的扩展,它是底层WS协议实现(服务器和客户端)需要支持的东西(涉及客户端和服务器尝试确定对方是否支持它,并且发送方设置特定的帧标志以通知接收方该帧已被压缩。)

一旦激活,它就相对透明,并且协议驱动程序会自动处理帧(de)压缩。

在你的情况下,听起来在WebSocket上添加了一个显式的压缩/解压缩阶段,其中发送者显式压缩数据(而不是WS帧本身),接收者需要明确地解压缩它,这基本上是什么你已经发现:收到的消息是(压缩的)缓冲区,你需要明确地解压缩它。

所以ws并没有错过任何东西,只是在原始WS帧之上的层中发生(de)压缩(如果“permessage-deflate”扩展将处于活动状态,可能导致数据被压缩和解压缩两次:一次是用户代码,一次是协议代码。)