7. Data Structures (データ構造)
NTP状態マシンは以下のセクションで定義されています。状態変数は、パケットヘッダー、ピアおよびポーリングプロセス、システムプロセス、およびクロック調整プロセスにおける機能に応じてクラスに分類されます。パケット変数 (Packet variables) は、送信および受信パケットのNTPヘッダー値を表します。ピアおよびポーリング変数 (Peer and poll variables) は、各サーバーのアソシエーションの内容を個別に表します。システム変数 (System variables) は、依存クライアントから見たサーバーの状態を表します。クロック調整変数 (Clock discipline variables) は、クロック調整アルゴリズムの内部動作を表します。例は付録Aに記載されています。
7.1. Structure Conventions (構造の規約)
異なるプロセスで使用される同じ名前の異なる変数を区別するために、図5にまとめられた命名規則が採用されています。受信パケット変数vは、完全修飾名r.vを持つパケット構造rのメンバーです。同様に、x.vは送信パケット変数、p.vはピア変数、s.vはシステム変数、c.vはクロック調整変数です。各アソシエーションにはピア変数のセットがあります。システム変数とクロック変数のセットは1つだけです。
| 名前 (Name) | 説明 (Description) |
|---|---|
| r. | 受信パケットヘッダー変数 (receive packet header variable) |
| x. | 送信パケットヘッダー変数 (transmit packet header variable) |
| p. | ピア/ポーリング変数 (peer/poll variable) |
| s. | システム変数 (system variable) |
| c. | クロック調整変数 (clock discipline variable) |
図5: プレフィックス規約
7.2. Global Parameters (グローバルパラメータ)
変数クラスに加えて、このドキュメントでは、図6に値とともに示されているものを含む、多数のグローバルパラメータが定義されています。
| 名前 (Name) | 値 (Value) | 説明 (Description) |
|---|---|---|
| PORT | 123 | NTPポート番号 (NTP port number) |
| VERSION | 4 | NTPバージョン番号 (NTP version number) |
| TOLERANCE | 15e-6 | 周波数許容差PHI (frequency tolerance PHI, s/s) |
| MINPOLL | 4 | 最小ポーリング指数 (minimum poll exponent, 16 s) |
| MAXPOLL | 17 | 最大ポーリング指数 (maximum poll exponent, 36 h) |
| MAXDISP | 16 | 最大分散 (maximum dispersion, 16 s) |
| MINDISP | .005 | 最小分散増分 (minimum dispersion increment, s) |
| MAXDIST | 1 | 距離しきい値 (distance threshold, 1 s) |
| MAXSTRAT | 16 | 最大ストラタム番号 (maximum stratum number) |
図6: グローバルパラメータ
これらは相互運用性に必要な唯一のグローバルパラメータですが、どの実装でもより大きなコレクションが必要です。付録A.1.1には、緩和アルゴリズム、クロック調整アルゴリズム、および関連する実装依存関数のスケルトンで使用されるものが含まれています。これらのパラメータ値の一部は、IANAによって割り当てられたNTPポート番号やNTPv4自体に割り当てられたバージョン番号のように、固定されています。周波数許容差 (PHIとも呼ばれる) のような他のものは、一度同期された後、そのソースが到達不能になったときにドリフトすることが許可されたシステムクロックの最悪のケースの動作に関する仮定を含みます。最小および最大パラメータは、このドキュメントの後のセクションで説明されている状態変数の制限を定義します。
このドキュメントでは固定値で示されていますが、一部の実装では、構成コマンドによって調整可能な変数にすることができます。たとえば、リファレンス実装は、システムクロックを読み取るための複数の反復における最小時間のlog2としてPRECISIONの値を計算します。
7.3. Packet Header Variables (パケットヘッダー変数)
外部の観点から最も重要な状態変数は、図7および以下で説明されているパケットヘッダー変数です。NTPパケットヘッダーは、ネットワークバイト順の整数個の32ビット (4オクテット) ワードで構成されています。パケット形式は3つのコンポーネントで構成されています: ヘッダー自体、1つ以上のオプションの拡張フィールド、およびオプションのメッセージ認証コード (message authentication code, MAC)。ヘッダーコンポーネントは、NTPv3ヘッダーおよび以前のバージョンと同一です。オプションの拡張フィールドは、[RFC5906]で説明されているAutokey公開鍵暗号化アルゴリズムによって使用されます。オプションのMACは、AutokeyとこのRFCで説明されている対称鍵暗号化アルゴリズムの両方で使用されます。
| 名前 (Name) | 式 (Formula) | 説明 (Description) |
|---|---|---|
| leap | leap | 閏秒インジケーター (leap indicator, LI) |
| version | version | バージョン番号 (version number, VN) |
| mode | mode | モード (mode) |
| stratum | stratum | ストラタム (stratum) |
| poll | poll | ポーリング指数 (poll exponent) |
| precision | rho | 精度指数 (precision exponent) |
| rootdelay | delta_r | ルート遅延 (root delay) |
| rootdisp | epsilon_r | ルート分散 (root dispersion) |
| refid | refid | 参照ID (reference ID) |
| reftime | reftime | 参照タイムスタンプ (reference timestamp) |
| org | T1 | 起点タイムスタンプ (origin timestamp) |
| rec | T2 | 受信タイムスタンプ (receive timestamp) |
| xmt | T3 | 送信タイムスタンプ (transmit timestamp) |
| dst | T4 | 宛先タイムスタンプ (destination timestamp) |
| keyid | keyid | 鍵ID (key ID) |
| dgst | dgst | メッセージダイジェスト (message digest) |
図7: パケットヘッダー変数
NTPパケットはUDPデータグラム [RFC0768] です。一部のフィールドは複数のワードを使用し、他のフィールドはワード内のより小さなフィールドにパックされています。図8に示すNTPパケットヘッダーには12ワードがあり、その後にオプションの拡張フィールドが続き、最後に鍵識別子フィールドとメッセージダイジェストフィールドで構成されるオプションのメッセージ認証コード (MAC) があります。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|LI | VN |Mode | Stratum | Poll | Precision |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Root Delay |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Root Dispersion |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reference ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Reference Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Origin Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Receive Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Transmit Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Extension Field 1 (variable) .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Key Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| dgst (128) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
図8: パケットヘッダー形式
拡張フィールドは、たとえばAutokeyセキュリティプロトコル [RFC5906] などのオプション機能を追加するために使用されます。拡張フィールド形式は、拡張フィールド機能の知識なしでパケットを解析できるように提示されています。MACは、AutokeyとKey対称鍵認証スキームの両方で使用されます。
パケットヘッダー変数のリストは図7に示され、以下で詳しく説明されています。IPv6アドレスファミリーを使用する場合の軽微な変更を除いて、これらのフィールドはNTPv3との下位互換性があります。パケットヘッダーフィールドは、送信パケット (xプレフィックス) と受信パケット (rプレフィックス) の両方に適用されます。図8では、一部の複数ワードフィールドのサイズは、デフォルトの32ビットでない場合、ビット単位で示されています。基本ヘッダーは、パケットの先頭から送信タイムスタンプフィールドの終わりまで拡張されます。
フィールドと関連するパケット変数 (括弧内) は次のように解釈されます:
フィールドの解釈
LI (Leap Indicator, 閏秒インジケーター, leap): 2ビット整数で、当月の最後の分に挿入または削除される予定の閏秒の警告を示します。値は図9で定義されています。
| 値 (Value) | 意味 (Meaning) |
|---|---|
| 0 | 警告なし (no warning) |
| 1 | その日の最後の分は61秒 (last minute has 61 seconds) |
| 2 | その日の最後の分は59秒 (last minute has 59 seconds) |
| 3 | 不明 (クロック非同期, clock unsynchronized) |
図9: 閏秒インジケーター
VN (Version Number, バージョン番号, version): 3ビット整数で、NTPバージョン番号を表します。現在は4です。
Mode (モード, mode): 3ビット整数で、モードを表します。値は図10で定義されています。
| 値 (Value) | 意味 (Meaning) |
|---|---|
| 0 | 予約済み (reserved) |
| 1 | 対称アクティブ (symmetric active) |
| 2 | 対称パッシブ (symmetric passive) |
| 3 | クライアント (client) |
| 4 | サーバー (server) |
| 5 | ブロードキャスト (broadcast) |
| 6 | NTP制御メッセージ (NTP control message) |
| 7 | プライベート使用のために予約済み (reserved for private use) |
図10: アソシエーションモード
Stratum (ストラタム, stratum): 8ビット整数で、ストラタムを表します。値は図11で定義されています。
| 値 (Value) | 意味 (Meaning) |
|---|---|
| 0 | 未指定または無効 (unspecified or invalid) |
| 1 | プライマリサーバー (primary server, 例: GPS受信機を装備) |
| 2-15 | セカンダリサーバー (secondary server, NTP経由) |
| 16 | 非同期 (unsynchronized) |
| 17-255 | 予約済み (reserved) |
図11: パケットストラタム
受信パケットのストラタム値0をピア変数p.stratumのMAXSTRAT (16) にマッピングし、MAXSTRAT以上のp.stratum値を送信パケットで0にマッピングするのが慣例です。これにより、通常ストラタム0に表示される参照クロックを、外部ソースに使用される同じクロック選択アルゴリズムを使用して便利に緩和できます (例については付録A.5.5.1を参照)。
Poll (ポーリング): 8ビット符号付き整数で、連続するメッセージ間の最大間隔をlog2秒で表します。最小および最大ポーリング間隔の推奨デフォルト制限は、それぞれ6と10です。
Precision (精度): 8ビット符号付き整数で、システムクロックの精度をlog2秒で表します。たとえば、値-18は約1マイクロ秒の精度に対応します。精度は、サービスが最初に起動したときに、システムクロックを読み取るための複数の反復の最小時間として決定できます。
Root Delay (rootdelay, ルート遅延): 参照クロックへの合計往復遅延。NTP短形式で表されます。
Root Dispersion (rootdisp, ルート分散): 参照クロックへの合計分散。NTP短形式で表されます。
Reference ID (refid, 参照ID): 特定のサーバーまたは参照クロックを識別する32ビットコード。解釈はストラタムフィールドの値によって異なります。パケットストラタム0 (未指定または無効) の場合、これは「kiss code」と呼ばれる4文字のASCII [RFC1345] 文字列で、デバッグおよび監視の目的で使用されます。ストラタム1 (参照クロック) の場合、これは参照クロックに割り当てられた4オクテット、左詰め、ゼロパディングされたASCII文字列です。参照識別子の権威あるリストはIANAによって管理されています。ただし、ASCII文字「X」で始まる文字列は、未登録の実験および開発用に予約されています。図12の識別子はASCII識別子として使用されています:
| ID | クロックソース (Clock Source) |
|---|---|
| GOES | 静止軌道環境衛星 (Geosynchronous Orbit Environment Satellite) |
| GPS | 全地球測位システム (Global Position System) |
| GAL | ガリレオ測位システム (Galileo Positioning System) |
| PPS | 汎用パルス毎秒 (Generic pulse-per-second) |
| IRIG | Inter-Range Instrumentation Group |
| WWVB | LF Radio WWVB Ft. Collins, CO 60 kHz |
| DCF | LF Radio DCF77 Mainflingen, DE 77.5 kHz |
| HBG | LF Radio HBG Prangins, HB 75 kHz |
| MSF | LF Radio MSF Anthorn, UK 60 kHz |
| JJY | LF Radio JJY Fukushima, JP 40 kHz, Saga, JP 60 kHz |
| LORC | MF Radio LORAN C station, 100 kHz |
| TDF | MF Radio Allouis, FR 162 kHz |
| CHU | HF Radio CHU Ottawa, Ontario |
| WWV | HF Radio WWV Ft. Collins, CO |
| WWVH | HF Radio WWVH Kauai, HI |
| NIST | NIST電話モデム (NIST telephone modem) |
| ACTS | NIST電話モデム (NIST telephone modem) |
| USNO | USNO電話モデム (USNO telephone modem) |
| PTB | ヨーロッパ電話モデム (European telephone modem) |
図12: 参照識別子
ストラタム1より上 (セカンダリサーバーとクライアント): これはサーバーの参照識別子であり、タイミングループを検出するために使用できます。IPv4アドレスファミリーを使用している場合、識別子は4オクテットのIPv4アドレスです。IPv6アドレスファミリーを使用している場合、それはIPv6アドレスのMD5ハッシュの最初の4オクテットです。NTPv3クライアントを持つNTPv4サーバーでIPv6アドレスファミリーを使用する場合、参照識別子フィールドはランダムな値として表示され、タイミングループが検出されない可能性があることに注意してください。
Reference Timestamp (参照タイムスタンプ): システムクロックが最後に設定または修正された時刻。NTPタイムスタンプ形式で表されます。
Origin Timestamp (org, 起点タイムスタンプ): リクエストがクライアントからサーバーに出発した時のクライアントでの時刻。NTPタイムスタンプ形式で表されます。
Receive Timestamp (rec, 受信タイムスタンプ): リクエストがクライアントからサーバーに到着した時のサーバーでの時刻。NTPタイムスタンプ形式で表されます。
Transmit Timestamp (xmt, 送信タイムスタンプ): 応答がサーバーからクライアントに出発した時のサーバーでの時刻。NTPタイムスタンプ形式で表されます。
Destination Timestamp (dst, 宛先タイムスタンプ): 応答がサーバーからクライアントに到着した時のクライアントでの時刻。NTPタイムスタンプ形式で表されます。
注意: 宛先タイムスタンプフィールドはヘッダーフィールドとして含まれていません。パケットの到着時に決定され、パケットバッファデータ構造で利用可能になります。
NTPが物理層にアクセスできる場合、タイムスタンプはフレームの開始後のシンボルの開始に関連付けられます。それ以外の場合、実装はタイムスタンプをフレーム内の最も早くアクセス可能なポイントに関連付けるよう試みるべきです。
MACは、鍵識別子とそれに続くメッセージダイジェストで構成されます。メッセージダイジェスト、または暗号合計は、[RFC1321]のようにすべてのNTPヘッダーおよびオプションの拡張フィールドで計算されますが、MAC自体では計算されません。
Extension Field n (拡張フィールドn): このフィールドの形式の説明については、セクション7.5を参照してください。
Key Identifier (keyid, 鍵識別子): クライアントとサーバーがシークレット128ビットMD5鍵を指定するために使用する32ビット符号なし整数。
Message Digest (digest, メッセージダイジェスト): 鍵とそれに続くNTPパケットヘッダーおよび拡張フィールド (ただし鍵識別子またはメッセージダイジェストフィールドではない) で計算された128ビットMD5ハッシュ。
ここで使用されるMAC計算は、[RFC1305]および[RFC4330]で定義されているものとは異なりますが、既存の実装がMACを生成する方法と一致していることに注意してください。
7.4. The Kiss-o'-Death Packet (Kiss-o'-Deathパケット)
Stratumフィールドが0の場合 (未指定または無効を意味する)、Reference IdentifierフィールドはStatus報告とアクセス制御に役立つメッセージを伝えるために使用できます。これらはKiss-o'-Death (KoD) パケットと呼ばれ、それらが伝えるASCIIメッセージはkiss codesと呼ばれます。KoDパケットは、初期の用途がサーバーアクセス制御に違反するパケットの送信を停止するようクライアントに伝えることだったため、その名前が付けられました。kiss codesは、NTPv4またはSNTPv4のいずれかのインテリジェントクライアントに有用な情報を提供できます。Kiss codesは、左詰めでゼロ埋めされた4文字のASCII文字列でエンコードされています。文字列は文字表示とログファイル用に設計されています。現在定義されているkiss codesのリストは図13に示されています。kiss codesの受信者は、それらを検査しMUST、次の場合、これらのアクションを実行MUST:
a. kiss codes DENYおよびRSTRの場合、クライアントはそのサーバーへのすべてのアソシエーションを解除し、そのサーバーへのパケットの送信を停止MUSTする;
b. kiss code RATEの場合、クライアントは直ちにそのサーバーへのポーリング間隔を減らし、RATE kiss codeを受信するたびにそれを減らし続けMUSTする。
c. ASCII文字「X」で始まるKiss codesは、未登録の実験および開発用であり、認識されない場合は無視MUSTされる。
d. 上記の条件以外では、KoDパケットにはプロトコル上の意味がなく、検査後に破棄されます。
受信タイムスタンプと送信タイムスタンプ (サーバーによって設定) は、KoDパケット内では未定義であり、有効な値を持つことに依存してはならず (MUST NOT)、破棄MUSTされます。
7.5. NTP Extension Field Format (NTP拡張フィールド形式)
NTPv4では、ヘッダーの後、MACの前に1つ以上の拡張フィールドを挿入できます。MACは、拡張フィールドが存在する場合、常に存在します。フィールド形式を定義する以外に、このドキュメントはフィールドの内容を使用しません。拡張フィールドには、図14に示す形式のリクエストまたはレスポンスメッセージが含まれています。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Field Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. .
. Value .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Padding (as needed) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
図14: 拡張フィールド形式
すべての拡張フィールドは、ワード (4オクテット) 境界にゼロパディングされています。Field Typeフィールドは定義された機能に固有であり、ここでは詳しく説明しません。必須フィールドを含む最小フィールド長は4ワード (16オクテット) ですが、最大フィールド長はまだ確立されていません。
Lengthフィールドは16ビット符号なし整数で、Paddingフィールドを含む拡張フィールド全体の長さをオクテット単位で示します。