2009-08-04 8 views
33

El Wikipedia entry no da detalles y el RFC es demasiado denso. ¿Alguien de aquí sabe, de manera muy general, cómo funciona el NTP?¿Cómo funciona el protocolo de tiempo de red?

Estoy buscando una visión general que explique cómo se emplea Marzullo's algorithm (o una modificación de la misma) para traducir una marca de tiempo en un servidor en una marca de tiempo en un cliente. Específicamente, qué mecanismo se utiliza para producir precisión, que es, en promedio, dentro de los 10 ms cuando esa comunicación tiene lugar a través de una red con una latencia muy variable que frecuentemente es varias veces mayor.

Respuesta

72

(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.

+2

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. –

+0

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. ..? –

+0

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. –

-1

El truco es que algunos paquetes son rápidos, y los paquetes rápidos le dan restricciones estrictas en el tiempo.

+1

Información importante sobre por qué funciona en la práctica. Esto hubiera sido un excelente comentario. –

5
  1. El cliente NTP pregunta a todos sus servidores NTP qué hora es.
  2. Los diferentes servidores darán respuestas diferentes, con diferentes niveles de confianza porque los solicitudes tendrán diferentes cantidades de tiempo para viajar desde el cliente al servidor y espalda.
  3. El algoritmo de Marzullo encontrará la menor gama de valores de tiempo consistente con todas las respuestas proporcionadas.
  4. Puede estar más seguro de la precisión de la respuesta de este algoritmo que de la de cualquier servidor de tiempo único porque la intersección de varios conjuntos probablemente contendrá menos elementos que cualquier conjunto individual.
  5. Cuantos más servidores consulte, más restricciones tendrá en la posible respuesta y más preciso será su reloj.
+2

Me pregunto cómo se calculan esos intervalos de confianza. –

0

SI está utilizando las marcas de tiempo para decidir el pedido, los tiempos específicos pueden no ser necesarios. En su lugar, podría usar lamport clocks, que son menos problemáticos que la sincronización de red. Puede decirle qué vino "primero", pero no la diferencia exacta en veces. No le importa lo que dice realmente el reloj de la computadora.

+0

He visto los relojes lamport (y los relojes vectoriales) y se ven interesantes. Desafortunadamente, tengo que calcular deltas no solo establecer un pedido. –

Cuestiones relacionadas