時刻の誤差が命取り
突然ですが、ご自身のコンピュータの内蔵時計の時刻は正確でしょうか? Macをお使いの読者の皆さんの場合、より注意して時刻が合っているかを確認してください。
なぜならmacOSで採用されている、ネットワークを通じてコンピュータ間でユーザの認証を行う「ケルベロス(Kerberos)」という認証方式は、時計の設定時刻が正確であることが前提となっており、時刻が不正確だと認証が正しく行えなくなるからです。ほかにも、アイクラウドの同期や認証も、時刻が正確であることを前提に作られているなど、設定時刻が正確でないと、さまざまな問題が発生する原因となってしまうのです。
そこで、macOSにはネットワークにつながってさえいれば、ネットワーク上のサーバから正確な時刻を取得し、時計の時刻を合わせる仕組みが組み込まれています。このサーバとの通信手段を「NTP(Network Time Protocol)といいます。
NTPサーバが時刻を守る
NTPで現在時刻のデータを配信しているサーバ(NTPサーバ)は、インターネット上のあらゆる場所に用意されています。もっとも正確な時刻を保持しているNTPサーバは、GPSや標準電波、原子時計といった正しい時間を刻む時刻源と接続されており、そこから時刻を取得し、NTPを通じて、接続されているクライアントに時刻を提供します。
とはいえ、すべてのクライアントがこうしたサーバに接続すると、ネットワークの混雑が発生してしまい、正しい時刻を届けるべき通信のやりとりも不安定になってしまいます。そうならないために、NTPサーバは階層構造になっています。
高度に正確な時刻源に直結されたサーバを「Stratum 1」、そこから時刻を取得したNTPサーバが「Stratum 2」となり、その下が「Stratum 3」と続いていきます。「Stratum」という値で何階層目かを示すのです。
また、ISP(インターネットサービスプロバイダ)の多くは、利用者向けに独自のNTPサーバを提供しています。固定回線に接続しているコンピュータなどは、こうしたプロバイダ独自のNTPサーバを参照するほうが、ネットワークの負担が少なくなります。
macOSの場合は、アップルが用意した「アメリカ(time.apple.com)」「アジア(time.asia.apple.com)」「ヨーロッパ(time.euro.apple.com)」といった地域のNTPサーバが初期設定で選択されています。MacBookなどのように、持ち歩いて、あちこちのネットワークにつなぐことが多い機種は、確実に存在するアップルのNTPサーバを参照したままにしたほうがいいでしょう。
NTPサーバの階層構造
最上位NTPサーバ(Stratum 1)は、原子時計やGPS、標準電波など、高精密な時刻情報を元に動作することが必須となっています。Stratum 1のサーバと時刻同期して動作するサーバはStratum 2、Stratum 2と同期するサーバはStratum 3と、精密な時刻情報からどれぐらい離れているかを「Stratum」という数値で表します。Stratumの数値が若いほど高精度のNTPサーバになるというわけです。クライアントはどのStratrumのNTPサーバともつながることができ、MacやAirMacベースステーションなどは、それ自身がNTPサーバになることもできます。なお、Stratumが大きいサーバから時刻を同期しても、一般用途では問題ありません。
時刻を正確にするには
実は、NTPによる時刻合わせは、すぐに働くというわけではありません。いきなり時間が巻き戻ったり、たくさん進んでしまうと、ソフトウェアが想定しないエラーを起こす恐れがあるためです。Macの時計が進みすぎている場合は少しずつ「遅らせ」、遅れている場合は少しずつ「進めて」、ソフトウェアの動作に影響がないように合わせていきます。もし大きく誤差が生じている場合は、その分、時刻が合うのに時間がかかるというわけです。
では、すぐに合わせるにはどうすればいいのでしょう。ネット上で広まったTipsの1つに、「システム環境設定」の[日付と時刻]の[日付と時刻を自動的に設定]を一旦オフにしてから、再度オンにすると、時刻がすぐに合う、というものがあります。なぜそんなことが起こるのか。それは、macOSがNTPによる時刻合わせを起動する「手順」に理由があります。
[日付と時刻を自動的に設定」をオンにすると、オープンソースのサービス管理フレームワーク「launchd」に「org.ntp.ntpd」というサービスの起動指示が伝わります。「launchd」がどういったサービスをどう起動するかは、「/System/Library/LaunchDaemons」以下にサービスごとのプロパティリスト形式のファイルとして格納されています。この中から「org.ntp.ntpd.plist」を確認すると、「/usr/libexec/ntpd-wrapper」というスクリプトを実行するように記載されています。
スクリプトの末尾にある「ラッパー(wrapper)」とは、UNIXでよく使われる用語です。ある機能を使おうとしたときに、そのための細々とした手順をひとまとめ(ラップ)して、使いやすくしたものを指します。「ntpd-wrapper」もその名前のとおり、NTPを参照する定型的な手順をまとめて1つのスクリプトにしたものです。詳しい手順は下のリストを参照ください。
ここでのポイントは、3番目の「sntpコマンド」の実行です。sntpコマンドはNTPサーバに接続して、時刻を取得し、その時刻をMacにセットしてしまいます。本来のNTPによる時刻合わせとは異なり、時刻がとんでもなく進もうが、巻き戻ろうが気にせず、その時刻にしてしまうのです。これが「システム環境設定」の[日付と時刻を自動的に設定]を一旦オフにしてから、オンにすると時刻が合う理由です。
気をつけなくてはならないのが、このシステム設定による時刻の急な変更を行うと、時刻に厳密なソフトウェアやサービスによってはエラーを起こす場合があるということです。もちろん、時刻をズレたままにしていたり、時間をかけてゆっくり合わされるより、一度のエラーで正しい時刻を元にリトライしても一般的な用途ではそこまで問題がないこともあります。きちんと仕組みを理解して、設定を行うようにしましょう。
ntpdの動作確認
ntpdが動作しているときは、「ntpdc」というコマンドで状態を確認することができます。「-l」オプションを実行すると「使用中のNTPサーバ」を、「-p」オプションを実行すると「詳細」を表示できます。この図版の[jptyo5-ntp-001.aaplimg.com]は[time.asia.apple.com]を構成するNTPサーバのうちの1台です。詳細情報の内「st」の数値がStratumを表すので、このNTPサーバはStratum 1であることがわかります。
【 NTPサーバと負荷分散 】
通常、NTPサーバはIPアドレスかホスト名で指定される1台のサーバマシンになっています。ただ、1台だとどうしても性能に限界があるため、サーバ1、サーバ2、サーバ3という形で、連番に何台もサーバを用意し、利用者がどれかを選べる形にして負荷分散を図るのが一般的です。このとき、どうしても1番最初の番号のサーバや一番最後の番号のサーバなどは設定する人が多くなるため、間の適当な番号を選ぶのがおすすめです。大量のアクセスが見込まれる公開NTPサーバなどでは、1つのホスト名に複数のマシンを割り当て、サーバを順繰りに使うことで負荷を分散させています。アップルが提供するNTPサーバなどは、実際には複数台存在しており、アクセスした瞬間にどのサーバにアクセスするかを変えることで負荷分散しています。
【公開NTPサーバ】
その名のとおり、誰でも利用できる公開してあるNTPサーバを指します。たとえばYahoo! BBなら「ntp.bbtec.net」という利用者向けのNTPサーバが提供されています。しかし、これらは過負荷を回避するため、そのISP(インターネットサービスプロバイダ)のネットワークの外側からは参照できないようになっていることが多いです。時刻同期はコンピュータの動作やセキュリティで非常に重要なこともあり、独立行政法人情報通信研究機構(NICT)が「ntp.nict.jp」というNTPサーバを一般公開しており、誰もが正しい時間に合わせられるようにしています。また国内ではインターネットマルチフィードという民間企業でも「ntp.jst.mfeed.ad.jp」というNTPサーバを公開しています。NTPサーバの設定に困ったら、これらを設定するといいでしょう。
【注意】
特にソフトウェア開発をしている人は、コンピュータの時間設定に気をつけるべきでしょう。Xcodeを含む多くの開発環境が、ビルド時にファイルの時間を参照して、ビルドする必要があるかを判定しているからです。
【NITZ】
iOSの場合、携帯通信網にある「NITZ」という規格を使って時刻合わせをしています。自動設定にしておいて、携帯の電波が届けば時刻が合わされる仕組みになっています。ただ、Wi-Fiの利用時などに備えて、NTPも併用されています。
文●千種菊理
本職はエンタープライズ系技術職だが、一応アップル系開発者でもあり、二足の草鞋。もっとも、近年は若手の育成や技術支援、調整ごとに追い回されコードを書く暇もなく、一体何が本業やら…。