In che modo WebSocket comprime i messaggi?

JSON.stringify ovviamente non è molto efficiente nello spazio. Ad esempio, [123456789,123456789] occupa più di 20 byte quando potrebbe aver bisogno di circa 5. Se websocket comprime i suoi JSON prima di inviarli allo stream?

WebSocket è, al suo centro, solo un set di frame per i dati TEXT o BINARY.

Non esegue alcuna compressione da solo.

Tuttavia, la specifica WebSocket consente estensioni, e ci sono state una varietà di estensioni di compressione in the wild (le specifiche formalizzate per uno di questi è finalizzato).

Ad oggi (agosto 2018) le specifiche di compressione accettate sono permessage-deflate .

Alcune delle estensioni viste in natura:

  • permessage-deflate : il nome delle specifiche formalizzate per l’utilizzo di deflate per comprimere interi messaggi, indipendentemente dal numero di frame Websocket.
  • x-webkit-deflate-frame – una compressione proposta in anticipo che comprime ogni frame di dati websocket grezzo. Visto in uso da Chrome e Safari. (ora deprecato in Chrome e Safari)
  • perframe-deflate – una versione rinominata della compressione sopra. Visto in uso da varie implementazioni del server Websocket, e anche brevemente mostrato in vari client basati su WebKit . (Completamente deprecato nei browser moderni, ma continua a comparire in varie librerie client WebSocket)

Di nota, l’estensione permessage-deflate è la prima di una linea di PMCE (Per-Message Compression Extensions) che alla fine includerà altri schemi di compressione ( quelli discussi sono permessage-bzip2 , permessage-lz4 e permessage-snappy )

Websocket comprime i suoi JSON prima di inviarli allo stream?

La risposta breve è: a volte, ma non puoi dipendere da questo .

Come dichiarato opportunamente da Joakim Erdfelt, le connessioni Websocket supportano sia i messaggi di testo che quelli binari.

JSON è solo un modo per trasportare dati, con il vantaggio della versatilità e della facilità d’uso (pur essendo uno spreco per quanto riguarda lo spazio).

È ansible trasferire facilmente dati binari utilizzando l’API Websocket, eliminando l’overhead della larghezza di banda a spese di altri problemi (come endeness, lunghezza della parola, analisi, ecc.).

Molti browser supportano anche la compressione dei messaggi Websocket come estensione del protocollo Websocket (anche se il server potrebbe non supportare l’estensione).

Le estensioni sono negoziate usando l’intestazione HTTP Sec-WebSocket-Extensions . Le negoziazioni vengono solitamente implementate dal client / server senza offrire un’API pubblica per controllarle.

Fino al 2015, c’erano un certo numero di approcci e implementazioni in natura, ma da dicembre 2015 RFC 7692 è l’unico vero contendente per la compressione dei messaggi e le cose sono molto più chiare.

RFC 7692 comprime l’intero messaggio prima di eseguirne il wrapping (e forse lo frammenta) nei “pacchetti” di Websocket, rendendolo più facile da implementare rispetto ad alcuni schemi di compressione precedenti.

La bozza attuale offre uno schema di negoziazione di compressione permessage-foo (dove foo è la compressione richiesta / supportata).

Ho solo sperimentato l’estensione di permessage-deflate dei permessage-deflate solo.

Si noti che le negoziazioni delle estensioni sono opzionali , il che significa che i potenziali clienti di rete sono in genere autorizzati a negoziare connessioni senza compressione, anche se il proprio server supporta l’estensione.

Inoltre, RFC 7692 supporta la compressione selettiva, il che significa che alcuni messaggi potrebbero essere compressi mentre altri non sono compressi …

… ad esempio, [123456789,123456789] potrebbe essere inviato così com’è, poiché la sua lunghezza indica che non è probabile che varrà la pena dello sforzo di compressione.

Supporto per permessage-deflate (RFC 7692), 8 agosto 2017:

Questa è una combinazione delle informazioni contenute nei commenti, aggiornate l’8 agosto 2017.

Se ho perso qualcosa, aggiungili qui e aggiorna la data.

Supporto browser noto

  • Chrome dal 32
  • Mozilla Firefox dal 37
  • Safari – non supportato (10.1.2 sembra utilizzare x-webkit-deflate-frame )
  • Microsoft Edge – non supportato dalla versione 40

Supporto server noto

  • Crossbar.io (Autobahn)
  • wspy
  • Tornado
  • Faye su node.js e Ruby
  • SwiftWebSocket (solo lettura?)
  • WS-RS (rust)

Websockets invia byte non elaborati.
Non sanno o non si preoccupano di ciò che quei byte rappresentano.

Se si desidera comprimere i dati, è necessario comprimerli autonomamente prima di inviarli via cavo.

Tieni presente che Chrome supporta gzip per le connessioni websocket. (supponendo che anche il tuo server lo faccia)