NTPとは「Network Time Protocol」の略だ。
簡単に言えば、ネットワーク上で時間を同期するプロトコルのことである。コンピュータの時間合わせなどに使う。
このページではNTPの概要とその仕組みについて解説した。このページを見ればNTPについておおよその理解はできた状態になるはずだ。
目次
NTPとは?
NTPについて
NTPはネットワーク上で時間同期するプロトコルのことだ。NTPはコンピュータの内部時刻を正しく設定するために、ネットワーク上の時刻サーバに問いあわせる手順を定義している。
実装したものの代表としてはサーバとして「ntpd」クライアントとして「ntpdate」などがある。ともにntpに関するオープンソースプロジェクト「http://www.ntp.org」でコードが配布されている。
「コンピュータの時刻」というのはPC側だけでみると軽視されがちだ。「少し時間がずれてるなぁ」くらいの感想だろう。しかし、本当はとても重要である。
コンピュータの時刻に狂いが生じた場合、メールを始めチャットなどの時間表示に影響が出てくる。また重要な点としてファイルシステムのタイムスタンプなどにも影響がでる。サーバの場合ログの記録に影響がでるので絶対に軽視してはいけない。
「コンピュータは常にNTPを使い正確な時刻を取得させておくべき」と言っても過言ではないだろう。
Network Time Protocol とTime Protocol
古典的な方法として「Time Protocol」というものが存在しているがネットワーク経路間の時刻補正が含まれておらず誤差が発生してしまう。
NTPにはサーバから取得した時刻値そのサーバから機器に時刻値が到達するまでの通信時間の補正も含まれており、最も妥当だと思われる時刻同期ができるようになっている。
具体的には
- クライアントがクエリを発信した時刻
- サーバがクエリを受信した時刻
- サーバが応答を発信した時刻
- クライアントが応答を受信した時刻
が考慮され計算される。
NTPの階層構造
NTPサーバは階層構造で管理され、NTP自体の階層はストラタムと呼ばれる。聞きなれない言葉だろうが、暗記は必要ない。NTP以外では出てこないので、内容だけ理解しておけば十分だ。
ストラタムは1から16まで存在する。ストラタム16は最下位でストラタム16に同期することはできない。数字が小さいほど、正確な時刻を刻んでいる。また存在するサーバ数も少なくなる。最上位であるストラタム1のNTPは原子時計やGPSの時刻を参照している。
原子時計やGPSの時計はストラタム0となる。つまりストラタム0はネットワーク史上最も正確な時刻を刻んでいることになる。下の図を見ると少しわかりやすいだろう。
NTPの実装であるntpdでは上位ストラタムだけでなく、複数の同位・下位ストラタムのNTPサーバとも接続できるようになっている。
複数のサーバと時刻の比較およびネットワークの遅延を計算し、その計算結果を「時刻」としている。複数のサーバと同期をとることで突発的な通信遅延の変化などにも対応できるようになっている。
ntpdateコマンド
Linuxではntpdateコマンドを使って、NTPサーバから正確な時刻を取得できる。
# ntpdate NTPサーバ名
次の例ではNTPサーバntp.nict.jpから現在時刻を取得している。
# ntpdate ntp.nict.jp
NTP詳細解説
ここからさらに細かいところに入っていく。NTPの概要を知りたければ、ここまでで理解は十分だ。より深く知りたい方は読んでみていただきたい。
SNTP
Network Time Protocolは非常に複雑なプロトコルだ。完全に実装するのは非常に難しい。ネットワーク遅延やOSハードウェアの実装など考慮すべき点が非常に多いからだ。
その結果、非常に多機能で複雑なプログラムになりかねない。
そこで「SNTP」というのが誕生している。これは「Simple Network Time Protocol」の略称だ。名前のとおりNTPの簡易版にあたるプロトコルである。基本的にはクライアント向のプロトコルで時刻情報を受信するのが主な役割であり、プロトコル自体がシンプルである。
パケットとポートや同期モード
「NTP」および「SNTP」ともにパケットは「UDP」、ポート番号「123」を使うようになっている。
同期モードとしてはクライアントとサーバが同期しクライアントの時刻が設定されるモード、これは一般的なモードだ。もう一つサーバとサーバが互いの状態を確認するモードがある。これをシンメトリックモードという。同じ階層のNTPサーバ同士で使われるモードであり、このモードはユーザが明示的に設定しないと動作しない。
NTPは同じストラタムのTPサーバ同士で、NTPピアとして、互いに同期できるようになっている。基幹部のNTPサーバは非常に重要で複数のNTPサーバを同じストラタムで稼動させ、それぞれ同期、その上でそれぞれが異なった上位のNTPサーバを参照するように設定することで、時刻サーバの単一障害点をなくす事ができる。
時刻修正について
サーバを運用する段階で、そのサーバの時刻が大きく狂ってしまったとして、その場合いきなり、「ntpdate -b <server>」などで他のマシンの正確な時間に同期させてはいけない、徐々に時間を修正してゆくように設定すべきだ。
もちろん「ntpd」及び「ntpdate」にもこの設定をほどこすことが可能だ。ntpdateの場合「ntpdate -B <server>」だ。
なぜ徐々に修正していく必要があるかというと、定期実行プログラムcronなどが多重実行されてしまう可能性があるからだ。またファイルシステムがありえないはずの「未来にマウントされる」という状態が発生しかねない。
時刻を即座に正しい時刻に合わせるモードを「stepモード」、徐々に時刻を合わせるモードを「slewモード」となる。slewモードで徐々に時間を合わせる場合1秒間に最大0.0005秒修正がかかる。10秒を補正するのに約5時間30分かかることになる。
「時刻あわせ」はサーバの場合慎重におこなうことに気をつけていただきたい。
ntpとサーバ負荷
エンドユーザー、つまりクライアントマシンからのNTPをつかった時刻同期をおこなう場合は、なるべくストラタムの番号の大きなサーバを指定して、同期すること、もしクライアントマシン全てがストラタム1サーバと同期した場合その時刻サーバはトラフィック負荷に耐えきれず、まるでクラッカーからの攻撃されたのと同じ状態になってしまう。また負荷によって時刻が狂ってしまう可能性すらある。
ストラタム1のNTPサーバは非常に重要な存在でメンバー登録をしなければ利用できないことが多い。日本では福岡大学などがストラタム1のNTPサーバを公開している。
親切なインターネットサービスプロバイダなどは自ネットワーク内にNTPサーバを設置してあることが多い、基本的にそちらと同期するようにしたほうが良いだろう。
また、クライアントが多いようであれば、組織内に自前でNTPサーバを用意してもいい。
日本の主なNTPサーバ(全てではない)
下記はメインどころのNTPサーバだ。ご参考に、置いておこう。
提供組織:福岡大学(公開)
公開されているがアクセス負荷が強いため、なるべく他のものを使おう!
ntpサーバーのURLは外しておいた。
提供組織: 独立行政法人情報通信研究機構(NICT)
ストラタム1
ntp.nict.jp
ストラタム1でありながら個人での利用も認めている。
提供組織: インターネットマルチフィード (MFEED)
ストラタム2
ntp.jst.mfeed.ad.jp
提供組織: 国立天文台
ストラタム2
s2csntp.miz.nao.ac.jp
pool.ntp.orgについて
こちらは、有志によって成り立つNTPサーバ群だ。目的は重要なNTPサーバへの負荷軽減である。
クリティカルではないサーバなどはこちらのプールを利用することを検討しよう。
まとめ
このページではNTPとは何か?についてご紹介した。
- 時間を合わせるために使うもの
- ストラタムの階層構造になっていて、数字が小さいほど重要度が高い
- ntpdateコマンドを使って更新する
あたりをまずは把握しておけば十分だ。ある程度自前で建てるのもそれほど難しくないため、興味がある方はチャレンジしてみてほしい。
福岡大学は載せない方がいいのでは?
コメントありがとうございます。そうですね。外しておきます。