Uma importante propriedade do tempo é sua monotonicidade, que significa que o tempo sempre avança. Essa parece ser uma propriedade simples, óbvia e fácil de ser mantida, mas de fato não é. Relógios implementados em software, como é o caso dos relógios utilizados pelos diversos Sistemas Operacionais, podem ser facilmente ajustados, intencionalmente ou não, para representar um tempo no passado.

Diferentes softwares e aplicações podem ser sensíveis a problemas relativos à sincronização do tempo de formas diversas. Dentre os possíveis problemas com a sincronização, podemos considerar:

  • um computador, ou grupo de computadores, com o tempo diferente da hora legal;
  • um computador cujo tempo foi ajustado para o passado;
  • um grupo de computadores discordando entre si quanto ao tempo correto (isso implica que ao menos n-1integrantes desse grupo terão o tempo diferente da hora legal, implica também que haverá computadores para os quais, tendo como referência seu relógio local, o relógio de um ou mais de seus companheiros de grupo, estará no passado).

Quando se trata de um computador isolado a exatidão em relação à uma referência de tempo como a hora legal brasileira não é tão importante. Nesse caso o mais importante é manter a monotonicidade do tempo. Além disso, eventuais ajustes no relógio devem ser, sempre que possível, graduais. Saltos no tempo, mesmo de alguns poucos segundos, para o futuro podem ser ruins, e para o passado, desastrosos.

Como exemplos de aplicações afetadas pelo tempo pode-se citar:

  • Sistemas de distribuição de conteúdo (www, usenet news, etc): Utilizam estampas de tempo para controlar a expiração dos documentos e o cache. Servidores com o tempo errado podem causar perda de informações ou impedir o acesso às mesmas.
  • Sistemas de arquivos (filesystems): Alguns eventos importantes como a criação e modificação de arquivos são marcados por estampas de tempo. Algumas aplicações lêem essas informações e delas dependem. Se alguma dessas datas estiver no futuro, as aplicações podem agir de forma indevida, ou mesmo deixar de funcionar por completo. Como exemplos de aplicações sensíveis a essa situação pode-se citar os sistemas de controle de versão (como o cvs), sistemas de compilação automática (make), sistemas de backup de dados e sistemas de banco de dados.
  • Agendadores de eventos: Aplicações como o cron e o at dos sistemas unix dependem do tempo correto para funcionarem.
  • Criptografia: Muitas técnicas criptográficas fazem uso de estampas de tempo para os eventos e chaves para prevenir alguns tipos de ataques. Se os computadores envolvidos não estiverem sincronizados entre si, a autenticação e comunicação criptografada podem falhar.
  • Protocolos de comunicação e aplicações de tempo real: Essas aplicações, que incluem as Interfaces Gráficas, fazem uso de filas de eventos, timeouts, timers, e outros recursos de software ligados ao tempo. Para seu correto funcionamento é necessário garantir a monotonicidade, uma boa resolução, e a continuidade (ausência de saltos) no tempo.
  • Sistemas transacionais e bancos de dados distribuidos: Dependem de relógios exatos e muitas vezes, de sua sincronia com a hora legal. Como exemplo dessas aplicações pode-se citar o Home Banking, o Home Broker, os sistemas EDI, etc. As bolsas de valores, por exemplo, tem horários bem definidos de início e término do pregão. A Receita Federal aceita as declarações de Imposto de Renda geralmente até a meia noite da data limite para a entrega.

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

Em fim, diferentes softwares e aplicações são sensíveis ao tempo e à sincronização entre as entidades envolvidas de forma diversa. 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 à referência legal. Propriedades como a monotonicidade, resolução e precisão dos relógios, que serão detalhadas adiante, também são importantes. O NTP, se corretamente utilizado, é capaz de garantir as propriedades necessárias ao relógio do computador para o bom funcionamento das aplicações.

Read More

 

Como os relógios de computadores trabalham.

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, ou timestamp.

A “visualização” ou leitura é feita através de rotinas de software.

Propriedades importantes dos relógios.

