středa 19. srpna 2015

Network Time Protocol v kostce

Teorie

Network Time Protocol je protokol pro synchronizaci času v internetu. Na straně klienta běží deamon (služba) který se podle různých pravidel dotazuje na patřičný server, za účelem zjištění přesného času. Samozřejmě je nutné počítat se zpožděním v síti. Počátek protokolu sahá až do roku 1979, kdy bylo znatelné zpoždění celkem běžný jev. Server i klient využívají port UDP/123.
Algoritmus určení přesného času funguje tak, že klient vypočítá vůči serveru tzv round-trip delay time, což je čas který uplyne mezi odesláním požadavku a jeho přijetím na serveru a zároveň časem, který uplyne mezi odeslání odpovědi ze serveru a jeho přijetím u klienta. Zjednodušeně tedy "cesta tam a zpět". Round-trip delay time se jednoduše spočítá z časových značek které jsou přenášeny v datagramech.
 Dále je potřeba vypočítat odchylku mezi hodnotou času při odeslání a hodnotou času při přijetí přesného času. Uvažujme, že server odešle zprávu kde je hodnota přesného času. Klient tuto zprávu obdrží, ale až za nějaký čas, protože se zpráva zpozdila vlivem zpoždění v každé reálné počítačové síti. Klient tedy vždy obdrží hodnotu "přesného času" ale ta již reálně neplatí, protože odkazuje na čas v minulosti, kdy byla zpráva vytvořena a odeslána ze serveru. Toto řeší výpočet odchylky (offset) z hodnot round-trip delay time, konkrétní vzorce lze nalézt v [1].

Ukázka odesílaných dat z NTP serveru.
Architektura NTP serverů počítá s dělením na tzv. strata. Stratum úroveň označuje "blízkost" k referenčnímu zdroji času. Dělení je následující:
  • stratum 0 - jde o velmi přesné hodiny. Buď přímo atomové hodiny, nebo se používá signál od nich odvozený, nejčastěji signál GPS. Stratum 0 není server.
  • stratum 1 - první server v řetězci ke kterému jsou připojeny hodiny (stratum 0). Stratum 1 většinou provozují výzkumné instituce, vysoké školy nebo velké korporace. Vzhledem k omezeným výpočetním a síťovým kapacitám v minulosti se nedoporučovalo připojovat klienty přímo k stratum 1 serverů, dnes už to příliš neplatí. 
  • stratum 2 - server, jehož přesný čas je odvozen od času serveru stratum 1
  • stratum 3 - server, jehož přesný čas je odvozen od času serveru stratum 2.
A takto to jde dál až k stratum 15, který je poslední synchronizovaný server. Stratum 16 označuje nesynchronizovaný server. Server stratum n odkazuje vždy jen na server stratum n+1, tedy nadřazený. Tím jsou eliminovány smyčky, kdyby např. několik serverů ve stejné úrovni strata odkazovalo mezi sebou navzájem.
Čas přenášený v NTP zprávách je tzv. koordinovaný světový čas (UTC). V České republice je UTC+01 (zimní čas) nebo v UTC+02 (letní čas). Začlenění do příslušné časové zóny se děje v rámci nastavení na straně koncové stanice.

Linux

Zřejmě nejrozšířenější je referenční implementace zvaná ntpd. Referenční odkazuje na to, že je vyvíjena přímo lidmi kteří navrhli NTP protokol. Ntpd je možné nainstalovat jako deamona do UNIXu/Linuxu a nebo jako službu běžící na pozadí ve Windows (podrobnosti k tomu zde).

Ve většině distribucí není ntpd předinstalované. takže je potřeba doinstalovat:

apt-get install ntp
Deamon nyní běží. Nyní se podíváme do konfiguračního souboru, který je umístěný v /etc/ntp.conf. To hlavní co nás předně zajímá, jsou přednastavené NTP servery. Např. v Ubuntu nebo Debianu jsou přednastaveny servery z tzv. NTP Poolu. Jde o službu kdy servery, které provozují dobrovolníci, jsou začleněny do společné množiny, ze které si klient sám vybírá nejvýhodnější server. Pokud tedy nechceme využít přednastavené servery lze doplnit do konfiguračního souboru server podle vzoru:
server [IP adresa nebo doménové jméno]
Nic nebrání si přidat více serverů, dokonce si myslím, že je to rozumné. Klient se už sám rozhodne který je nejvhodnější (viz dále). Zde přikládám seznam NTP serverů které používám. Prvních 6 adres jsou přímo dedikované NTP servery. Poslední čtyři řádky využívají NTP pool, který vybírá různé servery podle aktuálních podmínek. Na pořadí v konfiguračním souboru nezáleží:
server ntp.nic.cz
server tik.cesnet.cz
server tak.cesnet.cz
server ntp.muni.cz
server ntp2.muni.cz
server ntp.active24.cz
server 0.cz.pool.ntp.org
server 1.cz.pool.ntp.org
server 2.cz.pool.ntp.org
server 3.cz.pool.ntp.org
Dále nás samozřejmě zajímá, zda vše funguje jak má. K tomu slouží utilita ntpq, která monitoruje činnost ntpd. Výstup do konzole lze získat pomocí příkazu (další možnosti lze nalézt v [4]):
ntpq -p
Tímto jsme dostali výpis používaných NTP serverů s dalšími užitečnými informacemi:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp.nic.cz      .GPS.            1 u  219  256  377    6.199    0.276   0.136
+tik.cesnet.cz   .GPS.            1 u    4  256  377    6.936    0.263   0.157
*tak.cesnet.cz   .GPS.            1 u  140  256  377    6.407   -0.043   0.285
+ns.muni.cz      195.113.144.201  2 u  150  256  377    9.927    0.246   0.210
+nora.ics.muni.c 195.113.144.201  2 u  150  256  377    9.778    0.191   0.124
+ntp.active24.cz 195.113.144.201  2 u  127  256  377    6.155    0.319   0.170
+netopyr.hanacke .GPS.            1 u  168  256  377   14.144    0.218   0.123
+lx.ujf.cas.cz   195.113.144.238  2 u  142  256  377    6.745    0.159   0.137
+pyrrha.fi.muni. 195.113.144.201  2 u  138  256  377    9.999    0.037   0.114


