HOME会社概況業務内容開発分野開発事例CANモジュールソフテックだよりお問い合わせ
HOME > ソフテックだより > 第205号(2014年3月5日発行) 技術レポート「SNTPクライアント開発」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより(技術分野別)のページへ
ソフテックだより(シーン別)のページへ


ソフテックだより 第205号(2014年3月5日発行)

技術レポート

「SNTPクライアント開発」

1. はじめに

ネットワーク接続されている機器間において、各機器の時刻が同期されていないと、時刻に依存したデータをやり取りする際に、異常をきたす場合があります。例えば、データ解析を行う際に、機器Aでは10時に現象が発生したと記録されているが、機器Bでは11時に現象が発生したと記録されている、といった状況です。
そのため、ネットワーク接続されている機器間は時刻同期されることが望ましいとされています。
時刻同期の方法はネットワーク機器間で決めることもできますが、一般的に使用されているプロトコルを適用すれば、接続機器が変わっても時刻同期を行えるようになります。
今回はSNTPでの時刻同期について紹介いたします。

2. SNTPとは

SNTP(Simple Network Time Protocol)とは名前の通り、NTPの簡略版のプロトコルになります。NTPは高精度、高信頼性の時刻情報を提供するため、複雑なプロトコルになっていますが、SNTPはNTP仕様のうち、複雑な部分を簡略化し、クライアントが簡単に時刻同期を行うことに特化したプロトコルになっています。

2-1. SNTPプロトコルフォーマット

SNTPプロトコルフォーマットについて紹介します。
併せて今回SNTPクライアントを実装する上での各設定内容についても紹介いたします。また、設定内容はSNTPクライアントのユニキャストモード(クライアントとサーバーが1対1)としています。

SNTPプロトコルフォーマット
表1. SNTPプロトコルフォーマット

LI(Leap Indicator):閏秒指示子/2bit

その日の最後の1分において、閏秒を挿入/削除するかの警告を設定する2bitコードです。SNTPクライアントのユニキャストモードでは0を指定します。

意味
0 警告なし
1 最後の1分が61秒
2 最後の1分が59秒
3 警告状態(時刻同期してない)

VN(Version Number):バージョン番号/3bit

NTP/SNTPのバージョン番号です。SNTPを使用する場合はバージョン4になります。

Mode:モード/3bit

動作モードを指定します。SNTPのクライアントを実装する場合は3のクライアントモードを指定します。NTPサーバーからの応答時は4が指定され返ってきます。

Value 意味
0 reserve
1 対称アクティブモード
2 対称パッシブモード
3 クライアントモード
4 サーバーモード
5 ブロードキャストモード
6 reserve(NTP制御メッセージ用)
7 reserve(プライベート用)

Stratum:階層/8bit(符号付整数)

ローカル時計の階層レベルになります。
SNTPクライアントのユニキャストモード時は0を指定します。

Value 意味
0 不明または有効ではない階層
1 Stratum 1
2〜15 Stratum 2〜15
16-255 reserve

Poll:ポーリング間隔/8bit(符号付整数)

連続するメッセージの最大間隔になります。
値は秒単位で2のべき乗で示されます。
4を指定すれば2の4乗=16秒となります。
SNTPクライアントからの要求時は0を指定します。

Precison:制度/8bit(符号付整数)

ローカル時計の精度になります。
値は秒単位で2のべき乗で示されます。
SNTPクライアントからの要求時は、0を指定します。

Root Delay:ルート遅延/32bit(符号付固定小数点)

往復遅延の合計値になります。小数点はbit15とbit16の間にあります。SNTPクライアントからの要求時は0を指定します。
受信時は必要に応じこの値をもとに時刻の誤差修正を行いますが、今回のSNTPクライアント実装においては行いません。

Root Dispresion:ルート分散/32bit(符号無固定小数点)

