miércoles, 18 de abril de 2018

Protocolo NTP - Los Miércoles de Tecnología

El protocolo NTP permite sincronizar múltiples clientes contra uno o varios servidores. En este post vemos cómo funciona y las diferencias principales entre las versiones 3 y 4 de este protocolo.


El protocolo NTP (Network Time Protocol) permite la sincronización horaria de cualquier equipo o dispositivo conectado a una red de comunicaciones.

Se trata de un protocolo cliente/servidor donde los equipos que deben sincronizarse actúan como clientes lanzando peticiones de sincronismo (NTP request) a otro u otros dispositivos que actúan como servidor y que entregan la fecha y hora exacta (NTP reply). El intercambio de mensajes así como un resumen del cálculo del offset o retardo entre envío de petición y recepción de respuesta puede verse en la siguiente figura.

[caption id="attachment_677" align="aligncenter" width="638"] Fuente: ADVA y Osciloquartz[/caption]

El protocolo NTP se estructura de una forma jerárquica donde un mismo equipo o nodo de la red puede actuar como cliente y servidor al mismo tiempo. Como servidor atiende las peticiones NTP de los equipos inferiores y como cliente solicita el tiempo con mayor precisión a los equipos superiores tal y como se muestra en la siguiente figura. También algunos equipos pueden funcionar en modo 'peer' obteniendo el reloj de otro servidor pero pudiendo, a su vez, entregar el reloj a dicho servidor si así éste lo solicita.

Tal y como se muestra en la figura, el reloj o sincronismo se va degradando a medida que bajamos de nivel ya que cada transacción cliente/servidor implica una pérdida de precisión derivada de los retardos variables de transmisión y de proceso de los paquetes NTP en cada uno de los nodos intermedios. A mayor número Stratum, menor precisión del reloj.

Formato de los paquetes NTP


En la siguiente figura se muestra el formato y contenido del paquete NTP reply en versión 4 que entrega un servidor NTP a petición de cualquier cliente. Los paquetes NTP se encapsulan en UDP y típicamente usan el puerto 123.

[caption id="attachment_681" align="aligncenter" width="826"] Fuente: Wikipedia[/caption]

A continuación describimos los campos en detalle.


LILeap Indicator (2 bits)
Este campo indica si el último minuto del día actual debe tener un 'leap second'. Los valores son:
0: Sin ajuste leap second (60 segundos)
1: El último minuto del día tiene 61 segundos
2: El último minuto del día tiene 59 segundos
3: Reloj NO sincronizado
VNNTP Version (3 bits) (la última versión es 4).
ModeModo de funcionamiento del nodo NTP (3 bits)
0: Reservado
1: Simétrico activo
2: Simétrico pasivo
3: Cliente
4: Servidor
5: Broadcast
6: NTP control message
7: Reservado para uso privado
StratumNivel Stratum de la fuente de sincronismo (8 bits)
0: Sin especificar o no válido
1: Servidor primario (GPS o reloj atómico)
2–15: Servidor secundario (NTP o SNTP)
16: No sincronizado
17–255: Reservado
PollPoll interval (8-bit signed integer)

Es un entero de 8 bits con signo que indica el intervalo máximo de tiempo entre dos mensajes sucesivos, expresado en segundos y como la potencia de 2 más cercana. La mayoría de las aplicaciones usan el rango que va desde 6 bits (64 seg) a 10 (1024 seg)
PrecisionPrecisión del reloj (8-bit signed integer)

Es un entero con signo que indica la precisión del reloj local expresado en segundos 1/2^Precicion
Root DelayEl retardo de ida y vuelta entre el servidor y la fuente primaria de reloj. El valor es un decimal de 32-bit con signo expresado en segundos y con la parte fraccional entre los bits 15 y 16. Este campo es sólo significativo en los mensajes entre servidores.
Root Dispersion   Es el error máximo debido a la dispersión en frecuencia del reloj. El valor es un decimal de 32-bit con signo expresado en segundos y con la parte fraccional entre los bits 15 y 16. Este campo es sólo significativo en los mensajes entre servidores.
Reference IdentifierPara los servidores Stratum 1 es una cadena de 4 caracteres que indica el tipo de fuente según la tabla siguiente. Para servidores secundarios es dirección IPV4 de 32 bits que apunta al servidor NTP fuente o bien los primeros 32 bits del Message Digest Algorithm 5 (MD5) hash de la dirección IPv6 de dicha fuente de sincronización (sólo para versiones 4 de NTP)

