Invio di frame ping / pong del websocket dal browser


130

Continuo a leggere i messaggi di ping / pong nei socket Web per mantenere attiva la connessione, ma non sono sicuro di cosa siano. È un tipo di frame distinto? (Non vedo alcun metodo su un oggetto WebSocket javascript in Chrome correlato al ping-pong). O è solo un modello di progettazione (ad esempio, invio letteralmente "ping" o qualsiasi altra stringa al server e faccio in modo che risponda). Il ping-pong è in qualche modo correlato ai frame di continuazione?

Il motivo per cui chiedo è che sto usando un framework Python che gira dietro Mongrel2, quindi mi chiedo se c'è un modo per inviare a Mongrel2 un messaggio ping / pong specifico che gli dica di mantenere attiva la connessione senza che la mia app Python debba preoccuparsene. Analogamente ad avere un metodo HTTP separato per questo, credo. E immagino che un frame di messaggi ping / pong dedicati potrebbe essere più semplice (meno carico sul server e sulla rete) rispetto alla stringa "ping", anche se probabilmente non avrebbe importanza.

EDIT: Ho appena visto RFC 6455 e sembra che Ping e Pong siano sicuramente i tipi di frame di controllo con i loro codici operativi . Quindi, come posso inviare un frame Ping da JavaScript in Chrome?


Basta eseguire il ping dal server. Tutti conoscono il problema della rete su porte non standard, quindi iniziano a eseguire il ping a intervalli regolari brevi. Suppongo che potresti eseguire il ping di un server scritto male, ma potrebbe non essere troppo intelligente per fare qualcosa di sensibile con loro.


@ user1382306 ping dal server utilizzerà prima la batteria del dispositivo mobile molto velocemente. Il ping dal client può risparmiare la batteria del dispositivo.
uomo di bronzo,

@ user1382306 Non del tutto tutti! Qual è il problema di rete su porte non standard?
HappyDog,

Risposte:


121

Non esiste un'API Javascript per inviare frame ping o ricevere frame pong. Questo è supportato dal tuo browser oppure no. Non esiste inoltre alcuna API per abilitare, configurare o rilevare se il browser supporta e utilizza frame di ping / pong. Si è discusso della creazione di un'API ping / pong Javascript per questo. Esiste la possibilità che i ping possano essere configurabili / rilevabili in futuro, ma è improbabile che Javascript sia in grado di inviare e ricevere direttamente frame di ping / pong.

Tuttavia, se controlli sia il codice client che quello del server, puoi facilmente aggiungere il supporto ping / pong a un livello superiore. Avrai bisogno di una sorta di intestazione / metadati del tipo di messaggio nel tuo messaggio se non lo possiedi già, ma è piuttosto semplice. A meno che tu non abbia intenzione di inviare ping centinaia di volte al secondo o di avere migliaia di client simultanei, il sovraccarico sarà abbastanza minimo per farlo da solo.


1
@bigmugcup Il link è morto
Mr. Jo

19

Il ping deve essere inviato solo dal server al client e il browser dovrebbe rispondere al più presto con Pong OpCode, automaticamente. Quindi non devi preoccuparti di questo a un livello superiore.

Sebbene non tutti i browser supportino lo standard come suppongono, potrebbero avere alcune differenze nell'implementazione di tale meccanismo e potrebbe anche significare che non esiste alcuna funzionalità di risposta Pong. Ma personalmente sto usando Ping / Pong e non ho mai visto client che non implementano questo tipo di OpCode e una risposta automatica sull'implementazione lato client di basso livello.


73
Dove hai letto che il ping è solo da server a client? L'RFC dice "Un endpoint PUO 'inviare un frame Ping in qualsiasi momento dopo che la connessione è stata stabilita e prima che la connessione venga chiusa."
xryl669,

7
Se si desidera che il client rilevi automaticamente uno stato disconnesso (quando non sono stati ricevuti pacchetti RST / FIN, ma la rete è stata disconnessa), è necessario che anche il client avvii i pacchetti ping.
pschwamb,

13
TCP non notifica di disconnessioni quando non sono stati ricevuti pacchetti RST / FIN. TCP rileva le connessioni interrotte solo quando un mittente tenta di inviare una connessione disconnessa. I ping sono usati come battiti cardiaci in molte applicazioni ed è un uso valido. Una connessione morta rimarrà semplicemente per sempre finché il client non tenta di inviare. Pertanto, con WebSocket nel browser, è necessario utilizzare un messaggio ping (o heartbeat) personalizzato per rilevare la disconnessione del client sul lato client. Il server potrebbe tentare di eseguire il ping e rilevare la disconnessione del client, ma il client non viene informato. Anche i ping dei client vanno bene.
DDS

15
In RFC 6455, il protocollo WebSocket, si afferma esplicitamente: "NOTA: un frame Ping può servire come keepalive o come mezzo per verificare che l'endpoint remoto sia ancora reattivo".
DDS

4
È possibile che il ping solo server fosse una pratica consigliata quando gli user-agent venivano frequentemente aggiornati. Ma ora molti siti Web sono progettati come SPA. In questo ambiente potrebbe essere abbastanza essenziale per l'applicazione client eseguire regolarmente il ping del server per garantire che la connessione non sia andata persa.
Noel Abrahams,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.