node.jsws permessagedeflate zlib解压和pako的区别?
The difference between node.js ws permessagedeflate zlib decompression and that of pako?
我有一个 node.js 接收压缩数据的 ws websocket。
文档对 inflate 机制的了解非常浅薄,但通过阅读源文件,它显然是内置的,应该根据接收到的数据类型自动激活。
但是,当附加 ws.on('message',function(data){})
事件时 returns 一个 < Buffer >
因为我知道这些流之前已经用 Pako 膨胀,所以我尝试安装它,并且它使用以下代码确实有效:
pako.inflate(data, { to: 'string' })
据我了解,这两个模块都使用 zlib 解压缩,但 ws 模块不知何故遗漏了它。
有人能给出合理的解释或至少给出一个假设吗?
ws
支持的是一个名为 "permessage-deflate".
的特定 WebSocket 扩展
此扩展记录在 RFC 7692 中,因为它是协议的扩展,所以它是底层 WS 协议实现(服务器和客户端)需要支持的东西(涉及握手过程,其中客户端和服务器尝试确定对方是否支持它,发送方设置特定的帧标志以通知接收方该帧已压缩)。
一旦激活,它就相对透明,帧(解)压缩由协议驱动程序自动处理。
在您的情况下,听起来好像在 WebSocket 之上添加了一个明确的 compression/decompression 阶段,其中发送方显式压缩数据(而不是 WS 框架本身)并且接收方需要显式解压缩它,这基本上就是您已经发现的:接收到的消息是一个(压缩的)缓冲区,您需要明确地解压缩它。
所以并不是 ws
遗漏了任何东西,只是(解)压缩发生在原始 WS 帧之上的层中(如果 "permessage- deflate" 扩展将处于活动状态,可能导致数据被压缩和解压缩两次:一次由用户代码,一次由协议代码)。
我有一个 node.js 接收压缩数据的 ws websocket。
文档对 inflate 机制的了解非常浅薄,但通过阅读源文件,它显然是内置的,应该根据接收到的数据类型自动激活。
但是,当附加 ws.on('message',function(data){})
事件时 returns 一个 < Buffer >
因为我知道这些流之前已经用 Pako 膨胀,所以我尝试安装它,并且它使用以下代码确实有效:
pako.inflate(data, { to: 'string' })
据我了解,这两个模块都使用 zlib 解压缩,但 ws 模块不知何故遗漏了它。
有人能给出合理的解释或至少给出一个假设吗?
ws
支持的是一个名为 "permessage-deflate".
此扩展记录在 RFC 7692 中,因为它是协议的扩展,所以它是底层 WS 协议实现(服务器和客户端)需要支持的东西(涉及握手过程,其中客户端和服务器尝试确定对方是否支持它,发送方设置特定的帧标志以通知接收方该帧已压缩)。
一旦激活,它就相对透明,帧(解)压缩由协议驱动程序自动处理。
在您的情况下,听起来好像在 WebSocket 之上添加了一个明确的 compression/decompression 阶段,其中发送方显式压缩数据(而不是 WS 框架本身)并且接收方需要显式解压缩它,这基本上就是您已经发现的:接收到的消息是一个(压缩的)缓冲区,您需要明确地解压缩它。
所以并不是 ws
遗漏了任何东西,只是(解)压缩发生在原始 WS 帧之上的层中(如果 "permessage- deflate" 扩展将处于活动状态,可能导致数据被压缩和解压缩两次:一次由用户代码,一次由协议代码)。