NTPプロトコルの概要・仕組み(時間補正の計算・仕様・シーケンス)

スポンサーリンク
スポンサーリンク

NTPとは

NTPとは、Network Time Protocol の略で、IP機器が自動で時間を調整するために使うプロトコルです。近年のIT機器はシステム間で連携を取っていることが多いですが、ログの取得は各機器で取得するのが普通です。その際時刻がずれているとシステム連携のログの確認が困難となるため、このNTPで時刻同期を行うことは非常に重要です。

NTPでは原子時計やGPS等の高信頼性の時計自体を Stratum『0』と定義し、この時計と(ネットワーク越しではなく)物理的に直結しているNTPサーバが Stratum 『1』となります。Stratum『1』のNTPサーバを Primary サーバと呼びます

このPrimaryサーバからNTPプロトコルを使って時刻同期する機器の Stratum は『2』となり、以降同様にNTPで時刻同期をとるたびにStratumが『1』ずつ増えます。この Stratum『2~15』のNTPサーバをSecondaryサーバと呼びます。『16』以上は信頼できない時刻ソースとされ、利用できません(STPを手本としているようです)。

NTPの基本動作は、複数台のNTPサーバから時刻を取得し、まずは明らかに時刻の外れているものがあればそれを除外します。そして次に残った時刻ソースから、精度が高いと思われるものを3つ選び、それを使って時刻修正を行います(3つ以下しか残っていない場合は全て使います)。(RFC5905 11.1. System Process Variables の “NMIN=3″がこれに該当)

精度の高さはDistanceとも呼ばれ、NTPパケットにある Root DelayRoot Dispersion(2つとも後述します)から計算されます。実装としてStratum(階層)を加味することもあります。(Linuxのchronyの実装)

スポンサーリンク

NTPのパケットのシーケンス

NTPは、『サーバからもらった時刻をそのまま設定する』という単純なプロトコルではありません。パケットのやり取りの中で、サーバの処理遅延やNW遅延、NWのゆらぎ(Jitter)の統計を取り、精度の高い時刻を計算します

NTPパケットの中にはTimestampが4つありますが、時刻計算に使われるのはそのうち以下の3つです。

1. Origin Timestamp
2. Receive Timestamp
3. Transmit Timestamp

上記のパケットの中身のTimestampに加え、パケットが到着した時間を『Destinaion Timestamp』として内部で保持し、これら4つのTimestampを使って時刻計算を行います。

具体的には、NTPクライアント/サーバ、またはNTP Peerは、Timestampについて以下のようなやり取りを行います。

スポンサーリンク

NTPクライアントはタイムスタンプから以下の統計情報を計算します。

Offset(時刻差)= { ( t2 – t1 ) – ( t4 – t3 ) } / 2
RTT(往復時間) = ( t2 – t1 ) + ( t4 – t3 )

注意点としては、そもそもの目的は時刻同期ですので、『NTPクライアントとNTPサーバで基準となる時間がずれている』ことが前提です。なので

t1 = Tcl + t1′ , t2 = Tsv + t2′ , t3 = Tsv + t3′ , t4= Tcl + t4′

と置き換えたほうが分かりやすいかもしれません。(ある基準時刻”T” のNTPクライアントの時刻情報をTcl , NTPサーバの時刻情報をTsvとします)

Offset = Tsv – Tcl + { ( t2′ – t1′ ) – ( t4′ – t3′ ) } /2

NW遅延が行きと帰りで同じと仮定すれば t2′ – t1′ = t4′ – t3′ ですので、Offset = Tsv – Tcl となるわけです。

一方RTTは、NTPクライアントが送信してから戻ってくるまでの時間から、NTPサーバの処理時間を省いたものです。これも先程の代入を行うと

RTT = ( t2′ – t1′ ) + ( t4′ – t3′ )

となり、今度は Tsv や Tcl が消えますので、クライアントサーバ間の時刻差の影響が消えます。サーバ処理時間はタイムスタンプから簡単に計算できるので、予測するしかないNW遅延部分のみを抽出しています。

スポンサーリンク

このRTT自体はNTPクライアントとNTPサーバの距離を表しており、この距離が遠い程、NTP時刻同期の精度が悪くなります。

