Protocolos de hora
Máquinas contam a hora pela rede de vários jeitos: NTP, o protocolo Time (porta 37), Daytime (porta 13) e o cabeçalho Date do HTTP. Os mais antigos contam segundos desde 1900.
Um servidor revela o relógio dele por vários serviços:
| Serviço | Porta | O que manda |
|---|---|---|
| NTP | UDP 123 | Carimbos de 64 bits: 32 bits de segundos desde 1900 e 32 de fração |
| Time (RFC 868) | TCP ou UDP 37 | 4 bytes: segundos desde 1900, em big-endian |
| Daytime (RFC 867) | TCP ou UDP 13 | A data e a hora em texto |
| HTTP | TCP 80 ou 443 | O cabeçalho Date: de cada resposta |
O Time é o mais simples: basta conectar, e o servidor manda os 4 bytes e fecha.
$ nc time.nist.gov 37 | xxd
00000000: ee8b f552
Duas épocas. NTP e Time contam desde 1º de janeiro de 1900, 00:00 UTC. O relógio Unix (e o date, e o time.time() do Python) conta desde 1º de janeiro de 1970. A diferença é de 70 anos, com 17 anos bissextos: 25.567 dias, ou 2.208.988.800 segundos. Para converter:
$ date -u -d @$((0xee8bf552 - 2208988800)) +%FT%TZ
2026-10-28T04:15:14Z
Em Python: datetime.datetime(1900, 1, 1, tzinfo=datetime.timezone.utc) + datetime.timedelta(seconds=0xee8bf552).
O limite de 32 bits. O maior número de 32 bits, 0xFFFFFFFF (4.294.967.295), contado desde 1900, cai no começo de fevereiro de 2036: é ali que a contagem de segundos do NTP dá a volta (o fim da "era 0"). O relógio Unix de 32 bits com sinal tem o mesmo problema em 2038-01-19T03:14:07Z.
Na prática, relógio errado quebra a linha do tempo de um incidente (os logs de máquinas diferentes deixam de bater), a validação de certificados TLS e a autenticação Kerberos. E o relógio de um servidor, exposto por um desses serviços, é mais uma pista sobre ele.