NTPとは
NTP (Network Time Protocol)とは、 ネットワークに接続されたコンピュータや各種機器の時刻同期に用いられるプロトコルで、 RFC 5905*1やRFC 7822*2で標準化されています。 NTPの歴史は古く、 最初にRFC 958*3として標準化されたのは1985年であり、 DNS等と並んでインターネット上で長く使われているプロトコルです。
NTPはネットワークを介して時刻同期を行います。 単純に相手のサーバが通知してきた時刻を信頼するだけでは、 ネットワークの遅延により時刻のずれが発生してしまいます。 そのため、NTPではサーバ・クライアント間の通信において、 NTPメッセージを送信した時刻、受信した時刻を、 サーバ・クライアントそれぞれがメッセージの中に含めています。 これにより、ネットワークでの遅延時間を推測し、ずれの少ない時刻同期を図っています。
NTPでは、階層構造を用いて時刻源の構成を表現しています。 階層構造の各層をstratumと呼び、stratumは0を最上位として15まで階層があります。 原子時計、GPS等の非常に正確な時刻源を「reference clock」と呼び、 階層構造の最上位であるstratum 0としています。 このstratum 0に接続されたNTPサーバをstratum 1、 さらにstratum 1を参照するNTPサーバをstratum 2と、 reference clockから経由するNTPサーバの数が増加するにつれて、 stratumの数字が増えていきます。
つまり、NTPサーバは他のNTPサーバを時刻源として参照し、 相手の持つstratumの数字を一つ増やし、 自身がさらに他のクライアントに対して時刻情報を提供することになります。 こうした階層構造を利用することで、負荷分散を図るとともに、 stratumの数値によってどのくらい信頼できる時刻源であるかが判断できるようになっています。
また、1台のサーバだけではそのサーバが正確な時刻を保持しているかどうか不明なため、 通常NTPサーバは上位stratumのNTPサーバを複数台参照することで、 時刻の正確さを高めることが行われています。
なお最近では、協定世界時の2016年12月31日(日本時間2017年1月1日)にうるう秒が挿入されましたが、 NTPのメッセージにはうるう秒の挿入・削除が行われることをクライアントに伝える、 "Leap Indicator(LI)"と呼ばれるフィールドがあります。 NTPのプロトコル上ではこのフィールドの利用が推奨されていますが、 以前のうるう秒挿入時にさまざまな障害が発生したこともあり、 必ずしも利用しないNTPサーバ管理者もいるようです。
*1 RFC 5905 "Network Time Protocol Version 4: Protocol and Algorithms Specification"
https://tools.ietf.org/html/rfc5905
*2 RFC 7822 "Network Time Protocol Version 4 (NTPv4) Extension Fields"
https://tools.ietf.org/html/rfc7822
*3 RFC 958 "Network Time Protocol (NTP)"
https://tools.ietf.org/html/rfc958