ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
WebSocket - это, по сути, всего лишь набор кадров для данных TEXT или BINARY.
Он сам не выполняет сжатие.
Однако спецификация WebSocket позволяет Расширения, и в дикой природе было множество расширений сжатия (формализованные спецификации для одного из них завершены).
На сегодняшний день (август 2018 года) принятая спецификация сжатия - permessage-deflate
.
Некоторые расширения, замеченные в дикой природе:
permessage-deflate
- имя формализованной спецификации для использования deflate для сжатия целых сообщений , независимо от количества рамок websocket. x-webkit-deflate-frame
- раннее предложенное сжатие, которое сжимает каждый необработанный кадр данных websocket. Видел использование Chrome и Safari. (теперь устарел в Chrome и Safari) perframe-deflate
- переименованная версия вышеуказанного сжатия. Видимо, использование различных реализаций сервера websocket, а также вкратце проявилось в различных клиентах на базе WebKit . (Полностью устарела в современных браузерах, но все еще отображается в различных клиентских библиотеках WebSocket) Следует отметить, что расширение permessage-deflate
является первым в строке PMCE (сжатие для сообщений Расширения), которые в конечном итоге будут включать в себя другие схемы сжатия (обсуждаемые : permessage-bzip2
, permessage-lz4
и permessage-snappy
)
Сбрасывает ли websocket свои JSON перед отправкой в поток?
blockquote>Короткий ответ: иногда, но вы не можете зависеть от него.
Как указано в Joakim Erdfelt, соединения Websocket поддерживают как текстовые, так и двоичные сообщения.
JSON - это всего лишь один из способов переноса данных с преимуществом универсальности и простоты использования (хотя и расточительно, насколько это пространство .
Вы можете легко переносить двоичные данные с помощью API-интерфейса Websocket, устраняя накладные расходы на пропускную способность за счет других проблем (таких как конечность, длина слова, разбор и т. д.).
Многие браузеры также поддерживают сжатие сообщений Websocket в качестве расширения к протоколу Websocket (хотя сервер может не поддерживать расширение).
Расширения обсуждаются с использованием HTTP-заголовка
Sec-WebSocket-Extensions
. Переговоры обычно реализуются клиентом / сервером, не предлагая публичный API для их контроля.До 2015 года в дикой природе существовал ряд подходов и реализаций, но с декабря 2015 года RFC 7692 является единственным реальным соперником для сжатия сообщений, и все гораздо яснее.
RFC 7692 сжимает все сообщение перед тем, как обернуть (и, возможно, фрагментировать) его в «пакеты» Websocket, что упрощает реализацию, чем некоторые предыдущие схемы сжатия.
В текущем проекте предлагается
permessage-foo
схема согласования сжатия (гдеfoo
является запрошенным / поддерживаемым сжатием).Я сам испытал только расширение
permessage-deflate
.Обратите внимание, что переговоры по расширению optional , что означает, что потенциальным сетевым клиентам обычно разрешается согласовывать соединения без сжатия, даже если ваш сервер поддерживает расширение.
Кроме того, RFC 7692 поддерживает выборочное сжатие, то есть некоторые сообщения могут быть сжаты, в то время как другие не сжаты ...
... например,
[123456789,123456789]
может быть отправлено как есть, так как длина указывает, что это вряд ли стоит усилий по сжатию.Поддержка
permessage-deflate
(RFC 7692), 8 августа 2017 года:Это комбинация информации в комментариях, последняя от 8 августа 2017 г.
Если я что-то пропустил, добавьте их здесь и обновите дату.
Известная поддержка браузера
- Chrome с 32
- Mozilla Firefox с 37
- Safari - неподдерживаемый (10.1.2, похоже, использует
x-webkit-deflate-frame
)- Microsoft Edge - неподдерживается с версии 40
Известная поддержка сервера
- Crossbar.io (Autobahn)
- wspy
- Tornado
- Faye на node.js и Ruby
- SwiftWebSocket (только для чтения?)
- WS-RS (Rust)
x-webkit-deflate-frame
, а на стороне сервера Faye поддерживает permessage-defalte
на node.js.
– Myst
8 August 2017 в 08:14
Websockets отправляют сырые байты. Они не знают и не заботятся о том, что представляют эти байты.
Если вы хотите сжать данные, вам нужно сжать их перед отправкой по проводам.
Обратите внимание, что Chrome поддерживает gzip для соединений в сети. (предполагая, что ваш сервер также делает)
permessage-deflate
еще официально не выпущен. FWIW, Chromium имеет (но вам нужно включить вручную), и они «намерены отправить». скоро: groups.google.com/a/chromium.org/forum / #! topic / blink-dev / & hellip; – oberstet 10 October 2013 в 17:05permessage-deflate
является алгоритмомdeflate
, gzip отличается. Если вы делаете это самостоятельно, вне расширения, то обратите внимание, что вы можете использовать только сообщения BINARY (для протокола websocket), поскольку сжатые сообщения TEXT будут нарушать спецификацию rfc-6455 (требуя, чтобы сообщения TEXT были UTF-8) – Joakim Erdfelt 24 August 2015 в 22:43