NTP(Network Time Protocol)は、ネットワークにつながるコンピューターやネットワーク機器が現在の時刻を同期するための通信プロトコルである。時刻同期の標準であり、NTPに対応していないIT機器やOSは皆無といってもよいだろう。
ネットワークを介して機器同士が通信すれば、必ず遅延(タイムラグ)が発生する。にもかかわらず、NTPを使えば高精度な時刻同期が可能だ。どうして遅延が発生する中で、時刻同期ができるのか。今回は、NTPの仕組みを解説する。
タイムラグを考慮しなければ時刻はずれる
タイムラグがあるとどうして時刻同期が難しいのか。例えば、サーバーAとサーバーBで時刻を同期するために、サーバーAからサーバーBに時刻情報を送ったとする。時刻情報がサーバーBに一瞬で届いたとしても、時間はゼロではない。サーバーAからサーバーBに時刻情報が届くまでにかかった時間が10ミリ秒だったとしよう。サーバーBが時刻情報を受け取って、すぐにその時刻に設定したとしても、タイムラグの10ミリ秒分が必ず遅れる。
物理的に近い距離にあるIT機器同士ならタイムラグは数ミリ秒で済むが、離れれば離れるほどタイムラグは大きくなる。米国と日本のコンピューターが太平洋をはさんでやりとりすれば、タイムラグが数百ミリ秒になってもおかしくない。
NTPでは、タイムラグが大きい状況でもなるべく正確に時刻同期できるように、「Transmit Timestamp」「Origin Timestamp」「Receive Timestamp」という3つの時刻を使ってタイムラグを把握し、そこから「正しい時刻」を推測してその時間を設定するようになっている。
具体的な動きを見ていこう。
(1)時刻同期したい機器(要求元)は、Transmit Timestampに自身の現時刻(t1)を設定して、時刻同期元にしたい機器(参照先)にNTP通信を送信する
(2)(1)の通信を受信した参照先の機器は、受け取ったTransmit Timestampの値(t1)をOrigin Timestampに設定して、Receive TimestampにNTP通信を受信した時刻(t2)、Transmit Timestampには参照先の機器がNTP通信を送信する際の現時刻(t3)を設定したNTP通信を送信する
(3)(2)の通信を受信した要求元の機器は、受信時の時刻(t4)を確認して「正しい時刻」を算出する
算出方法は次のようになっている。まず、要求元サーバー視点での送信から受信までの経過時間(t4-t1)から、参照先サーバー内の処理時間(t3-t2)を差し引いて、サーバー間の往復に要した時間(t5)を求める。往路と復路に要した時間は等しいと仮定して、t5の半分を復路に要した通信時間(t6)とする。正しい時刻として、t3にt6を加えた時刻を使う。
理解できただろうか。分かりやすいように、身近な例を使って説明する。自宅の時計が狂っているかもしれない状況で、徒歩10数分かかるコンビニエンスストアの時計を見て時刻合わせをするとしよう。
自宅を出るとき、自宅の時計の時刻が「9時10分」だったとする。そして、コンビニに着いたときのコンビニの時計の時刻が「9時20分」、コンビニを出るときの時刻が「9時30分」だった。自宅に戻ってきたとき、自宅の時計の時刻は「9時50分」だったとしよう。
ここからコンビニの時計でコンビニに滞在した時間は10分間と分かる。また、自宅の時計で出発してから戻ってくるまでの時間は40分間である。移動にかかった時間はトータルで30分間であることから、片道に15分かかったと推定する。コンビニを出発するときのコンビニの時計の時刻は9時30分だったので、自宅に到着したときの時刻はコンビニの時計が正しいとすると「9時45分」になり、自宅の時計が5分ずれていたいることが分かる。