今天看webrtc的卡尔曼滤波算法,里面有点小知识涉及到了: ntp网络时间的同步.
特意写此篇文章记录一下:
如上图:
我们有2个设备A和B,A的时间是10::00:00am ,B的时间是11::00::00,现在我们要把A和B的时间统一.
首先我们以B的时间为统一的时间源,这样时间才好统一.
实际上我们要统一时间,我们需要计算的是,A和B之间的时间差(一个小时).
我们把问题转化为数学题:
1.Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1)
2.当此NTP报文到达Device B时,Device B加上自己的时间戳,该时间戳为11:00:01am(T2)
3.当此NTP报文离开Device B时,Device B再加上自己的时间戳,该时间戳为11:00:02am(T3)
4.当Device A接收到该响应报文时,Device A的本地时间为10:00:03am(T4)
所以我们需要求:
1.这个ntp往返一次所需要花费的时间?
两种解法:
第一种解法:
t = [ T(2) - (T1) ] + [T(3) - T(4)];
t = (11:00::01 - 10::00::00) + (11::00::02 - 10::00::03) = 2s
但是这种结算对计算理解起来很不友好,因为设计到双方时间的转化,但是比较我们自己比较好理解.
在计算机中我们主要我们采用这种写法:
t = [T(4) - T(1)] - [T(3) - T(2)] = 2秒
意思是:
T(4) - T(1)是报文从发送到收到总的花费时间, T(3) - T(2)为报文在B设备里处理花费的时间.
所以T(4) - T(1)] - [T(3) - T(2)]就是报文往返的耗费时间. (官方上的叫法叫rtt).
2.设备A相对设备B的时间差.
这个更容易:
offset = [T(2) - T(1) + T(3) - T(4)] / 2
上面的计算其实不精准,还应该减去往返数据的时间差rtt
offset = [T(2) - T(1) + T(3) - T(4)] - t (第一步计算得出) / 2.