(Este no es el algoritmo de Marzullo. Eso sólo es utilizado por los servidores de alto estrato para obtener el tiempo muy preciso utilizando varias fuentes. Así es como un cliente normal obtiene la hora, utilizando un solo servidor)
En primer lugar, las marcas de tiempo NTP se almacenan como segundos desde el 1 de enero de 1900. 32 bits para el número de segundos y 32 bits para las fracciones de segundo.
La sincronización es complicada. El cliente almacena la marca de tiempo (por ejemplo, A) (todos estos valores están en segundos) cuando envía la solicitud. El servidor envía una respuesta que consiste en el tiempo "verdadero" cuando recibió el paquete (llame a esa X) y el tiempo "verdadero" transmitirá el paquete (Y). El cliente recibirá ese paquete y registrará la hora en que lo recibió (B).
NTP supone que el tiempo que se pasa en la red es el mismo para enviar y recibir. En intervalos suficientes sobre redes sanas, debería ser promedio. Sabemos que el tiempo total de tránsito desde el envío de la solicitud hasta la recepción de la respuesta fue de segundos B-A. Queremos eliminar el tiempo que el servidor pasó procesando la solicitud (Y-X), dejando solo el tiempo de cruce de la red, por lo que es B-A- (Y-X). Como asumimos que el tiempo de recorrido de la red es simétrico, la cantidad de tiempo que tardó la respuesta para llegar del servidor al cliente es [B-A- (Y-X)]/2. Entonces sabemos que el servidor envió su respuesta en el momento Y, y nos tomó [B-A- (Y-X)]/2 segundos para que esa respuesta llegue a nosotros.
Entonces, el momento verdadero en que recibimos la respuesta es Y + [B-A- (Y-X)]/2 segundos. Y así es como funciona NTP.
Ejemplo (en segundos enteros para hacer la matemáticas fácil):
- cliente envía petición en el momento "equivocado" 100. A = 100.
- El servidor recibe la solicitud en el "verdadero" tiempo 150. X = 150.
- El servidor es lento, por lo que no envía la respuesta hasta el tiempo "verdadero" 160. Y = 160.
- El cliente recibe la solicitud en el momento "incorrecto" 120. B = 120.
- El cliente determina que el tiempo empleado en la red es BA- (YX) = 120-100- (160-150) = 10 segundos
- El cliente asume la cantidad de tiempo que tardó la respuesta en llegar del servidor a el cliente es 10/2 = 5 segundos.
- El cliente agrega ese tiempo al tiempo "verdadero" cuando el servidor envió la respuesta para estimar que recibió la respuesta en un tiempo "verdadero" de 165 segundos.
- El cliente ahora sabe que necesita agregar 45 segundos a su reloj.
En una implementación adecuada, el cliente se ejecuta como daemon, todo el tiempo. Durante un largo período de tiempo con muchas muestras, NTP puede determinar si el reloj de la computadora es lento o rápido, y ajustarlo automáticamente de manera correspondiente, lo que le permite mantener un tiempo razonablemente bueno, incluso si más tarde se desconecta de la red. Junto con promediar las respuestas del servidor y la aplicación de pensamientos más complicados, puede obtener tiempos increíblemente precisos.
Hay más, por supuesto, para una implementación adecuada que eso, pero esa es la esencia de la misma.
Gracias, este es exactamente el tipo de explicación que estaba buscando. Las suposiciones hechas y algunas de las limitaciones son un poco sorprendentes. Por ejemplo, ¿con qué facilidad puede un servidor dar una garantía confiable sobre 'Y'? Además, me pregunto cómo son los tiempos de red simétrica en la práctica. Parece que puede usar el algoritmo de Marzullo para reducir el error causado por estas dos incertidumbres. –
Sería interesante saber con más detalle cómo los servidores obtienen las veces "X" e "Y", es decir, si necesita ayuda del sistema operativo para calcular las horas exactas en las que se recibió/se transmitirá un paquete, o. ..? –
Esa es una gran y elegante explicación. Sin embargo, una pregunta: ¿es realmente justo asumir velocidades de red simétricas? Muchos ISP brindan a los clientes un ancho de banda de carga más lento que la descarga. Si hay otras asimetrías en el sistema así, no es demasiado exagerado suponer una latencia asimétrica en la red. ¿Es incluso un problema solucionable? Supongo que no, si solo un servidor está en uso. –