NTP(Network Time Protocol)
スポンサーリンク
NTPとは
NTP(Network Time Protocol)とは、コンピュータが持つ時計(システムクロック)を正しい時刻へ同期するための通信プロトコルです。「OSI参照モデル」の「アプリケーション層」に位置し、UDPポートの123番を使用して通信を行います。
上記図はNTPのイメージ図です。
NTPクライアントからNTPサーバに時刻を問い合わせ、NTPサーバからの応答に受信、そしてNTPクライアントはNTPサーバから受信した時刻(※通信時間を考慮した)にコンピュータが持つ時計(システムクロック)を変更します。この時、協定世界時 (UTC) を使って時刻を送受信します。
関連記事
NTPの階層構造
NTPはstratumと呼ばれる階層構造を持ち、最上位のNTPサーバが正確な時計から標準時を取得し、下位のNTPサーバはそれを参照する事で時刻を合わせる仕組みです。
最上位のNTPサーバはstratum1でありstratum15までNTPサーバを構築できます。(最下位のstratum16には同期できない)
NTPで時刻同期する際は、公開しているNTPサーバに接続します。上位層のstratumの方が正確な時刻を保持しているため、上位層のstratumで かつ ネットワーク的な距離が近いstratumを選ぶのがよいと言われています。
日本では情報通信研究機構 (NICT) が公開しているNTPサーバ (ntp.nict.jp) などが有名です。ntp.nict.jpはstratum1に位置付けしているNTPサーバです。
NTPの計算方法
NTPでは、往復の通信時間を計算式で導き出し、NTPクライアントが保持している時計の遅延時間を算出しています。
なぜ往復の通信時間を測定する必要があるかというと、もし往復の通信時間を考慮しなければ次の図のようになってしまうからです。
- NTPクライアントがNTPサーバに時刻を問い合わせる
- NTPサーバはサーバの時刻を返信する
- NTPクライアントはNTPサーバから受け取った時刻で時刻を補正する
上記の流れだと、応答にかかった通信時間が考慮されていないため、応答の通信にかかった時間分だけ必ずズレが発生してしまいます。
そのため、NTPでクライアントの時刻を補正する際には、往復の通信時間を考慮して時刻同期を行います。※以下の例では時分秒で表現していますが、実際はもっと細かい単位で計算します。
例えば、上記図のようにNTPクライアントの時計が2秒遅れているとします。この時、往復の通信に掛かった時間は次の計算式で算出します。※NTPクライアントがお問い合わせを送信した時刻がts、NTPサーバがお問い合わせを受信した時刻がTr、NTPサーバが応答を送信した時刻がTs、NTPクライアントが応答を受信した時刻がtrとする)
上記例では、(3秒 - 0秒) - (4秒 - 3秒) = 2秒(※時分は省略)となり、往復の通信にかかった時間は2秒であることが分かります。
そして、往路と復路の通信時間には差がないと仮定して次の式でNTPクライアントが保持している時計の遅延時間を算出します。
上記例では、(4秒 + 3秒) / 2 - (0秒 + 3秒) / 2 = 2秒(※時分は省略)となり、NTPクライアントの時計は2秒遅れていることが分かります。
ここでポイントなのが往路と復路の通信時間には差がないと仮定している所です。もし往路と復路の通信時間に大きな差があった場合は、その分は誤差となり正確な時刻からずれてしまいます。
NTPの2036年問題
NTPでは、時刻の表現に1900年1月1日 0時0分0秒 (UTC)を起点とする32ビットの積算秒数で表現しています。その結果、42億9496万7295秒までしか表現できません。
起点から42億9496万7295秒経過した2036年2月7日 6時28分15秒 (UTC) の次の秒(16秒)が桁あふれによって起点と認識されてしまい、NTPが誤動作すると予想されています。この問題が「2036年問題」と呼ばれています。