Tabla para identificadores de referencia de relojes Stratum 1

A continuación mostramos una captura de un paquete NTP realizada con Wireshark donde podemos verificar los campos antes descritos.

Timestamps y cómo se calcula la fecha y hora actuales


En NTP calculamos la fecha y hora actuales a través de los timestamps. El timestamp es un número de 64 bits (versión 3 de NTP) o 128 bits (versión 4 de NTP). De estos bits, los 32 o 64 primeros bits los usamos como potencia de 2 para indicar el tiempo en segundos transcurridos desde las 0:00 del 1 de Enero de 1900. Los segundos 32 o 64 bits se utilizan para indicar la fracción del segundo actual.

En NTP versión 3 podemos estimar 2^32 = 4.294.967.296 segundos que corresponden a algo más de 136 años. Por tanto con NTP v3 podemos mostrar fechas hasta el 7 de Febrero del 2036 = 1900+136. Igualmente podemos estimar la fracción del segundo hasta 1/(2^32) = 232 picosegundos. En la realidad los tiempos de proceso y transmisión de la información nunca nos permitirán este nivel de precisión.

Si queréis ampliar la información sobre cómo se calculan los tiempos en NTP podéis ver la página de David L. Mills

En los paquetes NTP incluimos timestamps que utilizamos para calcular el offset o variación respecto a la medición anterior en el cliente según el cálculo siguiente tal y como se mostraba en la primera figura del post:

T1=Origin Timestamp (on client)
T2=Receive Timestamp (on server)
T3=TransmitTimestamp (on server)
T4=DestinationTimestamp = ReceiveTimestamp (on client)
offset = [ (T2-T1) + (T3-T4) ] / 2

En el cálculo del offset asumimos un retardo en la red simétrico al dividir el RTD (Round Trip Delay) por 2. Este offset puede ser especialmente relevante cuando el servidor se encuentra en Internet o usamos un medio de transmisión de baja velocidad (RTC, RDSI o satélite).

NTP Versión 3 y NTP Versión 4


NTP versión 4 surgió como evolución de la versión 3 pero mantiene la interoperabilidad con sistemas basados en la versión anterior. Las principales diferencias son:
  • permite el direccionamiento IPV6 entre clientes y servidores

  • permite incorporar seguridad a las comunicaciones a través de la encriptación de los paquetes NTP con una clave pública simétrica

  • modifica el tipo de datos para los timestamps de 64 bits formato fijo a 64 bits en coma flotante para  reducir el tamaño del paquete y aumentar el rango de valores disponibles

  • la referencia de tiempo se amplia con los conceptos de era y offset era

  • se añade un sistema automático para descubrir, configurar y autenticar servidores y clientes sin necesidad de especificarlos manualmente. En modo multicast un servidor NTP envía paquetes a intervalos regulares usando un grupo específico multicast

Nuestros servidores en NTP


En DAVANTEL tenemos diferentes servidores NTP que actúan como relojes Stratum 1 al disponer de receptor GPS integrado.

La familia GPS NTP son simples servidores NTP versión 3 con un receptor GPS activo que se alimenta a través de cable UTP desde el propio servidor NTP. Son de bajo coste y especialmente adecuados para pequeñas instalaciones donde no necesitemos una gran estabilidad en ausencia de señal GPS.



También disponemos de servidores NTP/PTP de mayor precisión al incorporar un oscilador OCXO capaz de mantener con mayor exactitud y mayor tiempo la hora en ausencia de señal GPS.

No hay comentarios: