Envoi d'une image ping / pong Websocket à partir du navigateur

130

Je continue à lire sur les messages ping / pong dans les websockets pour maintenir la connexion active, mais je ne suis pas sûr de ce qu'ils sont. S'agit-il d'un type de trame distinct? (Je ne vois aucune méthode sur un objet javascript WebSocket dans chrome lié au ping-pong). Ou est-ce juste un modèle de conception (par exemple, j'envoie littéralement "ping" ou toute autre chaîne au serveur et je le fais répondre). Le ping-pong est-il lié aux trames de continuation?

La raison pour laquelle je demande est que j'utilise un framework python qui fonctionne derrière Mongrel2, donc je me demande s'il existe un moyen d'envoyer à Mongrel2 un message ping / pong spécifique qui lui dirait de maintenir la connexion active sans que mon application python ait besoin de inquiétez-vous à ce sujet. Analogue à une méthode HTTP distincte, je suppose. Et j'imagine qu'un cadre de message ping / pong dédié pourrait être plus simple (moins de charge sur le serveur et le réseau) que la chaîne "ping", même si cela n'aurait probablement pas trop d'importance.

EDIT: Je viens de regarder RFC 6455 et il semble que Ping et Pong sont définitivement des types de trames de contrôle avec leurs propres opcodes. Alors, comment envoyer un cadre Ping à partir de JavaScript dans Chrome?

Danny
la source
Ping juste du serveur. Tout le monde connaît le problème de mise en réseau sur les ports non standard, ils commencent donc à envoyer des requêtes ping à intervalles réguliers et courts. Je suppose que vous pourriez cingler un serveur mal écrit, mais il n'est peut-être pas trop intelligent de faire quelque chose de sensible avec eux.
@ user1382306 ping du serveur utilisera d'abord l'utilisation de la batterie de l'appareil mobile très rapidement. Ping du client peut économiser la batterie de l'appareil.
bronze man
@ user1382306 Pas tout à fait tout le monde! Quel est le problème de mise en réseau sur les ports non standard?
HappyDog

Réponses:

121

Il n'y a pas d'API Javascript pour envoyer des trames ping ou recevoir des trames pong. Ceci est soit pris en charge par votre navigateur, soit non. Il n'y a pas non plus d'API pour activer, configurer ou détecter si le navigateur prend en charge et utilise des trames ping / pong. Il y a eu une discussion sur la création d'une API Javascript ping / pong pour cela. Il est possible que les pings soient configurables / détectables dans le futur, mais il est peu probable que Javascript puisse envoyer et recevoir directement des trames ping / pong.

Cependant, si vous contrôlez à la fois le code client et le code serveur, vous pouvez facilement ajouter le support ping / pong à un niveau supérieur. Vous aurez besoin d'une sorte d'en-tête / de métadonnées de type de message dans votre message si vous ne l'avez pas déjà, mais c'est assez simple. À moins que vous ne prévoyiez d'envoyer des pings des centaines de fois par seconde ou que vous ayez des milliers de clients simultanés, la surcharge sera assez minime pour le faire vous-même.

Kanaka
la source
1
@bigmugcup Le lien est mort
M. Jo
19

Ping est destiné à être envoyé uniquement du serveur au client, et le navigateur doit répondre dès que possible avec Pong OpCode, automatiquement. Vous n'avez donc pas à vous en soucier à un niveau supérieur.

Bien que tous les navigateurs ne prennent pas en charge la norme comme ils le supposent, ils peuvent avoir des différences dans la mise en œuvre de ce mécanisme, et cela peut même signifier qu'il n'y a pas de fonctionnalité de réponse Pong. Mais personnellement, j'utilise Ping / Pong et je n'ai jamais vu de client qui n'implémente pas ce type d'OpCode et de réponse automatique sur l'implémentation côté client de bas niveau.

moka
la source
73
Où avez-vous lu que le ping est uniquement du serveur au client? Le RFC dit "Un point d'extrémité PEUT envoyer une trame Ping à tout moment après l'établissement de la connexion et avant que la connexion ne soit fermée."
xryl669
7
Si vous souhaitez que le client détecte automatiquement un état déconnecté (lorsqu'aucun paquet RST / FIN n'a été reçu, mais que le réseau a été déconnecté), vous devez également demander au client d'initier les paquets ping.
pschwamb
13
TCP ne notifie pas les déconnexions lorsque les paquets RST / FIN n'ont pas été reçus. TCP détecte uniquement les connexions interrompues lorsqu'un expéditeur tente d'envoyer sur une connexion déconnectée. Les ping sont utilisés comme pulsations dans de nombreuses applications et c'est une utilisation valide. Une connexion morte restera simplement morte pour toujours jusqu'à ce que le client essaie d'envoyer. Par conséquent, avec WebSockets sur le navigateur, un message ping (ou pulsation) personnalisé doit être utilisé pour détecter la déconnexion du client côté client. Le serveur tente peut-être d'envoyer un ping et de détecter la déconnexion du client, mais le client n'est pas informé. Les pings client sont également très bien.
DDS
15
Dans la RFC 6455, le protocole WebSocket, il déclare explicitement: «REMARQUE: une trame Ping peut servir soit de keepalive, soit de moyen de vérifier que le point de terminaison distant est toujours réactif.
DDS
4
Il est possible que le ping sur serveur uniquement soit une pratique recommandée lorsque les agents utilisateurs étaient fréquemment actualisés. Mais maintenant, de nombreux sites Web sont conçus comme des SPA. Dans cet environnement, il peut être tout à fait essentiel que l'application cliente envoie régulièrement une requête ping au serveur afin de s'assurer que la connexion n'a pas été perdue.
Noel Abrahams