2011-05-01 27 views
5

pequeña pregunta. ¿Cómo puedo calcular el ping de una conexión WebSocket? El servidor está configurado usando Node.js y node-websocket-server, si eso es realmente importante.Calculando el Ping de una conexión WebSocket?

+0

¿Qué se entiende por "calcular el ping"? –

+0

Para calcular la latencia que tiene la conexión. – Alexander

Respuesta

5

Para calcular la latencia, realmente debe completar el viaje de ida y vuelta. Debería tener un mensaje de ping que tenga una marca de tiempo. Cuando un lado u otro recibe un ping, debe cambiarlo a un pong (o gnip o lo que sea), pero conserve la marca de tiempo original y envíela al remitente. Luego, el remitente original puede comparar la marca de tiempo con la hora actual para ver cuál es la latencia de ida y vuelta. Si necesita una latencia unidireccional, divida por 2. La razón por la que necesita hacerlo de esta manera es que, sin algunos algoritmos de desviación de tiempo muy sofisticados, el tiempo en un host frente a otro no será comparable en pequeños deltas de tiempo como este.

-3

Puede enviar una solicitud a través del zócalo web con Date.now() como datos y compararla con Date.now() en el servidor.

Esto le proporciona la diferencia de tiempo entre el envío del paquete y su recepción, más cualquier tiempo de manipulación en cualquier extremo.

+0

¿Hay alguna forma eficiente de hacerlo para que se actualice automáticamente? – Alexander

+0

@Alexander sondeo continuo o adjuntar marcas de tiempo a cada solicitud de socket web. ¿Necesita la latencia para cualquier cosa que no sea información? Solo se debe usar para iniciar sesión, no para cambiar la forma en que funciona su aplicación. – Raynos

+0

Es solo para iniciar sesión, para ver cómo varían las variaciones entre la latencia que tienen los clientes conectados y para mostrarla en la página. – Alexander

1

Websockets tienen un mensaje de tipo ping al que el servidor puede responder con un mensaje de tipo pong. Consulte this para obtener más información sobre websockets.

5

Hay algunas maneras. Uno que es ofrecido por Raynos - está mal. Porque el tiempo del cliente y el tiempo del servidor son diferentes y no puede compararlos.

La solución con fecha y hora de envío es buena, pero tiene un problema. Si la lógica del servidor toma algunas decisiones y cálculos basados ​​en el ping, entonces el envío de la marca de tiempo, implica el riesgo de que el software del cliente o MITM modifique la marca de tiempo, de esa manera dará otros resultados al servidor.

Mucho mejor, es enviar paquetes al cliente con ID único, que no es un número de incremento, sino aleatorio. Y luego el servidor esperará del mensaje "PONG" del cliente con esta ID. El tamaño de la ID debe ser el mismo, recomiendo 32bits (int). De esa forma el servidor envía "PING" con identificación única y marca de tiempo de la tienda del mensaje enviado, y luego espera hasta que reciba la respuesta "PONG" con la misma ID del cliente, y calculará la latencia de ida y vuelta según la marca de tiempo almacenada y nuevo en el momento de recibir el mensaje PONG. No se olvide de implementar el caso con el tiempo de espera, para evitar que el paquete perdido PING/PONG detenga el proceso de comprobación de la latencia.

Además WebSockets tiene un código de operación de paquete especial llamado PING, pero el ejemplo de la publicación anterior no usa esta característica. Lea este documento oficial que describe este código de operación específico, podría ser útil si está implementando su propio protocolo WebSockets en el servidor: http://tools.ietf.org/html/rfc6455#page-37

+0

¿Por qué downvote, algún comentario al respecto? – moka

Cuestiones relacionadas