HIRANO Kiyoshi 2002/02/08 sntpd - SNTP daemon (client & server) Simple Network Time Protocol (SNTP) により時刻合わせをするデモン。 ・指定のサーバに接続して自マシンの時刻を調整するクライアント機能を持ちます。 ・他のマシンに対して時刻情報を配布するサーバ機能も持ちます。 サーバ〜クライアント間の通信は、UDP/IPプロトコルで、RFC2030: Simple Network Time Protocol Version 4 で規定された48byteのメッセージ(optionalデータは無し) により行ないます。ポートは送受信とも 123 番を使用します。IPv4のみの対応です。 SNTPで使用する時刻のデータ形式(1900年基準で符号無し32bitの秒を使用)とUNIXの 時刻のデータ形式(1970年基準で符号付き32bitの秒を使用)で表現できる時刻の範囲 からくる制限により、有効に動作するのは1970年〜2035年の間だけになります。 ※ この問題に対する標準的な解決方法が確立した時点で対応する予定です。 SNTPのデータ形式は「閏秒」に対応していません。閏秒の時には、1秒前の時刻と同 じ値が繰り返されます(58-59-60-00 でなく 58-59-59-00 になる)。そのため、閏秒 とその1秒前の区別がつかないので、閏秒に関係する可能性のあるデータを利用しな いようにしてあります(その時のデータを無視する)。なお、処理を簡略化するため、 「閏秒に関係する可能性のある」は、*毎日* の 23:59:59 としています。 UNIXのシステム時刻は閏秒をサポートする場合としない場合があり、SNTPのデータと の変換を単純な減算で行うことができません。また、閏秒の一覧はメンテナンスが必 要になるため、独自に持つ方式は避けることにしました。そこで、変換は、途中で時 分秒に分離したデータを経由して行う方式にしました。処理は遅くなりますが、閏秒 の対応は、時分秒分離データとUNIXデータとの変換を行うライブラリ関数の中で必要 に応じて行なわれます。 サーバへの時刻の問い合わせは標準では30分毎に行います。その際に得られた時刻差 の情報は、以下のようにして自マシンのシステム時間に反映します。 ・時刻の差分が1分を超える場合には、安全のため、エラー扱いとし、無視します。 自マシンの時刻が大きくずれている場合には、手動で調整する必要があります。 ・起動直後、最初の時刻問い合わせの結果は誤差が大きいようなので、捨てます。 ・起動してから少しの間の問い合わせ結果は、すぐ、adjtime() により反映します。 また、その時の時刻差の平均値を求め、それを、自マシンの時計の精度(進み方が 速い/遅い)の情報の初期値として用います。 ・自マシンの時計の精度が求められたら、その値に従って、1分ごとに adjtime() に より時刻を調整します。また、30分ごとに得られる時刻差の情報により、精度の情 報を微調整し、時刻のがずれないようにします。 (このような複雑な方式にしたのは、時計の進み方のずれが非常に大きいマシンに対 応するためです。30分間で0.3秒を超えた例があり、単純に行うと、誤差が大きくな り過ぎてしまいます。) 参照するサーバは名前またはIPアドレスで指定します。指定できるのは1台だけです。 問い合わせを送ってから結果を受け取るまでの時間が1秒を超える場合は、通信上の トラブルがあったとみなして、エラー扱いとし、無視します。 問い合わせの中に乱数を埋め込んでおき、帰って来た結果にその乱数が含まれている ことを確認の上、情報を利用します。正しい乱数値が含まれていない場合には、不正 なデータ(サービス妨害の攻撃)として、無視します。 指定されていないサーバからのメッセージも、不正なデータとして、無視します。 接続を許可するクライアントは、ホストアドレスまたはサブネットアドレスで指定し ます。指定されていないクライアントからのメッセージは、エラー扱いとし、無視し ます。ホストアドレスまたはサブネットアドレスは10個まで指定できます。 動作確認は OpenBSD/i386 3.0版 で行っています。環境依存と思われる機能について は、条件コンパイルで対応するようにしたので、Linux や *BSD であれば、動作する と思われます。多分... (Linux の man ぐらいは確認しました) クライアントとしては、自分自身の他に、Windows上のソフトとして、桜時計(0.2.1) と AdjustPC(1.12) を利用して確認をしました。 使用方法: sntpd [-dnt] server-name [client-address ...]" -d: デモンモード。制御端末を切り離してバックグラウンドで動作する。 この場合、起動後のメッセージは全て syslog に出力されます。 -n: 時刻更新をしないモード。サーバへの問い合わせの動作確認用です。 -t: トレース情報を出力する。動作確認用です。 server-name は、NTP/SNTPサーバを名前またはIPアドレスで指定します。 client-address を指定した場合、サーバ機能が有効になります。この場合、 指定したホストアドレスまたはサブネットアドレスからの問い合わせにのみ、 応答を返します。アドレスは以下のような形式で指定します。 192.168.1.2/32, 192.168.1.2 … ホスト(単独)指定。 192.168.1.0/24, 192.168.1 … サブネット指定。 Copyright 2002 HIRANO Kiyoshi. All rights reserved. $Id: README,v 1.2 2002-02-09 21:52:08+09 kiyoshi Exp $