Разница между node.js и permessagedeflate декомпрессией zlib и пако?

У меня есть node.js ws websocket, который получает сжатые данные.

Документы очень мелкие о механизме надувания, но при чтении через исходные файлы он явно встроен и должен активироваться автоматически в зависимости от типа полученных данных.

Однако при прикреплении ws.on('message',function(data){}) событие возвращает < Buffer >

Так как я знал, что эти потоки были ранее раздуты с помощью Pako, я попытался установить его, и он фактически работал с использованием следующего кода:

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

Из того, что я понимаю, оба модуля используют распаковку zlib, но модуль ws почему-то пропускает это.

Может ли кто-нибудь дать разумное объяснение или хотя бы гипотезу почему?

1 ответ

Решение

Какие ws Поддерживается конкретное расширение WebSocket, называемое "permessage-deflate".

Это расширение задокументировано в RFC 7692, и поскольку оно является расширением протокола, это то, что должна поддерживать базовая реализация протокола WS (сервер и клиент) (существует процедура рукопожатия, при которой клиент и сервер пытаются определить, является ли другая сторона поддерживает это, и отправитель устанавливает определенный флаг кадра, чтобы уведомить получателя о том, что кадр был сжат).

После активации он становится относительно прозрачным, а сжатие кадра (де) обрабатывается драйвером протокола.

В вашем случае это звучит так, как будто в WebSocket добавлен явный этап сжатия / декомпрессии, когда отправитель явно сжимает данные (не сам кадр WS), а получатель должен явно распаковать их, что, по сути, уже есть выяснил: полученное сообщение является (сжатым) буфером, и вам необходимо явно распаковать его.

Так что это не так ws ничего не пропустил, просто (de) сжатие происходит в слое над необработанными кадрами WS (что, если расширение "permessage-deflate" будет активным, может привести к сжатию и распаковке данных дважды: один раз по коду пользователя, один раз по коду протокола).

Другие вопросы по тегам