Jak WebSocket kompresuje wiadomości?

JSON.stringify nie jest oczywiście zbyt przestrzenny. Na przykład [123456789,123456789] zajmuje 20 + bajtów, gdy może potrzebować tylko około 5. Czy websocket kompresuje swoje Jsony przed wysłaniem do stream?

Author: Joakim Erdfelt, 2013-10-10

3 answers

WebSocket jest w swoim sercu tylko zestawem ramek dla danych tekstowych lub binarnych.

Nie wykonuje kompresji samodzielnie.

Jednak Specyfikacja WebSocket pozwala na Rozszerzenia, a na wolności pojawiło się wiele rozszerzeń kompresji (sformalizowana Specyfikacja jednego z nich została sfinalizowana).

Na dzień dzisiejszy (sierpień 2018) akceptowaną specyfikacją kompresji jest permessage-deflate.

Niektóre rozszerzenia widziane na wolności:

  • permessage-deflate - Nazwa sformalizowana Specyfikacja użycia deflate do kompresji całych wiadomości, niezależnie od liczby ramek websocket.
  • x-webkit-deflate-frame - wczesna proponowana kompresja, która kompresuje każdą surową ramkę danych websocket. Widoczne w użyciu przez Chrome i Safari. (obecnie przestarzałe w przeglądarce Chrome i Safari)
  • perframe-deflate - przemianowana wersja powyższej kompresji. W przeciwieństwie do innych serwerów websocket, serwery websocket mogą być używane w różnych aplikacjach, takich jak WebKit, WebKit, WebKit, WebKit, WebKit, WebKit, WebKit, WebKit, WebKit, WebKit, WebKit, WebKit, WebKit. (Całkowicie przestarzały w nowoczesnych przeglądarkach, ale nadal pojawia się w różnych bibliotekach klientów WebSocket) {]}

Należy zauważyć, że rozszerzenie permessage-deflate jest pierwszym w linii PMCE (Per-Message Compression Extensions), które ostatecznie obejmie inne schematy kompresji (omówione permessage-bzip2, permessage-lz4, i permessage-snappy)

 28
Author: Joakim Erdfelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-15 23:13:59

Czy websocket kompresuje swoje Jsony przed wysłaniem do stream?

Krótka odpowiedź brzmi: czasami, ale nie można na niej polegać.

Jak słusznie zauważył Joakim Erdfelt, połączenia Websocket obsługują zarówno wiadomości tekstowe, jak i binarne.

JSON jest tylko jednym ze sposobów transportu danych, z zaletą wszechstronności i łatwości użycia (a jednocześnie marnotrawstwa jeśli chodzi o Przestrzeń Kosmiczną).

Możesz łatwo przesyłać dane binarne za pomocą Websocket API, wyeliminowanie narzutu przepustowości kosztem innych problemów (takich jak endowość, długość słowa, parsowanie, itp.).

Wiele przeglądarek obsługuje również kompresję wiadomości Websocket jako rozszerzenie protokołu Websocket (chociaż serwer może nie obsługiwać rozszerzenia).

Rozszerzenia są negocjowane przy użyciu nagłówka HTTP Sec-WebSocket-Extensions. Negocjacje są zazwyczaj realizowane przez klienta / serwer bez oferowania publicznego API do ich kontroli.

Aż do 2015 roku istniały wiele podejść i implementacji w środowisku naturalnym, ale od grudnia 2015 RFC 7692 jest jedynym prawdziwym pretendentem do kompresji wiadomości i rzeczy są znacznie jaśniejsze.

RFC 7692 kompresuje całą wiadomość przed owinięciem (i być może fragmentacją) w "Pakiety" Websocket, co ułatwia implementację niż niektóre poprzednie Schematy kompresji.

Obecny projekt oferuje permessage-foo Schemat negocjacji kompresji (gdzie foo jest żądanym / wspieranym kompresji).

Ja tylko doświadczyłem permessage-deflate rozszerzenia.

Zwróć uwagę, że negocjacje rozszerzenia są opcjonalne, co oznacza, że potencjalni klienci sieciowi zazwyczaj mogą negocjować połączenia bez kompresji, nawet jeśli serwer obsługuje rozszerzenie.

Co więcej, RFC 7692 obsługuje kompresję selektywną, co oznacza, że niektóre wiadomości mogą być kompresowane, a inne nie...

... na przykład, [123456789,123456789] może być wysłany tak jak jest, ponieważ jego długość wskazuje, że nie jest to warte wysiłku kompresji.

Wsparcie dla permessage-deflate (RFC 7692), 8 sierpnia 2017:

To jest połączenie informacji w komentarzach, ostatnia aktualizacja 8 sierpnia 2017.

Jeśli coś przeoczyłem, dodaj je tutaj i zaktualizuj datę.

Obsługa Znanych Przeglądarek

  • Chrome od 32
  • Mozilla Firefox od 37
  • Safari - nieobsługiwane (10.1.2 wydaje się używać x-webkit-deflate-frame)
  • Microsoft Edge - nieobsługiwane od wersji 40

Znane Wsparcie Serwera

 9
Author: Myst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-08 10:48:28

Websockets wysyła surowe bajty.
Nie wiedzą ani nie dbają o to, co te bajty reprezentują.

Jeśli chcesz skompresować dane, musisz je skompresować samodzielnie przed wysłaniem ich w dół przewodu.

Zauważ, że Chrome obsługuje gzip dla połączeń websocket. (zakładając, że twój serwer również działa)

 -5
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 14:33:21