NTPのパケットフォーマット
NTP バージョン 4 のパケットフォーマットを以下に示します。
NTP は基本は UDP を使うことになっていますが、実は TCP でも UDP でもどっちでも良いのです。TCP の実装もたまに見かけます。送信元ポートおよび宛先ポートはともに 123 番となることもありますが、クライアント側が higher port となることも少なくありません。
各フィールドについて
LI (Leap Indicator)
2 bit。その日の最後の 1 分が 1 秒追加 (うるう秒=Leap Second) されるか、もしくは 1 秒削除されるかを事前に予告するフィールド。
1. その日の最後の 1 分が 61 秒となることを予告
2. その日の最後の 1 分が 59 秒となることを予告
3. 不明 (時刻同期無し)
slew モードでは使われません。step モードで使われるときも、アプリケーション側で予期せぬ障害が発生する可能性があり、現在ではあまり使われていないようです。(うるう秒対策は slew モードでの対応が基本)
VN (Version Number)
3 bit。現在の NTP バージョンは 4 (RFC5905 で規定)。
NTP バージョン 4 は、NTP バージョン 3 (RFC1305) および SNTP (Simple Network Time Protocol) バージョン 4 (RFC4330) の機能を統合し、それ以外にもさらに機能を追加したものになります。また、NTP バージョン 4 は NTP バージョン 1~3 と下位互換があります。
Mode
3 bit。アソシエーションのモードを示します。
アソシエーションとは、NTP の時刻情報を提供する形態を示したものです。アソシエーションモードには以下の値が入ります。
1. Symmetric Active
2. Symmetric Passive
3. Client
4. Server
5. Broadcast
6. NTP control message (制御クエリ)
7. プライベート利用に予約
NTP パケットの Mode は、RFC 上は相手のアソシエーションモードを想定してセットするとあるのですが、Windows, Linux, Cisco どの実装を見ても、自分のアソシエーションモードをパケットに含めて送信しています。つまり、自分が Symmetric Active であれば Mode=1 , Symmetric Passive であれば Mode=2 , Client であれば Mode=3 , ...となっています。
各アソシエーションモードの具体的な動作については、以下記事をご参照下さい。
なお、NTP control message は主にネットワークシステム監視装置が使うモードです。NTP サーバから応答があるかどうかを確認しますが、時刻同期は一切行いません。
Stratum
8 bit。0 は原子時計や GPS の時刻を意味しますが、NTP パケット上は取り扱いません。
1 は原子時計や GPS に物理的に直結した NTP サーバを意味します。
2 以降は、それより 1 つ上の Stratum の NTP サーバから時刻同期したことを意味します。
16 は時刻同期していないことを意味します。
17 以降は予約とされ、使われていません。
Poll
8 bit。次の NTP パケット送出までの最大時間間隔 (秒) に対して log2 の対数を取った数値が入ります。例えば 10 (RFC で推奨されているデフォルト値) の場合は 2 の 10 乗 = 1024 秒となります。
この値は NTP で定義されている discipline algorithm の中で決定されます。
このアルゴリズムは自身とリモート NTP アソシエーションから『時刻およびクロック周波数』の誤差を予測するもので、この誤差が小さければ Poll は大きめ (つまり間隔が長め) に取るし、誤差が大きければ小さめ (間隔が短め) に取ります。
Precision
8 bit。NTP を扱う機器のシステムクロックが扱える精度を相手に示します。Poll と同じく、log2 の対数を取った数値が入ります。例えば -18 という数値の場合は約 1 マイクロ秒になります。
Root Delay
Primary サーバ (Stratum 1 の NTP サーバ) とのラウンドトリップ遅延 (Round-Trip Delay) を表しています。NTP サーバは上位 NTP サーバからこの値を受け取ると、自身の RTT を加え、下位 NTP クライアントへ伝搬します。
この値が大きいほど、ネットワークの距離が遠い=精度が低くなる、ということを意味します。
Root Dispersion
Primary サーバ (Stratum 1 の NTP サーバ) との通信における揺らぎ (Jitter) を表しています。NTP サーバは上位 NTP サーバからこの値を受け取ると、自身の揺らぎ (Jitter) を加え、下位 NTP クライアントへ伝搬します。
この値が大きいほど、ネットワーク遅延の予測が荒い=精度が低くなる、ということを意味します。
Reference ID
32 bit。Reference Clock (相手先) がどの NTP サーバを参照しているかを表しています。
Stratum 2~14 の NTP サーバは、上位の NTP サーバの IP アドレスをセットします。
Stratum 1 の NTP サーバは、参照先を暗示する任意の 1~4 文字の ASCII 文字列をセットします。(GPS、WWVB 等)
Reference Timestamp
自分が最後に同期した時刻を示します。このタイムスタンプは、複数の NTP サーバから情報を取得し平均した結果なので、時刻同期の計算には使われません。単に相手へのフィードバックとして送っているだけです。
Origin Timestamp
前回相手が NTP パケットを送信した時刻 (前回受信した NTP パケットの Transmit Timestamp) を示します。時刻同期の計算に使われます。
Receive Timestamp
自身が前回相手からNTPパケットを受信した時刻を示します。時刻同期の計算に使われます。
Transmit Timestamp
自身が、今回相手へ NTP パケットを送信した時刻を示します。時刻同期の計算に使われます。
Extension Field [1~n]
1 つ以上の拡張フィールドを任意に使うことが可能です。ただし、RFC にもどのような利用シーンを想定しているかは記載されていません。
Key Identifier
32 bit。キー番号を示します。
dgst
128 bit。Key Identifier に紐づく MD5 ハッシュ値です。このハッシュを元に、相手が正しい NTP 同期先かを認証します。
NTPv4 のパケットキャプチャ
[クライアントのパケットキャプチャ]
[サーバ側のパケットキャプチャ]
NTPのタイムスタンプについて
NTP のタイムスタンプは UTC (Coordinated Universal Time:順番が違うように思うかもしれませんが合っています) を前提として、1900/1/1 0:00:00 を起点 (=0) としています。この計算だと 2036/2/7 6:28:15 までしか表現できませんが、RFC4330 では 1 周回ったところで 2036/2/7 6:28:16 と解釈することで回避する方法が書かれています。
コメント