2014-10-14 12 views
12

Supponiamo di avere una websocket che può ricevere un evento in qualsiasi momento, ma è in gran parte inattiva, quanta banda verrà consumata dopo la connessione iniziale per mantenerla in vita?Overhead of Idle WebSockets

Per quello che vale, il server è NodeJS che utilizza ws e il client utilizza QtWebSockets.

Grazie!

+0

Quale livello di bandwdith ti preoccupa? Probabilmente questo è molto, molto piccolo - meno per un giorno di una singola immagine di buone dimensioni. – jfriend00

+0

È fondamentalmente un server di notifica push. Diciamo che è su 8 ore al giorno. – Jacob

+0

Non hai risposto alla mia domanda. Sei preoccupato per 100kb di larghezza di banda, 200MB di larghezza di banda, 200GB di larghezza di banda? Dov'è il tuo livello di preoccupazione? Mantenere i messaggi vivi sono molto piccoli, quindi non si sommano molto. In genere, un problema più grande è la durata della batteria sui dispositivi mobili. – jfriend00

risposta

22

volta stabilito (cioè il three-way handshake completa), una connessione TCP grezzo utilizza la larghezza di banda pari a zero a meno che:

  • È inviare o ricevere dati
  • TCP keepalives sono abilitati esplicitamente

A server o il client può abilitare i keepalive TCP. Un keepalive è un pacchetto a lunghezza zero inviato con il flag ACK, ed è solo 54 byte inviati sul filo più un altro 54 per la risposta. Per impostazione predefinita, i keepalive TCP vengono inviati ogni due ore. In altre parole, completamente trascurabile.

Anche i WebSocket dispongono di un proprio meccanismo di keepalive (a deal with proxies). Il server o il client può inviare un frame PING e l'altra estremità DEVE rispondere con un frame PONG. Sebbene non ci sia un'API JS sul lato del browser per inviare PING s, un server nodo potrebbe inviarli e un browser conforme risponderà automaticamente. (QtWebSockets ha un'API per inviare PING s.) Questo non accade per impostazione predefinita; devi farlo manualmente. I frame WebSocket PING e PONG hanno almeno 7 byte e al massimo 131 byte ciascuno (più 54 byte di overhead TCP/IP). Quindi un singolo PING/PONG costa tra 122 e 370 byte.

ws non esegue automaticamente keepalive, né QtWebSockets. Quindi, per rispondere alla tua domanda, una configurazione predefinita usa una larghezza di banda pari a zero per mantenere la connessione TCP.

Tuttavia ...

keepalive sono importanti perché i dispositivi intermedi (cioè router NAT) scenderanno connessioni TCP inattive. A seconda delle reti tra il tuo server e i tuoi client, questo significa che se non hai keepalive, i tuoi client perderanno le loro connessioni (possibilmente senza saperlo, che è male), e dovranno ridistribuire la sessione WebSocket . Questo sarà probabilmente molto più costoso in termini di larghezza di banda rispetto all'abilitazione di keepalive equilibrati.

A PING/PONG ogni 5 minuti costa 1,5 - 4,4 KB all'ora (per cliente).


Nota: socket.io ha un proprio meccanismo di keepalive (separato dal WebSockets'), che è abilitato per impostazione predefinita. Il sio keepalive è gestito dalla libreria sio e avviene tramite il canale dati WebSocket (al contrario di WebSocket PING/PONG, che sono frame di controllo). Il server socket.io invia un messaggio keepalive di 8 byte (+ overhead) ogni 30 secondi, che equivale a circa 15 kB all'ora.

+0

Grazie per la risposta informativa! 5 minuti sono sufficienti per non avere una connessione interrotta? – Jacob

+0

Dipende totalmente dai dispositivi tra gli endpoint, ma 5 minuti dovrebbero essere più che sufficienti. Per sapere davvero, dovresti fare qualche sperimentazione con i tuoi clienti. – josh3736