Zkusím vypsat to nejpodstatnější a nejzajímavější, co lze z výše uvedené tabulky vyčíst:
  • První sloupec (remote) je jasný. Doménové jméno NTP serveru (může se lišit od adres které jsme zadávali do konfiguračního souboru, protože se může jednat o DNS aliasy). Pokud chceme výpis s IP adresami stačí použít příkaz ntpq -pn.
  • Znak který je před DNS názvem určuje v jakém stavu je server vůči klientovy. * značí, že byl tento server vybrán jako preferovaný, např. na základě nejmenšího zpoždění. Znak + označuje další vhodné servery. Znak - označuje servery které nejsou vhodné a pravděpodobně by ani nebyly použity.
  • Druhý sloupec (refid) je velmi zajímavý. Označuje jaký referenční zdroj času využívá konkrétní server. Např. ntp.nic.cz má přímo připojené zařízení které získává čas pomocí GPS. Naopak u serverů MUNI a Active24 vidíme, že jako referenční zdroj využívají nadřazený NTP server, tudíž jde o stratum 2 servery.
  • Třetí sloupec (st) označuje úroveň, tedy číslo strata.
  • Čtvrtý sloupec (t) označuje typ komunikace. Ve většině případů se jedná o unicast, označený jako u. Možnosti jsou ještě b jako broadcast a m jako multicast.
  • Pátý sloupec (when) označuje dobu která uplynula od poslední synchronizace se serverem. Hodnota narůstá až do hodnoty poll (viz dále), následně je vynulována, proběhne synchronizace a opět narůstá.
  • Šestý sloupec (poll) je proměnlivá hodnota označující jak často bude potřeba zjišťovat přesný čas. Deamon ji určuje podle offsetu. Pokud při předchozím měření odchylky byla zjištěna velká nepřesnost, nastaví se pool na nízkou hodnotu, díky tomu dojde k častější synchronizaci. Hodnota pool je nízká také po startu deamona.
  • Sedmý sloupec (reach) poskytuje další možnost jak zkontrolovat zda máme přesný čas. Jde o počítadlo úspěšných pokusů kontaktovat daný NTP server. Začíná se na 0 a postupně, pokud jsou další a další pokusy v řadě úspěšné, se dojde k hodnotě 377. Tudíž pokud vidíte tuto hodnotu, je spojení se serverem stabilní a funkční. 
  • Osmý sloupec (delay [ms]) je zpoždění mezi vámi a serverem.
  • Devátý sloupec (offset [ms]) je rozdíl vašeho lokálního času a času přijatého ze serveru.
  • Desátý sloupec (jitter [ms]) ukazuje kolísání zpoždění.
Z praktického hlediska nás asi nejvíce zajímá zda je nějaký server označen * a několik +. Zbytek hodnot je více méně jen pro specifické účely debugu. Ještě je možné se podívat jestli u některého serveru není příliš velké zpoždění.

SNTP

Simple Network Time Protocol je (jak už název napovídá) zjednodušení protokolu NTP, pro případy kdy je potřeba znát přesný čas, ale ne tak často a nebo ne "tak přesně". SNTP je součástí NTPv4, využívá stejné datagramy. Hlavní rozdíl je v tom, že SNTP neuvažuje zpoždění v síti a předchozí výsledky synchronizace času. V praxi je SNTP klient spuštěn jednorázově (např. pouze jednou za den) a po přijetí času od serveru je ukončen. SNTP je běžně přítomno v levných domácích routerech kde je často jediným způsobem jak nastavit co nejpřesněji čas.

Domácí routery 

Mnohé obyčejné routery, které jsou určeny pro domácí podmínky má v sobě NTP/SNTP klienta. Většinou je potřeba hledat spojení Time Setting nebo Time Config, popř. jen Time ve webové konfiguraci. Náhodně jsem vybral běžný router TP-LINK TL-WDR4300, díky tomu, že je na webu emulace jeho konfigurace. Nastavení času je opravdu jednoduché a v přehledném menu je snadno k nalezení. Je sice možné zadat jen dva servery, ale pro běžné uživatele myslím dostatečné.

Podobné články:
Zdroje:
  1. https://en.wikipedia.org/wiki/Network_Time_Protocol
  2. http://www.linuxjournal.com/article/6812 
  3. http://www.eecis.udel.edu/~mills/ntp/html/warp.html
  4. http://doc.ntp.org/4.1.2/debug.htm 
  5. http://www.eecis.udel.edu/~mills/ntp/html/ntpq.html