1) Perché il protocollo WebSocket è migliore?
WebSocket è migliore per situazioni che implicano comunicazioni a bassa latenza, in particolare per bassa latenza per i messaggi da client a server. Per i dati da server a client è possibile ottenere una latenza piuttosto bassa utilizzando connessioni a lungo termine e trasferimento in blocchi. Tuttavia, ciò non aiuta con la latenza client-server che richiede la creazione di una nuova connessione per ciascun messaggio client-server.
L'handshake HTTP a 48 byte non è realistico per le connessioni del browser HTTP nel mondo reale in cui spesso ci sono diversi kilobyte di dati inviati come parte della richiesta (in entrambe le direzioni) inclusi molti header e dati di cookie. Ecco un esempio di una richiesta / risposta all'utilizzo di Chrome:
Richiesta di esempio (2800 byte inclusi i dati sui cookie, 490 byte senza i dati sui cookie):
GET / HTTP/1.1
Host: www.cnn.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [[[2428 byte of cookie data]]]
Risposta di esempio (355 byte):
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Feb 2013 18:56:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=US:TX:Arlington; path=/
Last-Modified: Wed, 13 Feb 2013 18:55:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 13 Feb 2013 18:56:54 GMT
Content-Encoding: gzip
Entrambi HTTP e WebSocket hanno handshake di connessione iniziali di dimensioni equivalenti, ma con una connessione WebSocket l'handshake iniziale viene eseguito una volta e quindi i messaggi piccoli hanno solo 6 byte di overhead (2 per l'intestazione e 4 per il valore della maschera). Il sovraccarico di latenza non dipende dalle dimensioni delle intestazioni, ma dalla logica per analizzare / gestire / archiviare quelle intestazioni. Inoltre, la latenza della configurazione della connessione TCP è probabilmente un fattore maggiore della dimensione o del tempo di elaborazione per ciascuna richiesta.
2) Perché è stato implementato invece di aggiornare il protocollo HTTP?
Ci sono sforzi per riprogettare il protocollo HTTP per ottenere prestazioni migliori e una latenza inferiore come SPDY , HTTP 2.0 e QUIC . Ciò migliorerà la situazione per le normali richieste HTTP, ma è probabile che WebSocket e / o WebRTC DataChannel avranno ancora una latenza inferiore per il trasferimento dei dati da client a server rispetto al protocollo HTTP (o verrà utilizzato in una modalità che assomiglia molto a WebSocket in ogni modo).
Aggiornamento :
Ecco un framework per pensare ai protocolli Web:
- TCP : livello di trasporto ordini basso livello, bidirezionale, full duplex e garantito. Nessun supporto browser (tranne tramite plug-in / Flash).
- HTTP 1.0 : protocollo di trasporto richiesta-risposta stratificato su TCP. Il client effettua una richiesta completa, il server fornisce una risposta completa e quindi la connessione viene chiusa. I metodi di richiesta (GET, POST, HEAD) hanno un significato transazionale specifico per le risorse sul server.
- HTTP 1.1 : mantiene la natura richiesta-risposta di HTTP 1.0, ma consente alla connessione di rimanere aperta per più richieste complete / risposte complete (una risposta per richiesta). Ha ancora le intestazioni complete nella richiesta e nella risposta ma la connessione viene riutilizzata e non chiusa. HTTP 1.1 ha anche aggiunto alcuni metodi di richiesta aggiuntivi (OPTIONS, PUT, DELETE, TRACE, CONNECT) che hanno anche significati transazionali specifici. Tuttavia, come notato nell'introduzione alla proposta di bozza HTTP 2.0, il pipelining HTTP 1.1 non è ampiamente distribuito, quindi questo limita notevolmente l'utilità di HTTP 1.1 per risolvere la latenza tra browser e server.
- Long-poll : una sorta di "hack" su HTTP (1.0 o 1.1) in cui il server non risponde immediatamente (o risponde solo parzialmente con le intestazioni) alla richiesta del client. Dopo una risposta del server, il client invia immediatamente una nuova richiesta (utilizzando la stessa connessione se su HTTP 1.1).
- Streaming HTTP : una varietà di tecniche (risposta multipart / chunked) che consentono al server di inviare più di una risposta a una singola richiesta client. Il W3C sta standardizzando questo come Eventi inviati dal server usando un
text/event-stream
tipo MIME. L'API del browser (che è abbastanza simile all'API WebSocket) è chiamata API EventSource.
- Cometa / push del server : questo è un termine generico che include sia lo streaming a lungo termine che lo streaming HTTP. Le librerie di comete di solito supportano più tecniche per cercare di massimizzare il supporto tra browser e tra server.
- WebSocket : un livello TCP di trasporto integrato che utilizza una stretta di mano di aggiornamento compatibile con HTTP. A differenza di TCP, che è un trasporto in streaming, WebSocket è un trasporto basato su messaggi: i messaggi vengono delimitati sul filo e vengono riassemblati per intero prima della consegna all'applicazione. Le connessioni WebSocket sono bidirezionali, full duplex e di lunga durata. Dopo la richiesta / risposta iniziale di handshake, non vi è alcuna semantica transazionale e l'overhead per messaggio è molto limitato. Il client e il server possono inviare messaggi in qualsiasi momento e devono gestire la ricezione dei messaggi in modo asincrono.
- SPDY : una proposta avviata da Google per estendere HTTP utilizzando un protocollo wire più efficiente ma mantenendo tutta la semantica HTTP (richiesta / risposta, cookie, codifica). SPDY introduce un nuovo formato di frame (con frame prefissati in lunghezza) e specifica un modo per sovrapporre le coppie richiesta / risposta HTTP sul nuovo layer di frame. Le intestazioni possono essere compresse e le nuove intestazioni possono essere inviate dopo aver stabilito la connessione. Esistono implementazioni reali di SPDY in browser e server.
- HTTP 2.0 : ha obiettivi simili a SPDY: ridurre la latenza e le spese generali HTTP preservando la semantica HTTP. La bozza corrente è derivata da SPDY e definisce un handshake di aggiornamento e un frame di dati che è molto simile allo standard WebSocket per handshake e frame. Una proposta di bozza HTTP 2.0 alternativa (httpbis-speed-mobility) utilizza effettivamente WebSocket per il livello di trasporto e aggiunge il multiplexing SPDY e il mapping HTTP come estensione WebSocket (le estensioni WebSocket vengono negoziate durante l'handshake).
- WebRTC / CU-WebRTC : proposte per consentire la connettività peer-to-peer tra i browser. Ciò può consentire comunicazioni con latenza media e massima inferiori poiché il trasporto sottostante è SDP / datagramma anziché TCP. Ciò consente la consegna fuori pacchetto di pacchetti / messaggi, evitando il problema TCP di picchi di latenza causati da pacchetti persi che ritardano la consegna di tutti i pacchetti successivi (per garantire la consegna in ordine).
- QUIC : è un protocollo sperimentale volto a ridurre la latenza del web rispetto a quella del TCP. A prima vista, QUIC è molto simile a TCP + TLS + SPDY implementato su UDP. QUIC fornisce multiplexing e controllo del flusso equivalenti a HTTP / 2, sicurezza equivalente a TLS e semantica della connessione, affidabilità e controllo della congestione equivalenti a TCP. Poiché TCP è implementato nei kernel del sistema operativo e nel firmware middlebox, apportare modifiche significative a TCP è quasi impossibile. Tuttavia, poiché QUIC è costruito su UDP, non presenta tali limiti. QUIC è progettato e ottimizzato per la semantica HTTP / 2.
Riferimenti :
- HTTP :
- Evento inviato dal server :
- WebSocket :
- SPDY :
- HTTP 2.0 :
- WebRTC :
- QUIC :