NTPサーバーが上位のNTPサーバーと通信を行う構成であった場合、その誤差を示すものになります。小数点はbit15とbit16の間にあります。SNTPクライアントからの要求時は0を指定します。受信時は必要に応じこの値をもとに時刻の誤差修正を行いますが、今回のSNTPクライアント実装においては行いません。

Reference Identifier:参照識別子/32bit(文字列)

NTPサーバーが時刻を参照している元を文字列で示したものになります。
SNTPクライアントからの要求時は0を指定します。

Reference Timestamp (64):参照タイムスタンプ/64bit

(上位32bit:秒、下位32bit:小数点)
SNTPクライアントが要求時に指定したTransmit TimeStampがNTPサーバーからの応答時に格納されています。SNTPクライアントからの要求時は0を指定します。

Originate Timestamp (64):開始タイムスタンプ/64bit

(上位32bit:秒、下位32bit:小数点)
クライアントがサーバーに対し要求を送信した時刻になります。SNTPクライアントからの要求時は0を指定します。

Receive Timestamp (64):受信タイムスタンプ/64bit

(上位32bit:秒、下位32bit:小数点)
NTPサーバーがクライアントからの要求を受信した時刻が設定されます。
SNTPクライアントからの要求時は0を指定します。
NTPサーバーからの応答時はNTPサーバーが要求を受信した時刻が設定されます。

Transmit Timestamp (64):送信タイムスタンプ/64bit

(上位32bit:秒、下位32bit:小数点)
クライアントがサーバーに対し要求を送信した時刻になります。SNTPクライアントからの要求時は現在の時刻を指定します。
NTPサーバーからの応答時はNTPサーバーが応答を送信した時刻が設定されます。

Key Identifier (optional) (32):認証識別子/32bit

NTP認証識別子を指定します。時刻同期に認証が必要な場合、システムに応じ指定します。

Message Digest (optional) (128):メッセージダイジェスト/128bit

NTP認証のためのメッセージダイジェストを指定します。時刻同期に認証が必要な場合、システムに応じ指定します。

3. SNTP実装例

今回のSNTPクライアント実装においての接続構成図を図 1に示します。

接続構成図
図1. 接続構成図

SNTPクライアントの実装はLinuxOSで行いました。
ここでご紹介させていただくのは、SNTPクライアントのソフトウェアを開発する上での注意点になります。

注意点
NTPの場合、時刻の開始は1900/1/1から
Linux OSの場合、時刻の開始は1970/1/1からになります。
そのため、NTPのタイムスタンプをそのままLinuxOSに設定すると、70年分遅れた時刻となってしまいます。Linux OSから取得した時刻をNTPのタイムスタンプに設定する時やNTPのタイムスタンプをLinuxOSに設定する時は変換してから設定を行う必要があります。
小数点は固定小数点
タイムスタンプは浮動小数点でなく、固定小数点で扱います。
サーバーからの応答サイズはサーバー次第
オプションである認証識別子、メッセージダイジェストはサーバーが応答を返すかはサーバー次第です。そのため、受信時にサーバーから認証識別子、メッセージダイジェストが返ってくることを前提としてしまうと、受信サイズが足りなくて、処理されないといったことが起きる可能性があります。NTPサーバーの認証が必要でないなら、応答サイズ確認では認証識別子、メッセージダイジェストのサイズを確認する必要はないと考えています。
4. おわりに

今回紹介させていただいた、時刻同期は普段使っている時は意識しませんが、いざという時に非常に重要になります。特に障害が発生した時は、時刻が秒単位でずれているだけでも致命的になる場合もあります。
システムを検討する時、時刻同期機能のように普段はあまり意識しないですが、実は非常に重要であるといった機能は他にもあると思います。そういった機能はなんとなく知っているが、詳細はよく知らないといったことが多々あります。そういった機能について、今後もっと意識していきたいと考えています。

(S.O.)

[参考文献]
RFC 2030:
http://www.ietf.org/rfc/rfc2030.txt

関連ページへのリンク

関連するソフテックだより