Envío de marcos websocket ping / pong desde el navegador

130

Sigo leyendo sobre mensajes de ping / pong en websockets para mantener viva la conexión, pero no estoy seguro de cuáles son. ¿Es un tipo de marco distinto? (No veo ningún método en un objeto JavaScript WebSocket en Chrome relacionado con ping-pong). ¿O es simplemente un patrón de diseño (por ejemplo, literalmente envío "ping" o cualquier otra cadena al servidor y hago que responda)? ¿Está el ping-pong relacionado con los cuadros de continuación?

La razón por la que pregunto es que estoy usando un marco de Python que se ejecuta detrás de Mongrel2, por lo que me pregunto si hay una manera de enviar a Mongrel2 un mensaje específico de ping / pong que le diga que mantenga viva la conexión sin que mi aplicación de Python necesite Preocúpate por eso. Análogo a tener un método HTTP separado para él, supongo. E imagino que un marco de mensaje de ping / pong dedicado podría ser más simple (menos carga en el servidor y la red) que la cadena "ping", aunque eso probablemente no importaría demasiado.

EDITAR: Acabo de ver RFC 6455 y parece que Ping y Pong son definitivamente tipos de cuadros de control con sus propios códigos de operación. Entonces, ¿cómo envío un marco Ping desde javascript en Chrome?

danny
fuente
Simplemente haga ping desde el servidor. Todos conocen el problema de las redes en los puertos no estándar, por lo que comienzan a hacer ping a intervalos regulares cortos. Supongo que podría hacer ping a un servidor mal escrito, pero puede que no sea demasiado inteligente hacer algo sensible con ellos.
@ user1382306 ping desde el servidor primero usará la batería del dispositivo móvil muy rápido Hacer ping desde el cliente puede ahorrar batería del dispositivo.
hombre de bronce
@ user1382306 ¡No todo el mundo! ¿Cuál es el problema de la red en los puertos no estándar?
HappyDog

Respuestas:

121

No hay una API de Javascript para enviar marcos de ping o recibir marcos de pong. Esto es compatible con su navegador o no. Tampoco hay una API para habilitar, configurar o detectar si el navegador admite y está utilizando marcos de ping / pong. Se discutió sobre la creación de una API de ping / pong Javascript para esto. Existe la posibilidad de que los pings sean configurables / detectables en el futuro, pero es poco probable que Javascript pueda enviar y recibir marcos de ping / pong directamente.

Sin embargo, si controla tanto el código del cliente como el del servidor, puede agregar fácilmente soporte de ping / pong a un nivel superior. Necesitará algún tipo de encabezado / metadatos de tipo de mensaje en su mensaje si aún no lo tiene, pero eso es bastante simple. A menos que esté planeando enviar pings cientos de veces por segundo o tenga miles de clientes simultáneos, la sobrecarga será mínima para hacerlo usted mismo.

canaca
fuente
1
@bigmugcup El enlace está muerto
Sr. Jo
19

Ping debe enviarse solo del servidor al cliente, y el navegador debe responder lo antes posible con Pong OpCode, automáticamente. Así que no debes preocuparte por eso en un nivel superior.

Aunque no todos los navegadores admiten el estándar como se supone, pueden tener algunas diferencias en la implementación de dicho mecanismo, e incluso puede significar que no hay funcionalidad de respuesta Pong. Pero personalmente estoy usando Ping / Pong, y nunca vi un cliente que no implementa este tipo de OpCode y una respuesta automática en la implementación del lado del cliente de bajo nivel.

moka
fuente
73
¿Dónde has leído que el ping es solo del servidor al cliente? El RFC dice "Un punto final PUEDE enviar una trama Ping en cualquier momento después de que se establezca la conexión y antes de que se cierre la conexión".
xryl669
77
Si desea que el cliente detecte automáticamente un estado desconectado (cuando no se han recibido paquetes RST / FIN, pero la red se ha desconectado), entonces debe hacer que el cliente también inicie los paquetes ping.
pschwamb
13
TCP no notifica las desconexiones cuando no se recibieron los paquetes RST / FIN. TCP solo detecta conexiones caídas cuando un remitente intenta enviar una conexión desconectada. Los pings se usan como latidos en muchas aplicaciones y es un uso válido. Una conexión inactiva simplemente permanecerá inactiva para siempre hasta que el cliente intente enviarla. Por lo tanto, con WebSockets en el navegador, se debe usar un mensaje de ping personalizado (o latido) para detectar la desconexión del cliente en el lado del cliente. El servidor puede estar intentando hacer ping y detectar la desconexión del cliente, pero el cliente no está informado. Los pings del cliente también están bien.
DDS
15
En RFC 6455, el Protocolo WebSocket, declara explícitamente: "NOTA: Un marco Ping puede servir como keepalive o como un medio para verificar que el punto final remoto todavía responde".
DDS
44
Es posible que el ping de solo servidor fuera una práctica recomendada cuando los agentes de usuario se actualizaban con frecuencia. Pero ahora muchos sitios web están diseñados como SPA. En este entorno, puede ser bastante esencial que la aplicación cliente haga ping regularmente al servidor para garantizar que no se pierda la conexión.
Noel Abrahams