TL

NTP の動作原理:時刻補正とクロック規律

時刻ずれの原因と直し方が原理から腑に落ちる。4つのタイムスタンプで遅延とオフセットを分離し、stratum・フィルタ・規律で安定させ、うるう秒も乗り切る仕組みを解説する。

応用NTP時刻同期クロックうるう秒ネットワーク最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.送受信の4タイムスタンプから、往復遅延 delay とずれ offset を分離して計算し、片道の非対称が誤差の主因になる。
  • 2.stratum は基準源からの距離で、選別はフィルタとクラスタリングで外れ値を捨て、規律ループ(PLL/FLL)が周波数ごと徐々に合わせる。
  • 3.1秒の飛びを避けるため、うるう秒は slew(時計を緩やかに伸縮)で吸収するのが実務の定石で、step は最終手段。

時刻同期が解くべき2つの未知数

ネットワーク越しに相手の時計と合わせたいとき、本当に知りたいのは「自分の時計が相手よりどれだけずれているか(オフセット)」です。ところが問い合わせの往復には伝送遅延が混ざり、観測した時刻差にはオフセットと遅延の両方が同居します。NTP(RFC 5905)の核心は、1往復で取れる4つのタイムスタンプから、この2つの量を代数的に分離するところにあります。

NTP は UDP のポート123上で動きます。TCP を使わないのは、再送やコネクション確立の遅延が時刻計測そのものを歪めるためで、遅延が小さく一定であることが精度に直結するからです。

4タイムスタンプによる遅延とオフセットの計算

クライアントがサーバーへ要求を投げ、応答を受け取るまでに4つの時刻が記録されます。

記号意味計測する時計
T1クライアントが要求を送信した時刻クライアント
T2サーバーが要求を受信した時刻サーバー
T3サーバーが応答を送信した時刻サーバー
T4クライアントが応答を受信した時刻クライアント

T1 と T4 はクライアントの時計で、T2 と T3 はサーバーの時計で打たれます。ここから往復遅延 delay とオフセット offset を次のように求めます。

往復遅延   delay  = (T4 - T1) - (T3 - T2)
時刻オフセット offset = ((T2 - T1) + (T3 - T4)) / 2

delay は「クライアント側で経過した全体時間 (T4 - T1)」から「サーバー内部で滞留した時間 (T3 - T2)」を引いた、純粋に回線上を往復した時間です。offset は往路のずれ (T2 - T1) と復路のずれ (T3 - T4) を平均したもので、両式ともサーバーとクライアントの絶対的な時刻基準を必要としないのが巧妙な点です。差分だけで閉じているため、両者の時計の起点が違っても計算が成立します。

なぜ平均で遅延が打ち消せるのか

offset の式は、往路と復路の遅延が**等しい(対称)**という前提で導かれます。往路遅延を d、真のオフセットを θ とすると T2 - T1 = θ + dT3 - T4 = θ - d となり、足して2で割れば d が消えて θ だけが残ります。つまり offset の誤差は、往復遅延そのものではなく往復の非対称性から生じます。

片道の非対称が精度の天井を決める

上の前提が崩れる、すなわち往路と復路で遅延が異なると、offset に直接誤差が乗ります。非対称が Δ(往路と復路の差)あるとき、offset には最大で Δ/2 の誤差が入り得ます。だから NTP の精度は回線の対称性に支配されます。

  • 経路が往復で物理的に異なる(非対称ルーティング)と、片道遅延が食い違う。
  • 上り下りで帯域や混雑度が違うと、キューイング遅延が非対称になる。詳しくは 帯域・レイテンシ の議論が下敷きになります。

NTP は delay を品質指標として併用します。delay が大きい応答ほど offset の信頼区間が広いとみなし、後段の選別で重みを下げます。精度を詰めたいなら、まず安定して小さい delay が出る経路を選ぶのが定石です。

stratum:基準源からの距離

NTP の階層は stratum(ストラタム) という整数で表され、これは精度の等級ではなく基準クロックからのホップ数です。

  • stratum 0: 原子時計・GPS 受信機など、ネットワーク外の物理基準源そのもの。
  • stratum 1: stratum 0 に直結したサーバー(基準源を直接読む)。
  • stratum n: stratum (n-1) のサーバーに同期したサーバー。最大15まで、16は「未同期」を意味する。

stratum が下がる(数字が増える)ほど基準源から遠く、誤差が累積しやすくなります。クライアントは複数のサーバーから選ぶ際、stratum の小ささを優先しつつ、後述の delay やばらつきも勘案します。なお stratum はループ防止にも効き、自分より大きい(遠い)stratum のサーバーには同期せず、ループ的な相互同期を避けます。

クロックフィルタ:8サンプルから最良を1つ選ぶ

1回の往復測定はパケットがキューで待たされるたびにブレます。NTP は各サーバーごとに直近8回の {offset, delay} の組をシフトレジスタに保持し、その中から最も delay の小さいサンプルの offset を採用します。

クロックフィルタ(サーバーごと):
  直近8サンプル: [(offset_1, delay_1), ..., (offset_8, delay_8)]
  採用 = delay が最小のサンプルの offset
  品質指標 = 採用 offset 周辺のばらつき(ジッタ)

「平均」ではなく「最小 delay のものを選ぶ」のが要点です。混雑による遅延は常に正の方向にしか増えないため、最も速く返ってきた応答が最もキュー汚染が少なく、真値に近いと判断できます。これは外れ値を平均で薄めるのではなく、最良の1点に賭ける設計です。

選別と組み合わせ:嘘つきサーバーを排除する

複数サーバーの候補が出そろうと、NTP はそれらを鵜呑みにせず統計的に絞り込みます。段階は大きく3つです。

段階やること狙い
選択(intersection)各サーバーの信頼区間が重なる中央集団を求める明らかに外れた falseticker を排除
クラスタリングばらつきの大きい候補を端から削る残った truechimer の集合に絞る
結合(combine)残りを delay/距離で重み付け平均単一の最終 offset を合成

ここで排除される嘘つきを falseticker、生き残る正直者を truechimer と呼びます。複数の独立したサーバーを設定する本当の理由は冗長化だけでなく、1台が壊れた時刻を返しても多数決で弾ける点にあります。サーバーが1台だと、その1台がずれていても気づけません。

サーバーは最低3台、実務では4台以上

falseticker を多数決で弾くには、正直者が過半数である必要があります。設定数が少ないと壊れた1台に引きずられます。実務では4台以上が推奨で、こうしておくと1台が落ちても3台で多数決を維持できます。3台が falseticker 検出の最小構成で、2台ちょうどは食い違ったときどちらが正しいか決められず最悪の構成です。

クロック規律:時計を「ステップ」ではなく「規律」する

最終的な offset が出ても、NTP は基本的に時計をいきなり飛ばしません。時刻が逆行したり飛んだりすると、ログの順序やタイムスタンプ依存の処理が壊れるからです。代わりに規律ループ(discipline loop)が、時計の進む速さ(周波数)ごと徐々に合わせます。

このループは2つの制御を組み合わせます。

  • PLL(位相同期ループ): 現在の offset を打ち消す方向に、時計の刻む速度を微調整する。位相(ずれそのもの)を追う。
  • FLL(周波数同期ループ): 時計の水晶発振器が持つ固有の進み遅れ(周波数誤差)を推定し、補正値を恒常的に加える。
規律ループの動き(概念):
  loop ごとに:
    補正 = Kp * offset          # 位相項(PLL): 今のずれを縮める
         + Ki * 周波数誤差の積分  # 周波数項(FLL): 水晶の癖を学習
    時計の進む速度に補正を反映     # ステップせず速度で吸収

周波数誤差を学習・記憶するのが効きます(多くの実装は driftfile に保存)。一度その時計が「1日に何秒進む癖がある」と分かれば、ネットワークが一時的に途切れても、覚えた周波数補正だけで時刻はしばらく保たれます。

step が起きる閾値(128ms と 1000s)

通常は slew(速度で滑らかに調整)ですが、offset が大きすぎると現実的な時間で追従できません。多くの実装は offset が**128ms を超えると step(即時にジャンプ)**します。さらに offset が 1000秒を超えると、もはや同期不能とみなして停止します(-g で初回のみ許容)。起動直後の大きなずれは step で一気に詰め、その後は slew で規律するのが標準的な振る舞いです。

うるう秒:1秒の飛びをどう吸収するか

うるう秒は UTC に挿入(または削除)される1秒で、23:59:59 の次に 23:59:60 が現れます。NTP の上流は**うるう秒インジケータ(LI ビット)**で「今日の末尾に1秒入る」と事前告知します。問題はこの1秒を時計にどう反映するかです。

方式やり方副作用
step 挿入23:59:60 で時計を1秒止める/巻き戻す同一秒が二度出現し、時刻が単調増加しない
leap smear前後の数時間で1秒を薄く引き伸ばすその間わずかに時刻がずれるが連続・単調

素朴な step 挿入は、同じ秒が2回出る(または1秒飛ぶ)ため、時刻の単調増加を前提にしたソフトウェア(タイムスタンプで順序付けする DB やログ集約)を壊し得ます。そこで大規模事業者は leap smear(うるう秒の塗り広げ) を採る例が多く、うるう秒の前後で時計の進む速度をごくわずかに変え、1秒を数時間かけて吸収します。これにより 23:59:60 という不連続を一切出さずに UTC へ収束できます。

smear と非 smear を混在させない

leap smear 中のサーバーと、step 挿入の標準サーバーを同じクライアントから混ぜて参照すると、両者が一時的に最大1秒食い違い、NTP の選別が falseticker として弾き合うか、offset が暴れます。smear を使うなら、配下のすべてのクライアントが smear する上流だけを向くよう統一してください。

まとめと検証

NTP は「4タイムスタンプで delay と offset を分離 → 最小 delay で最良サンプルを選ぶ → 多数決で嘘つきを排除 → 速度(周波数)ごと規律する」という多段の防御で、ノイズの多い回線からミリ秒級の同期を絞り出します。精度の天井は往復の対称性が握り、安定性は周波数学習が支えます。

実際の挙動は ntpq -p(各サーバーの offset・delay・jitter・stratum・reach を一覧)や chronyc tracking / chronyc sources で確認できます。offset と delay の振る舞いを生で見たいときは パケットキャプチャ で T1〜T4 を直接読み、非対称が疑わしければ ネットワークの切り分け の手順で往復路を分けて追ってください。

試験・面接での頻出ポイント
  • delay = (T4-T1)-(T3-T2)、offset = ((T2-T1)+(T3-T4))/2。offset の誤差源は往復の非対称。
  • stratum は精度等級ではなく基準源からのホップ数。0=物理源、1=直結、16=未同期。
  • クロックフィルタは平均ではなく「最小 delay のサンプル」を採る。複数サーバーで falseticker を多数決排除。
  • 通常は slew(規律)、128ms 超で step、1000秒超で同期停止。うるう秒は leap smear で単調性を保つのが実務の定石。

ネットワーク Article

NTP の動作原理:時刻補正とクロック規律を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

NTP

比較で見る軸

難易度: advanced / カテゴリ: ネットワーク / タグ数: 5

導入後に効く点

stratum は基準源からの距離で、選別はフィルタとクラスタリングで外れ値を捨て、規律ループ(PLL/FLL)が周波数ごと徐々に合わせる。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
ネットワーク
タグ数
5

判断チェックリスト

  • 自社の用途が「NTP / 時刻同期」に近いか確認する。
  • 強みである「送受信の4タイムスタンプから、往復遅延 delay とずれ offset を分離して計算し、片道の非対称が誤差の主因になる。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

NTP時刻同期クロックうるう秒ネットワークNTP時刻同期クロック
参考: 公式情報