PCの時間は何故正確なのか

いきなりですが、昔のWindowsのPCは内蔵時間がすごく遅れましたよね。数日であっという間に数分は遅れていたような気がします。今お使いのPCのOSがWndows7以降の場合は、大体いつも正確な時間になっていて遅れませんよね。何故だかご存知ですか。

結論からいうとWindowsが自動的にインターネット上に用意されたMicrosoftの時計に合わせているからです。あくまでWindows初期状態の話ですが、毎週日曜日午前1時に勝手に時計を合わせにいきます。電源が入っていなかったり、インターネットにつながっていなかったりする場合は、次に電源が入ってインターネットにつながった際に時計を合わせます。合わせにいく頻度や日時は設定で変更することが可能です。また、初期状態では「time.windows.com」というMicrosoftのサーバの時計に合わせにいきますが、サーバを変更することも可能です。

 

前置きが長くなりましたが、コンピュータ(クライアント)が別のコンピュータ(タイムサーバ)に時間を問い合わせて、その返答に基づいて自分の時計を修正するには、NTPという通信プロトコルを使用します。

現在時刻の情報を送るのなんか簡単だろ、と思ってしまいますが、ネットワーク経由であること特有の問題点があります。それは、サーバからクライアントへパケットが届くまでの時間を考慮しなければならないという点です。ネットワークの通信速度は環境によってまったく異なるので、送られてきたパケットに記録されている時刻情報が何秒前の時刻なのか一律に決められないのです。NTPでは、以下の手順でこの問題の影響を低減しています。

①クライアント側でサーバへ時刻情報の送信を要求するパケットを送信してから、サーバからの返信が届くまでに要した時間を計算する。

(仮に5秒かかったとします。)

②届いたパケットにはサーバが要求を受け取った時刻と返信を行った時刻が記録されているので、その間をサーバの処理に要した時間として計算する。

(仮に1秒で返信したとします。)

③①から②を引いて、サーバでの処理に要した時間を除いた、通信そのものに掛かった時間を算出します。

(5秒から1秒を引いて4秒。これを通信に要した時間と考えます。)

④③で算出した通信時間を2で割って、片道の通信時間を算出します。

(4秒を2で割って2秒。これを片道の通信時間とします。)

⑤パケットに記録されている時刻情報に2秒を加えたのが現在のサーバの時刻と推定して、その時刻に自分の時計を合わせます。

実際にはミリ秒単位で計算してなるべく誤差のない時刻を算出するようになっています。

 

今どきのWindowsは、このプロトコルを使ってインターネット経由でMicrosoftのサーバの時計に合わせているわけです。

 

コラム一覧へ