El Network Time Protocol mantiene los relojes de sistemas y dispositivos alineados con una referencia global, evitando desviaciones que afectarían certificados, registros de auditoría y procesos distribuidos.
NTP utiliza el puerto 123/UDP y una jerarquía de servidores que distribuyen el tiempo desde fuentes altamente precisas (relojes atómicos o GPS) hasta equipos finales en redes corporativas y hogares.
Cada paquete NTP contiene marcas de tiempo que permiten calcular el desplazamiento y la deriva del reloj local. A partir de estas mediciones, el cliente corrige su reloj mediante ajustes graduales, evitando saltos bruscos que podrían afectar sistemas sensibles.
La precisión final depende de la latencia y estabilidad de la red; en LAN se alcanzan microsegundos, mientras que en Internet suele medirse en milisegundos.
NTP organiza los servidores en niveles denominados stratum:
| Stratum | Fuente | Ejemplos |
|---|---|---|
| 0 | Relojes de referencia (GPS, cesio). | Osciladores de laboratorio. |
| 1 | Servidores conectados directamente a stratum 0. | Centros de datos nacionales, universidades. |
| 2 | Servidores que obtienen tiempo de stratum 1. | Proveedores regionales, empresas. |
| 3+ | Equipos que encadenan la sincronización. | Hosts finales. |
Cuanto más bajo es el stratum, más cercana es la referencia al tiempo real. Los clientes suelen elegir varios servidores para promediar resultados y detectar fuentes defectuosas.
El tiempo correcto es crítico porque:
Desalineaciones superiores a minutos pueden impedir el inicio de sesión o generar alertas falsas en plataformas de seguridad.
Los sistemas Unix y Linux ofrecen ntpd y chrony, mientras que Windows utiliza el servicio W32Time. Para sincronizaciones puntuales se emplea ntpdate
o el comando w32tm. Ejemplo rápido con ntpdate:
sudo ntpdate -u pool.ntp.org
La opción -u obliga a utilizar puertos efímeros para evitar bloqueos con firewalls estrictos.
chrony es popular en distribuciones modernas por su rapidez para converger. La configuración básica se ubica en /etc/chrony.conf:
pool pool.ntp.org iburst
makestep 1.0 3
allow 192.168.0.0/24
El comando chronyc sources -v muestra el estado de cada servidor, su stratum y la precisión lograda.
Windows permite consultar y forzar la sincronización mediante:
w32tm /query /status
w32tm /query /peers
w32tm /resync
Estas instrucciones informan el servidor de referencia, el desfase actual y reactivan la sincronización en caso de que estuviera detenida.
Para comprobar rápidamente la diferencia de tiempo desde un script se puede utilizar socket y struct:
import socket
import struct
import time
server = ("pool.ntp.org", 123)
msg = b"\x1b" + 47 * b"\0"
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.settimeout(3)
sock.sendto(msg, server)
data, _ = sock.recvfrom(48)
segundos = struct.unpack("!12I", data)[10]
unix_time = segundos - 2208988800
desfase = unix_time - time.time()
print(f"Diferencia estimada: {desfase:.3f} segundos")
El script realiza una consulta simple (modo cliente) y calcula la diferencia entre el reloj local y el del servidor NTP.
Para operar NTP de forma confiable se recomienda usar múltiples servidores, monitorear el desfase, proteger el puerto 123 contra ataques de amplificación y evitar que los clientes externos puedan abusar de los recursos internos. Es conveniente documentar la jerarquía de stratum utilizada y verificar periódicamente la salud de las fuentes de tiempo.
Gracias a estas medidas, NTP garantiza la coherencia temporal necesaria para la mayoría de los servicios modernos, desde firmas digitales hasta transacciones financieras.