また、このRTT値が毎回同じような値であればNW遅延は安定しており、すなわちOffsetの計算も精度が高くなります。しかし毎回かけ離れていると、それはNW遅延が t2′ -t1′ = t4′ – t3′ の仮定が怪しくなり、Offsetの計算精度も疑わしくなります。

なのでNTPでは、PrimaryサーバまでのNW遅延を表す Root DelayPrimaryサーバまでのNW遅延の揺らぎを表す Root Dispersion を計算し、それをNTPパケットの中に格納し、下位NTPクライアントに伝搬します。NTPクライアントはその情報を使って時刻ソース選定を行うとともに、もし自身よりさらに下位のサーバがいるときはそのRoot Delay および Root Dispersion を再計算(自身の計算したRTTを加味)し、さらに伝搬していきます。

NTPのアソシエーションモード

アソシエーションとは、NTPの時刻情報を提供する形態を示したものです。アソシエーションモードには以下の6種類があります。

1. Symmetric Active
2. Symmetric Passive
3. Client
4. Server
5. Broadcast
6. Broadcast Client

NTPパケットのModeは、RFC上は相手のアソシエーションモードを想定してセットするとあるのですが、Windows, Linux, Cisco どの実装を見ても、自分のアソシエーションモードをパケットに含めて送信しています。つまり、自分が Symmetric Active であれば Mode=1 , Symmetric Passive であれば Mode=2 , Client であれば Mode=3 , …となっています。

Association Mode=1~4の場合のパケットやり取りを以下に図示します。

スポンサーリンク

Symmetric Active 同士

Symmetric は Peerとも呼ばれます。このアソシエーションでは、Stratumが同じもの同士の場合は、どちらがクライアント、サーバになるということはなく、互いの時刻情報を信頼し合い、互いを時刻の修正のためのソースとして利用します。Stratumが違う場合は、値が大きいほうが小さいほうの時刻情報を信頼し、時刻修正のためのソースとして利用されます。

ただしこれは、他に信頼性のあるNTPサーバからも時刻情報を取得していることを前提とした、バックアップ用途であるケースがほとんどです。

Activeは常に相手と同期を取るよう自発的にNTPパケット(Mode=1)を相手に送信します。

Symmetric ActiveとSymmetric Passive

基本的にはSymmetric Active同士と同じ動きですが、Symmetric Passiveのノードは自分からはNTPパケットを送りません。Activeの相手が送ってきたのをトリガーに、NTPパケット(Mode=2)を送り返す、という動作をします。

なお、CiscoではデフォルトでSymmetric Passiveモードが有効になっていますので、悪意ある第3者から、時間のずれたStratum 1の Symmetric Active パケットを受けると容易に時刻ずれを引き起こしてしまいますので、基本は認証キーを使うことを覚えておきましょう。

ServerとClient

一番実装の多いアソシエーションです。ClientはServerに対しNTPパケット(Mode=3)を送信し、それを受けたNTPサーバはClientに対しNTPパケット(Mode=4)を返します。ClientはServerから受信したTimestampを元に、時刻同期を行います。プロトコル上、ServerもClientからTimestampを受け取りますが、時刻同期は行いません。前述の通り、ServerからClientへの送信時刻や受信時刻等のTimestamp情報は、Clientが時刻差やRTT(およびジッター)を推測し、受信した時刻を補正し精度を高めるために使われます

なお、Symmetricのアソシエーションも同様に、相手からのTimestamp情報を元に補正をかけ精度を高めています。

Broadcast ServerとBroadcast Client

Broadcast Serverは同セグメント内にBroadcast Clientが居ることを想定し、NTPパケットをブロードキャストします。Broadcast Clientはこれを受信し、時刻同期します。

スポンサーリンク

なお、他のアソシエーションでは、互いにやり取りするNTPパケットの中にある送信時刻や受信時刻等からネットワーク遅延等を計算し、それを補正するため高精度になりますが、このアソシエーションではパケットは一方的に受けるのみなのでその計算ができず、精度は低くなります

精度は少し粗くてもいいから同セグメント内のクライアントに一遍に送信したい、というケースには最適です。

NTPサーバを2台指定する場合の注意点

