🤖

NTP での時間同期計算

2022/01/22に公開

NTP での時間同期計算

https://milestone-of-se.nesuke.com/l7protocol/ntp/ntp-summary/ の記事をもとにしている。

自分なりに解釈した内容です。自分がわかりやすいように少し表記を変えています。
上記サイトに誤植があると書いていますが、勘違いでした。

NTP でやりたいこと

NTP サーバーとNTP クライアントがあって、NTP を使って NTPサーバーとNTPクライアントの時計の時間差を求めて、NTPクライアントの時計をNTPサーバーに合わせることを考えます。

前提の定義

  • ある基準時刻"T" のクライアントの時計を Tc とします。
  • ある基準時刻"T" のサーバーの時計を Ts とします。

クライアントの時計を合わせるためにサーバーとクライアントの時計のずれ(=Ts - Tc) を計算します。

NTP パケットの送受信

処理の流れ

クライアントの時計で t1 にパケットを送信して
サーバーの時計で t2 にパケットを受信して
サーバーの時計で t3 にパケットを返送して
クライアントの時計で t4 に応答パケットを受信を受信したとする。

t1 = Tc + t1' (基準時間T から t1' が経過した時間)
t2 = Ts + t2' (基準時間T から t2' が経過した時間)
t3 = Ts + t3' (基準時間T から t3' が経過した時間)
t4 = Tc + t4' (基準時間T から t4' が経過した時間)

クライアントはパケットの中に、t1 の情報を入れて送信する。
サーバーは、返信パケットの中に、t2, t3 に加えて t1 の情報をパケットに含めて返信する。

最終目標

サーバーの時計とクライアントの時計のずれ(=Ts-Tc)を求めたい。

計算方法

クライアントからパケットを送って、サーバーが応答を返して、クライアントが受信するという流れの中で、クライアント~サーバーにパケットが到達するまでの間、サーバーが処理する時間、サーバーが返信してクライアントに届くまでの間の時間差を考慮したうえで、サーバーの時計とクライアントの時計のずれを求めたい。

パケットの送信、受信時間

ここで クライアント~サーバーにパケットが到達するまでの間(=行き) と サーバーが返信してクライアントに届くまでの間(=帰り) に関しては同じ時間かかると仮定する。(⇒ Δと定義する。)

t4 - t1 = Δ + 処理時間 + △
= 2 × Δ + (t3 - t2)

Δ = { (t4 - t1) - (t3 - t2) } / 2
↑ ※1 とする

クライアントのサーバーの時間のずれ

t2'(t2) の時点ではクライアント ~ サーバーの行きの分、Δだけ時間が経過しているので

t2' = t1' + Δ
↑ ※2とする

となる。

t1とt2の定義より、

t1 - Tc = t1' ←※3とする
t2 - Ts = t2' ←※4とする

となる。

※2に※3と※4を代入して以下となる
(t2 - Ts) = (t1 - Tc) + Δ

Ts を右辺に、t1を左辺に移動して
(t2 - t1) = Ts - Tc + Δ

Ts - Tc = (t2 - t1) - Δ
= (t2 - t1) - { (t4 - t1) - (t3 - t2) } / 2 ←※1を利用
= (t2 - t1) - { t4 - t1 - t3 + t2 } / 2
= (t2 - t1) / 2 - (t4 - t3 ) / 2
= { (t2 - t1) - (t4 - t3) } / 2

結論

サーバーの時計とクライアントの時計のずれは
{ (t2 - t1) - (t4 - t3) } / 2

Discussion