[笔记] NTP协议时差计算


NTP数据包中记录了4个事件:

  1. 客户端发送
  2. 服务器接收
  3. 服务器发送
  4. 服务器接收

在客户端\(C\)的时钟下,四个事件的时间分别为\(c_1,c_2,c_3,c_4\),其中\(c_1\)\(c_4\)被记录在NTP数据包中。
在服务端\(S\)的时钟下,四个事件的时间分S别为\(s_1,s_2,s_3,s_4\),其中\(s_2\)\(s_3\)被记录在NTP数据包中。如表:

事件 客户端\(C\)的时钟 服务端\(S\)的时钟 NTP数据包记录的
1: 客户端发送 \(c_1\) \(s_1\) \(c_1\)
2: 服务器接收 \(c_2\) \(s_2\) \(s_2\)
3: 服务器发送 \(c_3\) \(s_3\) \(s_3\)
4: 服务器接收 \(c_4\) \(s_4\) \(c_4\)

设客户端和服务器的时钟差为\(\triangle t = s_1-c_1 = s_2-c_2=s_3-c_3=s_4-c_4\)(实际计算时取平均值)

假定往返时间间隔相等,均为\(T\),现求\(T\):
同一个轴上的时间差,即\(c_4-c_1\)\(s_3-s_2\),是准确的。不同轴上的时间差,如\(s_2-c_1\)是不准确的。不难看出客户侧总时间与服务侧总时间有相等关系\(c_4-c_1 = T + (s_3-s_2) + T\)
从而解出\(T = \frac{(c_4-c_1)-(s_3-s_2)}{2}\)

\(c_2 = c_1 + T\),可求得\(\triangle t_2 = s_2-c_2 = s_2 - (c_1 + T) \\ = s_2 - c_1 - \frac{(c_4-c_1)-(s_3-s_2)}{2} \\ = \frac{-c_1+3s_2-s_3-c_4}{2}\)

同理可求出\(\triangle t_4 = s_4-c_4 = s_3 + T - c_4 \\ = s_3 - c_4 + \frac{(c_4-c_1)-(s_3-s_2)}{2} \\ = \frac{-c_1-s_2+3s_3-c_4}{2}\)

在1,3点的偏差分别与2,4点相同。

将这四个\(\triangle t'\)求平均,可得\(\triangle t = \frac{s_2-c_1+s_3-c_4}{2}\)

在4处的准确时间应当是\(c_4 + \triangle t\)