5. Implementation Model (実装モデル)
図2は、典型的なマルチスレッド実装 (multi-threaded implementation) のアーキテクチャを示しています。これには、各サーバー専用の2つのプロセス、サーバーまたは参照クロックからメッセージを受信するピアプロセス (peer process)、およびサーバーまたは参照クロックにメッセージを送信するポーリングプロセス (poll process) が含まれます。
.....................................................................
. Remote . Peer/Poll . System . Clock .
. Servers . Processes . Process .Discipline.
. . . . Process .
.+--------+. +-----------+. +------------+ . .
.| |->| |. | | . .
.|Server 1| |Peer/Poll 1|->| | . .
.| |<-| |. | | . .
.+--------+. +-----------+. | | . .
. . ^ . | | . .
. . | . | | . .
.+--------+. +-----------+. | | +-----------+. .
.| |->| |. | Selection |->| |. +------+ .
.|Server 2| |Peer/Poll 2|->| and | | Combine |->| Loop | .
.| |<-| |. | Cluster | | Algorithm |. |Filter| .
.+--------+. +-----------+. | Algorithms |->| |. +------+ .
. . ^ . | | +-----------+. | .
. . | . | | . | .
.+--------+. +-----------+. | | . | .
.| |->| |. | | . | .
.|Server 3| |Peer/Poll 3|->| | . | .
.| |<-| |. | | . | .
.+--------+. +-----------+. +------------+ . | .
....................^.........................................|......
| . V .
| . +-----+ .
+--------------------------------------| VFO | .
. +-----+ .
. Clock .
. Adjust .
. Process .
............
図2: 実装モデル
これらのプロセスは、アソシエーション (association) と呼ばれる共通データ構造上で動作します。この構造には、上記の統計量と第9節で説明されているさまざまな他のデータが含まれています。クライアントは1つ以上のサーバーにパケットを送信し、それらが受信されたときに返されたパケットを処理します。サーバーは送信元アドレスと宛先アドレスおよびポートを交換し、パケット内の特定のフィールドを上書きして、すぐに (クライアント/サーバーモードで) またはしばらく後に (対称モードで) 返します。各NTPメッセージが受信されると、ピアクロックとシステムクロックの間のオフセット (offset, theta) が、関連する統計量delta、epsilon、およびpsiとともに計算されます。
システムプロセス (system process) には、さまざまなサーバーと参照クロックの間で緩和を行い、システムクロックを同期するための最も正確で信頼性の高い候補を決定する選択 (selection)、クラスター (cluster)、および結合 (combine) アルゴリズムが含まれています。選択アルゴリズムは、ビザンチン障害検出原理 (Byzantine fault detection principles) を使用して、入射集団からおそらく不正確な候補である"falsetickers"を破棄し、"truechimers"と呼ばれる良好な候補のみを残します。truechimer は、以前に公開され信頼された標準に対してタイムキーピング精度を維持するクロックであり、falseticker は誤解を招く、または一貫性のない時刻を示すクロックです。クラスターアルゴリズムは統計原理を使用して、最も正確な truechimers のセットを見つけます。結合アルゴリズムは、生き残った truechimers を統計的に平均化することにより、最終的なクロックオフセットを計算します。
クロック調整プロセス (clock discipline process) は、システムクロックの時刻と周波数を制御するシステムプロセスであり、ここでは可変周波数発振器 (variable frequency oscillator, VFO) として表されます。VFO から取得されたタイムスタンプは、システムクロック時刻を維持するフィードバックループ (feedback loop) を閉じます。クロック調整プロセスに関連付けられているのは、クロック調整プロセス (clock-adjust process) であり、計算された時間オフセットを注入し、一定の周波数を維持するために毎秒1回実行されます。過去の時間オフセット差のRMS平均は、公称誤差またはシステムクロックジッター (system clock jitter) を表します。過去の周波数オフセット差のRMS平均は、発振器周波数安定性 (oscillator frequency stability) または周波数ワンダー (frequency wander) を表します。これらの用語は、第11.3節で正確に解釈されます。
クライアントは、ポーリング指数 (poll exponent) tauによって決定される2^tau秒のポーリング間隔 (poll interval) で各サーバーにメッセージを送信します。NTPv4では、tauは4 (16秒) から17 (36時間) の範囲です。tauの値は、ループ時定数 (loop-time constant) T_c = 2^tau に一致するようにクロック調整アルゴリズムによって決定されます。クライアント/サーバーモードでは、サーバーは即座に応答します。ただし、対称モードでは、2つのピアのそれぞれが現在のシステムオフセットとシステムジッターの関数としてtauを管理するため、同じ値に同意しない可能性があります。NTPサブネット全体で安定性を維持するために、クロック調整アルゴリズムの動的動作を慎重に制御することが重要です。これには、ピアが両方のピアの最小ポーリング指数に等しい共通のtauに同意する必要があります。NTPプロトコルには、この値を適切にネゴシエートするための規定が含まれています。
実装モデルには、システムクロックを設定および調整するいくつかの手段が含まれています。オペレーティングシステムは2つの関数を提供すると想定されています。1つは時刻を直接設定する関数 (たとえば、Unixの settimeofday() 関数)、もう1つは指定された量だけ時刻を進めたり遅らせたりして小さな増分で時刻を調整する関数 (たとえば、Unixの adjtime() 関数) です。この参照およびその後の参照では、名前の後に続く括弧は、単純な変数ではなく関数への参照を示します。意図された設計では、調整が指定されたしきい値 (threshold) より小さい場合、クロック調整プロセスは adjtime() 関数を使用し、しきい値を超える場合は settimeofday() 関数を使用します。これが行われる方法としきい値の値は、第10節で説明されています。