前述していますが、RFCで規定されているNTPの動きとしては、以下のようになります。

  1. NTPクライアントは複数のNTPサーバから時刻情報を取得
  2. 取得した時刻情報の中から、明らかに時刻が外れたもの(falsetickerと呼びます)を除外(Selection Algorithm = Byzantine fault detection principles)
  3. 残ったNTPサーバ(truechimerと呼びます)が4つ以上の場合、それらの中から精度の高い時刻ソースを3つ選定し、尤もらしい時刻を算出(Combine Algorithm)。

この動作から分かる通り、NTPクライアントがNTPサーバとして2台指定した場合、その2つがかけ離れた時刻になっている場合は時刻同期ができません。なのでNTPサーバを複数台指定する場合は3台以上(RedHatなどは4台)が推奨されています。

もしNTPサーバを2台指定するのであれば、preferやtrust等のオプションを使うと良いでしょう。

Ciscoの場合

ntp server ntp1.jst.mfeed.ad.jp prefer
ntp server ntp2.jst.mfeed.ad.jp
ntp peer ntp1.jst.mfeed.ad.jp prefer
ntp peer ntp2.jst.mfeed.ad.jp

上記のように設定した場合、2台とも近い時刻であれば2台の平均を取り、もしかけ離れた時刻であれば、ntp1のみを使って時刻同期を行います。

Linux の chrony の場合も同じように prefer オプションが使えますが、trust というオプションもあります。

Linuxのchrony.confの場合

server ntp1.jst.mfeed.ad.jp trust (preferも利用可)
server ntp2.jst.mfeed.ad.jp

この設定は単純に基本はntp1を使い続け、もしntp1が故障等で接続できなくなった場合に、ntp2を使って時刻同期を行う、という設定になります。

スポンサーリンク

NTPのバージョンとそれぞれの違い

現在はNTPバージョン4(RFC5905)です。バージョン2および3と互換性があります。

NTP v2からv3で変わったことと言えば、主に認証機能が付いたことです。ではNTP v3とv4の違いは何でしょうか。

簡単に言うと大きく以下の3つです。

1. 『Expanded NTP timestamp』により、扱える時間の精度を1ナノ秒以下にすることができた
2. 『clock discipline algorithm』により、ハードウェアに内在している『どのくらいの度合いで時刻がズレるかの傾向』(つまりドリフト)の精度を上げることができた
3. 1および2により、頻繁に時刻同期しなくてもよくなったので、最大同期間隔を1024秒から36時間まで引き上げた

RFC5905には以下のように書かれています。

The NTPv4 design overcomes significant shortcomings in the NTPv3
design, corrects certain bugs, and incorporates new features. In
particular, expanded NTP timestamp definitions encourage the use of the floating double data type throughout the implementation. As a result, the time resolution is better than one nanosecond, and
frequency resolution is less than one nanosecond per second.
Additional improvements include a new clock discipline algorithm that is more responsive to system clock hardware frequency fluctuations.
Typical primary servers using modern machines are precise within a
few tens of microseconds. Typical secondary servers and clients on
fast LANs are within a few hundred microseconds with poll intervals
up to 1024 seconds, which was the maximum with NTPv3. With NTPv4, servers and clients are precise within a few tens of milliseconds with poll intervals up to 36 hours.
【訳】
NTPv4はNTPv3の重要な欠点を克服し、バグを直し、新しい機能を追加するようデザインされた。特に、『Expanded NTP timestamp』の定義は倍精度浮動小数点数の全面的な実装を可能にした。その結果、扱える時間は1ナノ秒より細かく、扱える周波数は1ナノ秒/秒より小さい(1GHzより大きい)。さらなる改善として、新しい『clock discipline algorithm』が含まれており、これはシステムクロックのハードウェア周波数変動により敏感に対応できる。
最新のマシンを使った典型的なPrimaryサーバは数十マイクロ秒以内の精度である。高速のLANにある典型的なSecondaryサーバやクライアントは数百マイクロ秒の精度であり、これは最大1024秒の間隔で同期している。この1024秒はNTPv3の上限値である。NTPv4では同期間隔の最大値を36時間まで引き上げている。
スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク