NTPのStratum階層とGPS時刻同期の仕組み

Share

Windowsの時刻がずれやすいと感じたことをきっかけに、NTPの仕組みやStratum階層、GPSを用いた時刻同期について調べた内容をまとめる。

NTPとは

NTP(Network Time Protocol)は、ネットワーク上の機器間で時刻を同期するためのプロトコルである。現在広く使われているのはNTPv4(RFC 5905)で、1985年の初版から改良が重ねられている。

NTPはStratum(階層)と呼ばれるツリー構造で時刻を配信する。上位の正確な時刻源から下位へ順に同期することで、ネットワーク全体の時刻精度を維持している。

Stratum階層

NTPのStratum階層は以下のように定義される。

  • Stratum 0 : 基準時刻源そのもの。原子時計やGPS受信機などのハードウェアデバイスが該当する。Stratum 0はネットワーク上のサーバではなく、シリアルポートやUSBなどでStratum 1サーバに直接接続される
  • Stratum 1 : Stratum 0に直接接続されたNTPサーバ。プライマリタイムサーバとも呼ばれる
  • Stratum 2以降 : 上位のStratumサーバに同期するサーバ。数字が大きくなるほど基準時刻源から離れており、累積する遅延やジッタの影響を受けやすくなる
  • Stratum 16 : RFC 5905において「未同期」を意味する特別な値。有効なStratumは0から15までであり、Stratum 16のサーバは同期が確立されていないことを示す

一般的に、Stratumの数値が小さいほど基準時刻源に近く、精度が高い傾向にある。ただし、Stratumはあくまで基準時刻源からのホップ数を示す指標であり、ネットワーク品質やサーバの構成によっては、Stratumが低いからといって必ずしも最終的な同期精度が優れるとは限らない。

GPSが時刻源になる理由

GPS衛星は軌道上で正確に位置を特定し測位信号を送信する必要があるため、各衛星に原子時計が搭載されている。GPS受信機はこの信号から高精度な時刻情報を取得できる。

GPSによる測位の仕組みも時刻に基づいている。GPS受信機は複数の衛星から受信した信号の到達時間差を利用して、各衛星までの距離を算出し、三辺測量(trilateration)の原理で自身の位置を特定する。つまり、GPSとは本質的に「高精度な時刻配信システム」であり、測位はその応用にすぎない。

このため、GPS受信機はNTPにおけるStratum 0の基準時刻源として利用できる。GPS受信機をコンピュータに接続し、gpsdやchronyなどのソフトウェアで構成すれば、そのコンピュータはStratum 1のNTPサーバとして機能する。

Windowsの時刻ずれ

Windowsは既定でtime.windows.comをNTPサーバとして使用する。時刻のずれが生じる原因としては、同期の頻度や精度の設定が一般的なユースケース向けに最適化されていることが挙げられる。Windowsの時刻同期サービス(W32Time)はもともとKerberos認証の要件を満たす程度の精度を想定しており、高精度な時刻同期を目的として設計されたものではない。

NTPサーバをより信頼性の高いものに変更することで、ある程度の改善が期待できる。

Cloudflare Time Service

Cloudflareは無料の公開NTPサービスとして time.cloudflare.com を提供している。世界中に分散されたエニーキャストネットワークを活用しており、地理的に最も近いサーバから時刻を取得できる。NTPに加えて、NTS(Network Time Security)にも対応しており、時刻同期の安全性を高められる点が特徴である。

自作Stratum 1サーバについて

前述の通り、GPS受信機をコンピュータに接続してNTPサーバを構成すれば、原理上はStratum 1サーバを自作できる。しかし、実用上考慮すべき点がある。

  • GPS信号の受信には屋外にアンテナを設置するか、窓際など空が見える環境が必要になる
  • 安定した運用には、受信機の品質、ソフトウェアの適切な設定、継続的なメンテナンスが求められる
  • 自分だけが利用するNTPサーバにこうした構成を組む費用対効果は高くない

個人利用においては、Cloudflareやpool.ntp.orgなどの実績ある公開NTPサービスを利用するのが現実的な選択である。これらのサービスは十分な精度と可用性を備えており、一般的な用途では不足を感じることはない。

Read more

Dependabotの対応が面倒なのでRenovateを導入する

Dependabotくんはある程度の依存関係の更新を通知してくれるが、山のようにprojectを抱えているとなんとも痒いところに手が届かない。 ということで、Renovateを使ってみる。 Build software better, togetherGitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.GitHub ここからGitHub Appを入れる。 あとは、指示に従ってポチポチするだけで、超かんたんだった。 感想 自動化最高。

By Sakashita Yasunobu

nodejsのバグを見つけたのでPRを投げてみた

概要 要するに、node --testで特定のバイナリを標準出力に書くと、テストランナーが固まったり、異常終了したりするバグです。 バグ自体は既知のものだったようで、修正がされていました。 test_runner: infinite loop in FileTest#drainRawBuffer when child stdout contains FF 0F followed by large size bytes · Issue #62693 · nodejs/nodeVersion v25.9.0 (also reproduced on v24.14.1 LTS, v22.21.0 LTS, v23.4.0) Platform Darwin 25.

By Sakashita Yasunobu
青空文庫のParser

青空文庫のParser

青空文庫のParserを作ってます。 GitHub - P4suta/aozora: Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks.Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks. - P4suta/aozoraGitHubP4suta Rustで作ってますが、配布物はcargoのほかにnpm/pypiでも入手できます Documentation * Playground — try it in

By Sakashita Yasunobu