JSON.stringify, очевидно, не очень эффективен в пространстве. Например, [123456789,123456789] занимают 20+ байтов, когда ему может понадобиться около 5. Сетью websocket сжимает свои JSON перед отправкой в поток?
Как WebSocket сжимает сообщения?
Ответ 1
WebSocket - это, по сути, всего лишь набор кадров для данных TEXT или BINARY.
Он не выполняет сжатие самостоятельно.
Однако спецификация WebSocket допускает расширения, и в дикой природе существует множество расширений сжатия (формализованные спецификации для них все еще завершаются).
Любое такое сжатие, которое вы видите в дикой природе на сегодняшний день (10 октября 2013 г.), должно рассматриваться как экспериментальный неконфиденциальный вариант версии этой функциональности и может быть изменен до тех пор, пока спецификация не будет завершена.
Некоторые расширения, встречающиеся в дикой природе:
-
x-webkit-deflate-frame
- раннее предложенное сжатие, которое сжимает каждый необработанный кадр данных websocket. Видел использование Chrome и Safari. -
perframe-deflate
- переименованная версия вышеуказанного сжатия. Видимо, использование различных реализаций сервера websocket, а также вкратце проявилось в различных клиентах на основе WebKit. -
permessage-deflate
- имя формализованной спецификации для использования deflate для сжатия целых сообщений независимо от количества рамок websocket.
Следует отметить, что расширение permessage-deflate
является первым в строке PMCE (Percom Message Extensions Extensions), которое в конечном итоге включает в себя другие схемы сжатия (обсуждаемые permessage-bzip2
, permessage-lz4
и permessage-snappy
)
Ответ 2
Сбрасывает ли websocket свои JSON перед отправкой в поток?
Короткий ответ: иногда, но вы не можете зависеть от него.
Как было указано Joakim Erdfelt, соединения Websocket поддерживают как текстовые, так и двоичные сообщения.
JSON - это всего лишь один из способов переноса данных, с преимуществом универсальности и простоты использования (хотя и расточительно, насколько это касается пространства).
Вы можете легко передавать двоичные данные с помощью API-интерфейсов Websocket, устраняя накладные расходы на пропускную способность за счет других проблем (таких как конечность, длина слова, разбор и т.д.).
Многие браузеры также поддерживают сжатие сообщений Websocket в качестве расширения для протокола Websocket (хотя сервер может не поддерживать расширение).
Расширения обсуждаются с использованием заголовка Sec-WebSocket-Extensions
HTTP. Переговоры обычно выполняются клиентом/сервером, не предлагая публичный API для их контроля.
До 2015 года существовал ряд подходов и реализаций в дикой природе, но с декабря 2015 года. RFC 7692 - единственный реальный соперник для сжатия сообщений и многое другое.
RFC 7692 сжимает все сообщение перед тем, как обернуть (и, возможно, фрагментировать) его в "пакеты" Websocket, что упрощает реализацию, чем некоторые предыдущие схемы сжатия.
В текущем проекте предлагается схема согласования сжатия permessage-foo
(где foo
- запрошенное/поддерживаемое сжатие).
Я испытал только расширение permessage-deflate
.
Обратите внимание, что переговоры по расширению являются необязательными, что означает, что потенциальным сетевым клиентам обычно разрешается согласовывать соединения без сжатия, даже если ваш сервер поддерживает расширение.
Кроме того, 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 on node.js и Ruby
- SwiftWebSocket (только для чтения?)
- WS-RS (Rust)
Ответ 3
Websockets отправляют необработанные байты.
Они не знают и не заботятся о том, что представляют собой эти байты.
Если вы хотите сжать данные, вам нужно сжать их перед отправкой по проводам.
Обратите внимание, что Chrome поддерживает gzip для соединений с веб-сайтами. (при условии, что ваш сервер также работает)