Автоматически сжимаются ли сетевые ящики? [Дубликат]

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
15
задан Joakim Erdfelt 24 October 2013 в 16:38
поделиться

3 ответа

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)

27
ответ дан Joakim Erdfelt 21 August 2018 в 16:43
поделиться
  • 1
    Как упоминает Йоаким, permessage-deflate еще официально не выпущен. FWIW, Chromium имеет (но вам нужно включить вручную), и они «намерены отправить». скоро: groups.google.com/a/chromium.org/forum / #! topic / blink-dev / & hellip; – oberstet 10 October 2013 в 17:05
  • 2
    Спасибо @Joakim Erdfelt, но имеет ли разрешение-дефляция использование gzip? Я пытаюсь сжать данные gzip через трубу websocket. – NiCk Newman 23 August 2015 в 03:58
  • 3
    @NiCkNewman расширение permessage-deflate является алгоритмом deflate, gzip отличается. Если вы делаете это самостоятельно, вне расширения, то обратите внимание, что вы можете использовать только сообщения BINARY (для протокола websocket), поскольку сжатые сообщения TEXT будут нарушать спецификацию rfc-6455 (требуя, чтобы сообщения TEXT были UTF-8) – Joakim Erdfelt 24 August 2015 в 22:43
  • 4
    Можете ли вы обновить свой ответ в соответствии с обновлениями сегодняшнего дня (я имею в виду конец 2016 года) – Ravinder Payal 3 August 2016 в 16:08

Сбрасывает ли websocket свои JSON перед отправкой в ​​поток?

Короткий ответ: иногда, но вы не можете зависеть от него.

Как указано в 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

Известная поддержка сервера

9
ответ дан John Zwinck 21 August 2018 в 16:43
поделиться
  • 1
    Похоже, что с помощью Google Chrome 32 и Mozilla Firefox 37 поддерживается разрешение-дефляция. Я не вижу никаких доказательств того, что Microsoft Edge поддерживает его с августа 2017 года (Edge 40). На стороне сервера Python, похоже, только Crossbar.io (Autobahn), wspy и Tornado поддерживают его по состоянию на август 2017 года. – John Zwinck 8 August 2017 в 08:08
  • 2
    @JohnZwinck - чтобы добавить к текущему состоянию дел, Safari использует x-webkit-deflate-frame, а на стороне сервера Faye поддерживает permessage-defalte на node.js. – Myst 8 August 2017 в 08:14
  • 3
    @JohnZwinck Я добавил информацию в ответ таким образом, чтобы ее можно было легко обновить будущими редакторами. – Myst 8 August 2017 в 08:26
  • 4
    Комментарители: не беспокойтесь об обновлении информации в исходном посте. Это часть того, что StackOverflow для :) – acjay 6 April 2018 в 13:08

Websockets отправляют сырые байты. Они не знают и не заботятся о том, что представляют эти байты.

Если вы хотите сжать данные, вам нужно сжать их перед отправкой по проводам.

Обратите внимание, что Chrome поддерживает gzip для соединений в сети. (предполагая, что ваш сервер также делает)

-4
ответ дан SLaks 21 August 2018 в 16:43
поделиться
  • 1
    Gzip сжимает числовые строки, подобные этим (я думаю, нет)? – MaiaVictor 10 October 2013 в 15:35
  • 2
    Не существует "gzip" Сжатие WebSocket в Chrome или в другом месте (в другом браузере). – oberstet 10 October 2013 в 17:08
  • 3
    @oberstet: Ты уверен? [Д0] stackoverflow.com/questions/11646680/… – SLaks 10 October 2013 в 17:22
  • 4
    gzip - это формат файла , который использует deflate как алгоритм сжатия. deflate представляет собой комбинацию кодирования LZ77 и Хаффмана. (WS-расширение) для расширения кадра для каждого кадра и новое расширение сжатия WS для каждого сообщения используют deflate. – oberstet 10 October 2013 в 22:48
Другие вопросы по тегам:

Похожие вопросы: