メインコンテンツまでスキップ

3. ネットワークタイムプロトコル

このセクションは、データ形式、エンティティ、状態変数、イベント、およびイベント処理手順を含む、ネットワークタイムプロトコルの正式な定義で構成されています。この仕様は図1に示された実装モデルに基づいていますが、これが仕様の基礎となる唯一のモデルであることを意図していません。特に、この仕様はNTPの本質的な動作を説明および明確化し、より厳密で包括的で検証可能な仕様の基盤として機能することを目的としています。

3.1. データ形式

ここで明示的または暗黙的に表現されるすべての数学演算は、2の補数固定小数点演算です。データは整数または固定小数点量として指定され、ビットは左側または上位位置から始まるゼロからビッグエンディアン方式で番号が付けられます。さまざまな実装が内部使用のために外部から派生した量をスケーリングする可能性があるため、固定小数点量の精度も小数点配置も指定されていません。特に指定がない限り、すべての量は符号なしであり、ビットゼロの前に暗黙のゼロを持つ完全なフィールド幅を占有できます。符号付き量で動作するように設計されたハードウェアおよびソフトウェアパッケージは、最上位(符号)ビットが設定されている場合、驚くべき結果をもたらします。完全なフィールド幅で表される精度が正当化されることはめったにないため、タイムスタンプなどの外部から派生した符号なし固定小数点量を内部使用のために右に1ビットシフトすることをお勧めします。

NTPタイムスタンプは大切なデータであり、実際にはプロトコルの主要な製品を表すため、特別なタイムスタンプ形式が確立されています。NTPタイムスタンプは、1900年1月1日0時を基準とした秒単位の64ビット符号なし固定小数点数として表されます。整数部分は最初の32ビットにあり、小数部分は最後の32ビットにあります。この形式により、便利な多倍長演算とタイムプロトコル表現(秒)への変換が可能になりますが、ICMPタイムスタンプメッセージ表現(ミリ秒)への変換は複雑になります。この表現の精度は約200ピコ秒であり、最もエキゾチックな要件にも十分対応できるはずです。

タイムスタンプは、メッセージの到着などの重要なイベントが発生したときに、ローカルクロックの現在値をタイムスタンプにコピーすることによって決定されます。最高の精度を維持するためには、イベントに関連付けられたハードウェアまたはソフトウェアドライバーにできるだけ近い場所でこれを実行することが重要です。特に、出発タイムスタンプはリンクレベルの再送信ごとに再決定する必要があります。ホストが再起動されたときやプロトコルが最初に起動したときなど、特定のタイムスタンプが利用できない場合があります。これらの場合、64ビットフィールドはゼロに設定され、値が無効または未定義であることを示します。

1968年のある時点以降、最上位ビット(整数部分のビット0)が設定されており、64ビットフィールドは2036年のある時点でオーバーフローすることに注意してください。2036年にNTPが使用されている場合、1900年に対する時刻と2036年に対する時刻(および136年の他の倍数)を修飾するための外部手段が必要になります。そのような修飾を必要とするタイムスタンプ付きデータは非常に貴重であるため、適切な手段が容易に利用可能であるべきです。136年ごとに64ビットフィールドがゼロになり、したがって無効と見なされる200ピコ秒の間隔が存在します(以降無視されます)。

3.2. 状態変数とパラメータ

以下は、プロトコルで使用されるさまざまな状態変数とパラメータの要約です。これらは、オペレーティングシステム環境とローカルクロックメカニズムに関連するシステム変数、各ピアに固有のプロトコルマシンの状態を表すピア変数、NTPメッセージの内容を表すパケット変数、および現在のバージョンのすべての実装の固定構成定数を表すパラメータのクラスに分けられます。各クラスについて、変数の説明の後にその名前とそれを制御する手順または値が続きます。変数は小文字で、パラメータは大文字であることに注意してください。形式と使用に関する追加の詳細は、後のセクションと付録に示されています。

3.2.1. 共通変数

以下の変数は、システム、ピア、およびパケットクラスの2つ以上で共通です。追加の変数は、付録Cで説明されているオプションの認証メカニズムに固有です。同じ名前の共通変数を区別する必要がある場合は、変数識別子が使用されます。

ピアアドレス(Peer Address,peer.peeraddr, pkt.peeraddr)、ピアポート(Peer Port,peer.peerport, pkt.peerport): これらはピアの32ビットインターネットアドレスと16ビットポート番号です。

ホストアドレス(Host Address,peer.hostaddr, pkt.hostaddr)、ホストポート(Host Port,peer.hostport, pkt.hostport): これらはホストの32ビットインターネットアドレスと16ビットポート番号です。マルチホーミング(multi-homing)をサポートするために状態変数に含まれています。

閏秒インジケータ(Leap Indicator,sys.leap, peer.leap, pkt.leap): これは、NTPタイムスケールに挿入される差し迫った閏秒を警告する2ビットコードです。これらのビットは挿入日の23:59前に設定され、翌日の00:00後にリセットされます。これにより、挿入日の秒数(ロールオーバー間隔)が1だけ増加または減少します。プライマリサーバーの場合、これらのビットはオペレーターの介入によって設定されますが、セカンダリサーバーの場合、これらのビットはプロトコルによって設定されます。2ビット、ビット0とビット1は、それぞれ次のようにコード化されています。

意味
00警告なし
01最後の分は61秒
10最後の分は59秒
11アラーム条件(クロック非同期)

アラーム条件(11₂)を除くすべての場合、NTP自体はこれらのビットで何もせず、NTPの一部ではない時間変換ルーチンに渡すだけです。アラーム条件は、最初の起動時やプライマリ参照ソースが利用できない長期間の後など、何らかの理由でローカルクロックが同期されていない場合に発生します。

モード(Mode,peer.mode, pkt.mode): これは関連モードを示す整数で、値は次のようにコード化されています。

モード
0未指定
1対称アクティブ
2対称パッシブ
3クライアント
4サーバー
5ブロードキャスト
6NTP制御メッセージ用に予約
7私的使用のために予約

ストラタム(Stratum,sys.stratum, peer.stratum, pkt.stratum): これはローカルクロックのストラタムを示す整数で、値は次のように定義されています。

意味
0未指定
1プライマリ参照(例:校正された原子時計、無線時計)
2-255セカンダリ参照(NTP経由)

比較目的では、ゼロの値は他のどの値よりも大きいと見なされます。パケット変数としてエンコードされた整数の最大値はパラメータNTP.MAXSTRATUMによって制限されることに注意してください。

3.2.2. システム変数

表1は、完全なシステム変数のセットを示しています。前述の共通変数に加えて、オペレーティングシステムはローカルクロックを同期するために以下の変数を使用します。

ローカルクロック(Local Clock,sys.clock): これは現在のローカル時刻で、タイムスタンプ形式です。ローカル時刻は特定のマシンのハードウェアクロックから派生し、使用される設計に応じて間隔で増分します。セクション5では、調整およびスキュー補償メカニズムを含む適切な設計について説明しています。

クロックソース(Clock Source,sys.peer): これは現在の同期ソースを識別するセレクターです。通常、これはピア変数を含む構造体へのポインタになります。特別な値NULLは、現在有効な同期ソースがないことを示します。

3.2.3. ピア変数

表2は、完全なピア変数のセットを示しています。前述の共通変数に加えて、ピア管理および測定機能は以下の変数を使用します。

構成ビット(Configured Bit,peer.config): これは、関連が構成情報から作成されたことを示すビットで、ピアが到達不能になった場合でも解除されるべきではありません。

更新タイムスタンプ(Update Timestamp,peer.update): これは、最新のNTPメッセージが受信されたときのローカル時刻で、タイムスタンプ形式です。スキュー分散の計算に使用されます。

到達可能性レジスタ(Reachability Register,peer.reach): これはNTP.WINDOWビットのシフトレジスタで、ピアの到達可能性ステータスを判定するために使用され、ビットは最下位(最右端)から入ります。このレジスタの少なくとも1つのビットが1に設定されている場合、ピアは到達可能と見なされます。

ピアタイマー(Peer Timer,peer.timer): これは、送信されるNTPメッセージ間の間隔を制御するために使用される整数カウンタです。ゼロ以外の値に設定されると、カウンタは1秒間隔でゼロに達するまで減分され、その時点で送信手順が呼び出されます。このタイマーの動作はローカルクロック更新から独立していることに注意してください。これは、計時システムと間隔タイマーシステムアーキテクチャが互いに独立している必要があることを意味します。

3.3. 動作モード

ブロードキャストモードを除き、NTP関連は2つのピアがメッセージを交換し、それらの1つまたは両方が関連と呼ばれるプロトコルマシンのインスタンス化を作成および維持するときに形成されます。関連は、ホストモード変数(peer.mode)によって示される5つのモードのいずれかで動作できます:対称アクティブ、対称パッシブ、クライアント、サーバー、およびブロードキャスト。これらは次のように定義されます。

対称アクティブ(Symmetric Active,1): このモードで動作するホストは、ピアの到達可能性状態またはストラタムに関係なく定期的なメッセージを送信します。このモードで動作することにより、ホストはピアによって同期され、ピアを同期する意思を表明します。

対称パッシブ(Symmetric Passive,2): このタイプの関連は、通常、対称アクティブモードで動作するピアからのメッセージが到着したときに作成され、ピアが到達可能でホスト以下のストラタムレベルで動作している限り持続します。それ以外の場合、関連は解消されます。ただし、関連は少なくとも1つのメッセージが返信として送信されるまで常に持続します。このモードで動作することにより、ホストはピアによって同期され、ピアを同期する意思を表明します。

クライアント(Client,3): このモードで動作するホストは、ピアの到達可能性状態またはストラタムに関係なく定期的なメッセージを送信します。このモードで動作することにより、ホスト(通常はLANワークステーション)はピアによって同期される意思を表明しますが、ピアを同期しません。

サーバー(Server,4): このタイプの関連は、通常、クライアント要求メッセージが到着したときに作成され、その要求に応答するためにのみ存在し、その後関連は解消されます。このモードで動作することにより、ホスト(通常はLANタイムサーバー)は同期する意思を表明しますが、ピアによって同期されません。

ブロードキャスト(Broadcast,5): このモードで動作するホストは、ピアの到達可能性状態またはストラタムに関係なく定期的なメッセージを送信します。このモードで動作することにより、ホスト(通常は高速ブロードキャストメディア上で動作するLANタイムサーバー)はすべてのピアを同期する意思を表明しますが、それらのいずれによっても同期されません。

3.4. イベント処理

NTPで関心のある重要なイベントは、アクティブな関連を持つ各ピア専用のピアタイマー(peer.timer)の期限切れ時、およびさまざまなピアからのNTPメッセージの到着時に発生します。イベントは、オペレーターコマンドまたはプライマリ参照ソース障害などの検出されたシステム障害の結果としても発生する可能性があります。このセクションでは、これらのイベントが発生したときに呼び出される手順について説明します。

3.5. 同期距離手順

距離手順は、ピアpeerのピア変数から同期距離を計算します。

begin distance(peer) procedure;
DELTA <- peer.rootdelay + |peer.delay|;
EPSILON <- peer.rootdispersion + peer.dispersion + φ(sys.clock - peer.update);
LAMBDA <- EPSILON + |DELTA| / 2;
end distance procedure;

DELTAは場合によっては負になる可能性がありますが、EPSILONとLAMBDAは常に正であることに注意してください。

3.6. アクセス制御の問題

NTP設計は、タイムサーバーでの偶発的または悪意のあるデータ変更(改ざん、tampering)または破壊(妨害、jamming)が、一般的に同期サブネット内の他の場所で計時エラーをもたらすべきではないようなものです。ただし、このアプローチの成功は、冗長タイムサーバーと多様なネットワークパス、および改ざんまたは妨害が同時に同期サブネット全体の多くのタイムサーバーで発生しないという仮定に依存しています。原則として、サブネットの脆弱性は、信頼できることが知られているタイムサーバーの選択を通じて、およびそれらのタイムサーバーのみが同期ソースになることを許可することによって設計できます。付録Cで説明されている認証手順は、これを実施するための1つのメカニズムを表します。ただし、暗号化アルゴリズムは非常にCPU集約的であり、送信手順の説明で言及されているような予防措置を講じない限り、精度を深刻に低下させる可能性があります。

NTP自体の必須機能ではありませんが、一部の実装には、不正アクセスを防ぎ、どのピアがローカルクロックを更新できるかを制御するアクセス制御機能が含まれる場合があります。この目的のために、3つのアクセスカテゴリを区別することが有用です:信頼できるものとして事前承認されたもの、友好的なものとして事前承認されたもの、およびその他すべての(事前承認されていない)アクセス。おそらく、事前承認は構成ファイルのエントリまたはKerberos [STE88]のような何らかのチケット管理システムによって達成されます。このモデルでは、信頼できるアクセスのみがピアが同期ソースになることをもたらすことができます。友好的なアクセスはピアが同期ソースになることをもたらすことはできませんが、NTPメッセージとタイムスタンプは指定どおりに返されます。

タイムサーバー自体の存在を隠すことが意図されていない限り、事前承認されていないアクセスを制限することによって生じる秘密のクロックを維持することは有用ではないようです。行儀の良いインターネットホストは、サービスが実装されていない場合やリソースが利用できない場合にICMPサービス利用不可エラーメッセージを返すことが期待されます。ただし、NTPの場合、必要なリソースは最小限であるため、クロックを読み取ることのみを目的とした要求を制限する必要はほとんどありません。次に、単純で効果的なアクセス制御メカニズムは、対称モードまたはクライアントモード(モード1、2、および3)で事前構成されたすべての関連を信頼できるものと見なし、他のすべての関連(事前構成されているかどうかに関係なく)を友好的と見なすことです。

より包括的な信頼モデルが必要な場合、設計は32ビットインターネットアドレス、32ビットマスク、および3ビットモードで構成される各エントリを持つアクセス制御リストに基づくことができます。ソースアドレス(pkt.peeraddr)とエントリのマスクの論理ANDがエントリの対応するアドレスと一致し、モード(pkt.mode)がエントリのモードと一致する場合、アクセスが許可されます。それ以外の場合、ICMPエラーメッセージが要求者に返されます。マスクの適切な選択により、モードによる要求を個々のアドレス、特定のサブネットまたはネットアドレスに制限するか、まったく制限しないことが可能です。次に、アクセス制御リストは、どのピアが関連を作成できるかを制御するフィルターとして機能します。