Contents
近頃、NTP に関するトラブルに遭遇したため、あらためて NTP について調べてみました。
NTP とは
概要
- Network Time Protocol の略
- ネットワークに接続される機器が持つ時計を正しい時刻へ同期するための通信プロトコル
バージョン
- 2010 年 6 月に最新バージョンの NTP4 が RFC の Proposed Standard(RFC 公開後のインターネット標準化過程の最初の段階)となった
時刻同期の仕組み
- NTP プロトコル上では、協定世界時 (UTC) を使って時刻を送受信する
- 上位の NTP サーバーとのネットワーク通信の遅延を継続的に計測し、受け取った時刻情報を補正して自動的にミリ秒単位の精度で時計を校正する
階層構造
- NTP は stratum (stratum1-16) と呼ばれる階層構造を持ち、最上位のサーバーが正確な時計から標準時を取得して下位のホストはそれを参照する事で時刻を合わせる
- 最上位の NTP サーバーが stratum1 となり、階層を下りるごとに数字が一つずつ大きくなる。最下位の stratum16 には時刻同期することはできない
- stratum1 の NTP サーバーは、GPS や標準電波、原子時計などの正確な時刻源 (stratum0) に直結されている
- 一般的に stratum の大きさよりも、NTP サーバーとのネットワーク的な近さのほうが時刻精度に大きく影響する
- ntpd は下位 stratum の NTP サーバーとも接続することができる
時刻同期の確認
Linux、または組み込み Linux を使用したアプライアンス等では、多くの場合、ntpd が標準的に使用されています。
時刻同期状態の確認
ntpd では、ntpq -p
コマンドで時刻同期状態を確認できます。下記はさくらの VPS での出力例です。
[root@centos ~] # ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*ntp1.sakura.ad. 10.84.87.146 2 u 844 1024 377 0.828 0.226 0.108
Tally Code
先頭の記号は Tally Code と言います。Tally Code は自分が判断した相手先のステータスを示します。次にステータスの意味を示します。
Tally Code | ステータス | 説明 |
---|---|---|
none | reject | 使えないと判断された NTP サーバー |
x | falsetick | intersection アルゴリズムで使えないと判断された NTPサーバー |
. | excess | 参照する NTP サーバーが多いので使わない NTP サーバー |
– | outlyer | cluster アルゴリズムで使えないと判断された NTP サーバー |
+ | candidat | combine アルゴリズムに合格し、いつでも参照可能な NTP サーバー |
# | selected | 同期距離が遠いが参照可能な NTP サーバー |
* | sys.peer | 同期中であると宣言された NTP サーバー |
上記に示したとおり、正常に同期できていればステータスが sys.peer になります。数時間、他の状態である場合は調査が必要です。
各フィールドの意味
フィールド | 説明 |
---|---|
remote | NTP サーバーのホスト名 |
refid | 参照 ID。CDMA 同期の Endrunで は CDMA、GPS 同期では GPS、不明の場合は 0.0.0.0 となる |
st | stratum 値 |
t | 階層タイプを示す。l:local, u:unicast, m:multicast, b:broadcast となる |
when | 最後のパケットを受け取ってからの時間(秒)を示す |
poll | ポーリング間隔(秒)を示す。最初は高速に同期ができるように短いポーリング間隔となるが、NTP サーバーの負荷を減らすため、時刻同期された後は徐々に長くなる |
reach | NTP サーバーへの直近 8 回分の接続結果を 8 ビットの 8 進数で示す。全て成功していれば 377(2 進数で 11111111)となる |
delay | ポーリングインターバルの遅延の推定値(パケット往復時間)を示す(単位:ミリ秒) |
offset | NTP サーバーとのオフセット(ずれ)を示す。同期中は値が徐々に小さくなり、正確な時刻に調整される。10 ミリ秒以下なら問題はない(単位:ミリ秒) |
jitter | オフセット値の分散を示す。値が小さいほど正確な時刻同期が可能になる。10 ミリ秒以下なら問題はない(単位:ミリ秒) |
余談
たまに Catalyst(Cisco 製のスイッチ)は NTP サーバーになることができないと言っている人に会いますが、Catalyst がなれないのは自身のローカルクロックを提供する NTP サーバーになれないだけで、Catalyst が他の NTP サーバーを参照して時刻同期できていれば、その同期した時刻を提供する NTP サーバーとして動作しています。たぶん、ntp master コマンドが使えないのでそう思っているだけだと思います。Cisco の ntp master コマンドは ntpd で server 127.127.1.0 と設定(自身のローカルクロックを提供)した場合の動作と同等です。ちなみに最近の新しい Catalyst(3650 等)、Nexus は ntp master コマンド を使用することができます。IOSではないからだと思います。
NTP でトラブルがあったのであらためて調べてみた