OBS: nas definições abaixo utiliza-se o comando ntpq da distribuição do NTP para exemplificar o acesso às variaveis do sistema ligadas a cada conceito. Para mais detalhes sobre essa ferramenta, deve-se acessar a seção Utilizando. 

  • 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”.Se um relógio de computador funciona de forma isolada sua exatidão tende a piorar com o tempo, por conta de erros sistemáticos na freqüência. O relógio atrasa ou adianta conforme o tempo passa. Um relógio típico de computador, se funcionando livremente, pode adiantar-se ou atrasar-se desde alguns segundos até cerca de 1 minuto por semana.

    Para garantir uma melhor exatidão, a alternativa é disciplinar o relógio em relação à fontes de tempo e freqüência mais confiáveis, o que pode ser feito com o NTP. Disciplinar o relógio signifca que ele é sincronizado (fase) e sintonizado (freqüência) com uma fonte mais estável de tempo.

    Atenção: muitas vezes se utiliza a palavra precisão, erroneamente, como sinônimo de exatidão. No contexto do NTP exatidão e precisão são coisas totalmente diferentes.

  • 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 100Hz e 1Khz, o que resulta em resoluções de 10ms a 1ms.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, conseguindo assim uma resolução melhor. Isso geralmente é chamado de granularidade do relógio. Com isso, resoluções de aproximadamente 1µs são comuns hoje. Implementações de software como o nanokernel, que hoje é parte integrante do FreeBSD e do Linux, permitem resoluções da ordem de nanosegundos.

    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.

    O NTP calcula a precisão e a armazena numa variável no formato de uma potência de 2. Ou seja, se o comandontpq -c rl, que mostra as variáveis do sistema, retornar precision=-16, a precisão é de aproximadamente 2-16s = 15µs.

    No exemplo abaixo, em que são consultadas as variáveis locais do NTP, a precisão é de 2-20s = 0,95µs:[email protected]:~$ ntpq -c rl
    assID=0 status=0644 leap_none, sync_ntp, 4 events, event_peer/strat_chg,
    version=”ntpd [email protected] Wed Mar 7 20:43:30 UTC 2007 (1)”,
    processor=”i686″, system=”Linux/2.6.20-16-generic”, leap=00, stratum=2,
    precision=-20, rootdelay=0.459, rootdispersion=12.089, peer=39324,
    refid=200.160.7.183,
    reftime=cac0ac02.e91dfecc Wed, Oct 17 2007 14:42:58.910, poll=6,
    clock=cac0ac7a.40d41c89 Wed, Oct 17 2007 14:44:58.253, state=4,
    offset=-6.896, frequency=48.637, jitter=1.337, noise=1.627,
    stability=0.067, tai=0
    Atenção: muitas vezes se confunde a palavra precisão, atribuindo-se a ela indevidamente o conceito deexatidão. No contexto do NTP exatidão e precisão são coisas totalmente diferentes.

  • 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 contexto do NTP a dispersão (dispersion) é estimada localmente e informada pelo servidor ao cliente na troca de mensagens.

    No exemplo abaixo, são consultadas as variáveis da conexão entre o computador.local e o servidor1. Oservidor1 calcula a dispersão (dispersion) como sendo de 2,988ms e informa ao computador.local, que é o cliente. A dispersão para a raiz (rootdispersion) de 0,381ms é o valor estimado pelo servidor1 da dispersão acumulada até a referência primaria de tempo, no caso o sinal IRIG de um relógio atômico.
    [email protected]:~$ ntpq

    ntpq> rv &1
    assID=39324 status=9614 reach, conf, sel_sys.peer, 1 event, event_reach,
    srcadr=servidor1, srcport=123, dstadr=computador.local, dstport=123,
    leap=00, stratum=1, precision=-19, rootdelay=0.000,
    rootdispersion=0.381, refid=IRIG, reach=377, unreach=0, hmode=3,
    pmode=4, hpoll=6, ppoll=6, flash=00 ok, keyid=0, ttl=0, offset=-5.484,
    delay=0.450, dispersion=2.988, jitter=0.162,
    reftime=cac0db20.22c94d0a Wed, Oct 17 2007 18:04:00.135,
    org=cac0db2a.e7dce26e Wed, Oct 17 2007 18:04:10.905,
    rec=cac0db2a.e946172a Wed, Oct 17 2007 18:04:10.911,
    xmt=cac0db2a.e9233c69 Wed, Oct 17 2007 18:04:10.910,
    filtdelay= 0.46 0.48 0.49 0.47 0.45 0.47 0.48 0.48,
    filtoffset= -5.28 -5.29 -5.33 -5.39 -5.48 -5.56 -5.62 -5.71,
    filtdisp= 0.00 0.98 1.92 2.87 3.86 4.80 5.76 6.75

    No exemplo abaixo, onde são consultadas as variáveis locais do NTP, a dispersão para a raiz (rootdispersion) é calculada como sendo de 18,547ms.

    ntpq> rl
    assID=0 status=0644 leap_none, sync_ntp, 4 events, event_peer/strat_chg,
    version=”ntpd [email protected] Wed Mar 7 20:43:30 UTC 2007 (1)”,
    processor=”i686″, system=”Linux/2.6.20-16-generic”, leap=00, stratum=2,
    precision=-20, rootdelay=0.434, rootdispersion=18.547, peer=47414,
    refid=servidor1,
    reftime=cac0eba0.695f54c0 Wed, Oct 17 2007 19:14:24.411, poll=7,
    clock=cac0ee6b.171df1b1 Wed, Oct 17 2007 19:26:19.090, state=4,
    offset=-3.372, frequency=41.693, jitter=0.791, noise=0.754,
    stability=0.021, tai=0

  • 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 contexto do NTP a variação (jitter) é estimada pelo cliente, à partir das diversas medidas de deslocamento(offset) para um determinado servidor.

    [email protected]:~$ ntpq -c pe
    remote refid st t when poll reach delay offset jitter
    ==============================================================================
    *servidor1 .IRIG. 1 u 93 128 377 0.523 0.020 0.033
    +servidor2 .GPS. 1 u 57 128 377 0.488 -0.054 0.025
    -servidor3 .IRIG. 1 u 50 128 377 5.151 -0.386 0.382
    +servidor4 .IRIG. 1 u 74 128 377 5.163 -0.360 0.559

    O NTP também calcula uma variação (jitter) para o sistema como um todo, com base na variação dos servidores utilizados:

    [email protected]:~$ ntpq -c rl
    assID=0 status=0644 leap_none, sync_ntp, 4 events, event_peer/strat_chg,
    version=”ntpd [email protected] Wed Mar 7 20:43:30 UTC 2007 (1)”,
    processor=”i686″, system=”Linux/2.6.20-16-generic”, leap=00, stratum=2,
    precision=-20, rootdelay=0.434, rootdispersion=18.547, peer=47414,
    refid=servidor1,
    reftime=cac0eba0.695f54c0 Wed, Oct 17 2007 19:14:24.411, poll=7,
    clock=cac0ee6b.171df1b1 Wed, Oct 17 2007 19:26:19.090, state=4,
    offset=-3.372, frequency=41.693, jitter=0.791, noise=0.754,
    stability=0.021, tai=0

  • Deslocamento: (Offset ou time offset) É a diferença de tempo entre dois relógios.No contexto do NTP, o deslocamento (offset) é medido em relação ao relógio local em milisegundos. O valor do deslocamento para o servidor escolhido como referência (servidor indicado pelo asterisco) representa o quanto o relógio local deve ser alterado para estar com o valor igual ao da referência de tempo (estrato 0).

    No exemplo abaixo o relógio local deve ser adiantado 20µs.

    usuario@servidor:~$ ntpq -c pe
    remote refid st t when poll reach delay offset jitter
    ==============================================================================
    *server1 .IRIG. 1 u 93 128 377 0.523 0.020 0.033
    +server2 .GPS. 1 u 57 128 377 0.488 -0.054 0.025
    -server3 .IRIG. 1 u 50 128 377 5.151 -0.386 0.382
    +server4 .IRIG. 1 u 74 128 377 5.163 -0.360 0.559

  • Envelhecimento: (Aging ou Ageing) É a instabilidade na freqüência do oscilador causada por fatores internos. Ou seja, quanto a freqüência do relógio varia com o tempo quando os fatores externos como radiação, pressão, temperatura e umidade são mantidos constantes.O envelhecimento (ageing) de um relógio atômico de rubídio é da ordem de 5×10-11/ano, enquanto os relógios atômicos de césio modernos não apresentam envelhecimento.
  • 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).
  • Estabilidade: (Stability ou Frequency Stability ou Wander) É a estimativa estatística da instabilidade na frequência do oscilador num determinado período de tempo.Algumas referências afirmam que estabilidade (stability) é sinônimo de escorrregamento (drift). E mesmo que escorregamento (drift) e envelhecimento (ageing) são sinônimos.

    Outras consideram que há diferenças entre a instabilidade originada de erros sistemáticos, causados por fatores internos ou de ambiente, e a que é originada por erros estocásticos ou aleatórios, causados principalmente pela forma de medição.

    A estabilidade pode ser de curto prazo, que envolve períodos de menos de 100s. Ou de longo prazo, com estimativas para períodos maiores do que 100s.

    O NTP calcula a estabilidade com base na diferença ou deslocamento da freqüência das amostras de tempo obtidas de cada servidor. Ela é medida em PPM (Partes por milhão). 1 PPM = 1×10-6.

    No exemplo abaixo a estabilidade é de 0,021PPM, o que equivale a um desvio de cerca de 1,8ms por dia (0,021 x 10-6 x 1000ms/s x 60s/min x 60min/h x 24h/dia = 1,8ms/dia).

    [email protected]:~$ ntpq

    ntpq> rl
    assID=0 status=0644 leap_none, sync_ntp, 4 events, event_peer/strat_chg,
    version=”ntpd [email protected] Wed Mar 7 20:43:30 UTC 2007 (1)”,
    processor=”i686″, system=”Linux/2.6.20-16-generic”, leap=00, stratum=2,
    precision=-20, rootdelay=0.434, rootdispersion=18.547, peer=47414,
    refid=servidor1,
    reftime=cac0eba0.695f54c0 Wed, Oct 17 2007 19:14:24.411, poll=7,
    clock=cac0ee6b.171df1b1 Wed, Oct 17 2007 19:26:19.090, state=4,
    offset=-3.372, frequency=41.693, jitter=0.791, noise=0.754,
    stability=0.021, tai=0

  • 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. Isso é natural para relógios implementados em hardware, mas implementações em software tornam possível ajustar o tempo para um valor no passado, o que pode causar problemas em várias aplicações e protocolos. Em alguns casos, garantir a monotonicidade é mais importante do que garantir a exatidão.
  • 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.