O NTP é um protocolo para sincronização dos relógios dos computadores baseado no protocolo UDP sob a porta 123. É utilizado para sincronização do relógio de um conjunto de computadores e dispositivos em redes de dados com latência variável. O NTP permite manter o relógio de um computador sincronizado com a hora sempre certa e com precisão de milisegundos. Foi originalmente idealizado por David L. Mills da Universidade do Delaware e ainda hoje é mantido por ele e por uma equipe de voluntários. O NTP foi utilizado pela primeira vez antes de 1985, sendo ainda hoje muito popular e um dos mais antigos protocolos da Internet.
Importância do NTP
Uma característica básica e ao mesmo tempo importante do tempo é que ele sempre avança. O tempo não para e não volta atrás. Vários programas de computador fazem uso dessa característica e podem ter seu funcionamento comprometido se o relógio do computador inesperadamente passar a indicar um horário errado, especialmente se for um horário no passado. Isso se complica ainda mais na Internet, com vários computadores trocando informações entre si!
Diferentes softwares e aplicações podem ser sensíveis a problemas relativos à sincronização do tempo de formas diversas. Como exemplos de aplicações afetadas pelo tempo pode-se citar: Sistemas de distribuição de conteúdo (www, usenet news, etc); Sistemas de arquivos (filesystems); Agendadores de eventos como o cron e o at dos sistemas unix; Criptografia; Protocolos de comunicação e aplicações de tempo real; Sistemas transacionais e bancos de dados distribuídos.
É importante também do ponto de vista de segurança de redes que os relógios dos computadores estejam sincronizados. Investigações relacionadas a incidentes de segurança tornam-se impossíveis caso os servidores envolvidos e os diversos arquivos de log discordem entre si em relação às estampas de tempo dos eventos.
Para algumas aplicações exatidão da ordem de segundos pode ser suficiente. Para outras, é necessário manter os relógios com diferenças na ordem dos milisegundos entre si e em relação à hora certa.
O NTP, se corretamente utilizado, é capaz de garantir as propriedades necessárias ao relógio do computador para o bom funcionamento das aplicações. Num primeiro momento isso pode parecer algo muito simples: "consultar o tempo em um servidor" e "ajustar o relógio local" de tempos em tempos. Mas na verdade o NTP faz muito mais do que isso. Diversos componentes do sistema colaboram para: Obter, a partir de diversas amostras, informações de tempo de um determinado servidor, como o deslocamento, dispersão e variação. Discernir, dentre um conjunto de servidores, quais fornecem o tempo correto e quais estão mentindo. Escolher, dentre os servidores que fornecem o tempo correto, qual é a melhor referência. Disciplinar o relógio local, descobrindo seus principais parâmetros de funcionamento, como precisão, estabilidade e escorregamento e ajustando-o de forma contínua e gradual, mesmo na ausência temporária de referências de tempo confiáveis, para que tenha e melhor exatidão possível. Garantir a monotonicidade do tempo. Identificar, a partir de métodos criptográficos, servidores de tempo conhecidos e confiáveis, evitando possíveis ataques. Formar, em conjunto com outros servidores NTP, uma topologia simples, confiável, robusta e escalável para a sincronização de tempo.
Os relógios de computador
Os relógios de computadores, como quaisquer outros relógios, são baseados em 3 dispositivos:
um oscilador; um contador; e um dispositivo de leitura ou visualização.
O oscilador é um dispositivo que gera eventos cíclicos a uma taxa constante, chamada de freqüência. Normalmente os osciladores dos computadores são baseados em cristais de quartzo. O contador acumula os ciclos gerados pelo oscilador, geralmente utilizando-se de interrupções de hardware, convertendo-os em unidades de medida conhecidas, como segundos, minutos, horas. Cada valor do contador é chamado de estampa de tempo. A "visualização" ou leitura é feita através de rotinas de software.
Algumas propriedades importantes dos relógios
Exatidão: (Accuracy) É quanto o relógio está próximo à referência. Ou seja, indica se o relógio está "certo" ou "errado" ou melhor: quanto o relógio está "certo" ou "errado". Precisão (Precision), Resolução (Resolution) e Granularidade (granularity): Por resolução, se entende o valor do menor incremento possível do contador do relógio. A resolução de um relógio de computador é determinada pela freqüência das interrupções de hardware que fazem funcionar o contador. Os valores normalmente variam entre 100 Hz e 1 kHz, o que resulta em resoluções de 10 ms a 1 ms.
Em alguns casos é possível utilizar outras fontes de freqüência (maiores), como por exemplo o relógio da CPU, para interpolar os valores obtidos pelo relógio do sistema, conseguindo assim uma resolução melhor. Isso geralmente é chamado de granularidade do relógio. Com isso, resoluções de aproximadamente 1µs são possíveis.
Por precisão, entende-se geralmente o menor incremento de tempo que pode ser lido pelo computador. Pode ser um valor maior do que a resolução, já que ler o relógio é uma tarefa realizada por software e há um certo tempo e incerteza envolvidos nela. Ou pode ser menor, quando o software consegue ler o relógio mais rápido do que esse pode contar.
No contexto do NTP, precisão é o maior desses valores. Ou seja, precisão, no NTP, engloba os conceitos de precisão, resolução e granularidade vistos acima. É o menor incremento de relógio que se pode conseguir na prática em um determinado equipamento.
Dispersão: (Dispersion) É o desvio ou erro estimado nas leituras do relógio. Pode ser causado por flutuações de curta duração na freqüência do oscilador, por erros de medida ocasionados por excesso de utilização do processador, latência causada por interrupções, latência na rede, etc. No NTP a dispersão (dispersion) é estimada localmente e informada pelo servidor ao cliente na troca de mensagens. Variação: (Jitter) É o desvio ou erro nas leituras de relógio. Pode ser causado por flutuações de curta duração na freqüência do oscilador, por erros de medida ocasionados por excesso de utilização do processador, latência causada por interrupções, latência na rede, etc. No NTP a variação (jitter) é estimada pelo cliente, a partir das diversas medidas de deslocamento (offset) para um determinado servidor. O NTP também calcula uma variação (jitter) para o sistema como um todo, com base na variação dos servidores utilizados. Deslocamento: (Offset ou time offset) É a diferença de tempo entre dois relógios. No NTP, o deslocamento representa o quanto o relógio local deve ser alterado para estar com o valor igual ao da referência de tempo. Escorregamento: (Drift) É a instabilidade na freqüência do oscilador. Ou seja, quanto a freqüência do relógio varia com o tempo. Essa instabilidade pode ser causada por fatores externos, como variações na radiação, pressão, temperatura ou umidade e pelo envelhecimento (ageing). Monotonicidade: (Monotonicity) Cada leitura sucessiva do relógio deve apresentar um tempo mais no futuro do que a leitura anterior. Ou seja, o tempo sempre avança. Sincronização: (Synchronization) É o processo de ajustar a fase de dois osciladores, relógios, ou fluxos de dados de forma que a diferença entre eles seja nula. A palavra pode ser usada também para indicar a propriedade de haver ou não diferenças de deslocamento entre dois relógios. Ao sincronizar dois relógios não se garante que a diferença entre eles permanecerá nula ao longo do tempo. Sintonização: (Syntonization) É o processo de ajustar dois osciladores para que forneçam a mesma freqüência. Esse processo não garante que a fase seja a mesma. Ao sintonizar os osciladores de dois relógios, se as freqüências permanecerem constantes dali em diante, as diferenças de deslocamento também permanecerão.
Funcionamento do NTP A topologia do NTP
thumb|350px|right|As setas amarelas indicam uma conexão direta, por um sinal de IRIG, por exemplo; setas vermelhas indicam uma conexão de rede.
Os servidores NTP formam uma topologia hierárquica, dividida em camadas ou estratos (em inglês: strata) numerados de 0 (zero) a 16 (dezesseis). O estrato 0 (stratum 0) na verdade não faz parte da rede de servidores NTP, mas representa a referência primária de tempo, que é geralmente um receptor do Sistema de Posicionamento Global (GPS) ou um relógio atômico. O estrato 16 indica que um determinado servidor está inoperante.
O estrato 0, ou relógio de referência, fornece o tempo correto para o estrato 1, que por sua vez fornece o tempo para o estrato 2 e assim por diante. O NTP é então, simultaneamente, servidor (fornece o tempo) e cliente (consulta o tempo), formando uma topologia em árvore.
Os tipos de associação possíveis As relações entre os diferentes dispositivos NTP são normalmente chamadas de Associações. Elas podem ser: Permanentes: são criadas por uma configuração ou comando e mantidas sempre. Priorizáveis (preemptables): são específicas da versão 4 do NTP e criadas por uma configuração ou comando, podem ser desfeitas no caso de haver um servidor melhor, ou depois de um certo tempo. Efêmeras ou transitórias: são criadas por solicitação de outro dispositivo NTP e podem ser desfeitas em caso de erro ou depois de um certo tempo.
São possíveis as seguintes Associações: Cliente - Servidor: (client - server) É uma associação permanente e a forma mais comum de configuração. Um dispositivo faz o papel de cliente, solicitando informações sobre o tempo a um servidor. O cliente tem conhecimento das associações com os servidores e do estado da troca de pacotes. Outro dispositivo faz o papel de servidor, respondendo à solicitação do cliente com informações sobre o tempo. O servidor não armazena informações sobre o diálogo com o cliente ou sobre sua associação com o mesmo. Modo simétrico: (symmetric mode) Dois ou mais dispositivos NTP podem ser configurados como pares (peers), de forma que possam tanto buscar o tempo, quanto fornecê-lo, garantindo redundância mútua. Essa configuração faz sentido para dispositivos no mesmo estrato, configurados também como clientes de um ou mais servidores. Caso um dos pares perca a referência de seus servidores, os demais pares podem funcionar como referência de tempo. O modo simétrico pode ser: Ativo: O dispositivo A configura o dispositivo B como seu par (criando dessa forma uma associação permanente). Por sua vez, o dispositivo B também configura o dispositivo A como seu par (também cria uma associação permanente). Passivo: O dispositivo A configura o dispositivo B como seu par (modo simétrico ativo). Mas o dispositivo B não tem o dispositivo A na sua lista de servidores ou pares. Ainda assim, ao receber um pacote de A, o dispositivo B cria uma associação transitória, de forma a poder fornecer ou receber o tempo de A. Broadcast ou Multicast: oNTP pode fazer uso de pacotes do tipo broadcast ou multicast para enviar ou receber informações de tempo. Esse tipo de configuração pode ser vantajosa no caso de redes locais com poucos servidores alimentando uma grande quantidade de clientes.
A Troca de Mensagens e o cálculo do Deslocamento
As mensagens do NTP são baseadas no protocolo UDP. A troca de mensagens entre cliente e servidor permite que o cliente descubra qual seu deslocamento (offset) em relação ao servidor, ou seja, o quanto seu relógio local difere do relógio do servidor.
Consideremos servidor e cliente com relógios não sincronizados. A troca de mensagens dá-se da seguinte forma:
O Cliente lê seu relógio, que fornece o tempo a. O Cliente envia a Mensagem 1 com a informação de tempo a para o servidor. O Servidor recebe a Mensagem 1 e nesse instante lê seu relógio, que fornece o instante x. O Servidor mantém a e x em variáveis. O Servidor após algum tempo lê novamente seu relógio, que fornece o instante y. O Servidor envia a Mensagem 2 com a, x e y para o cliente.