NTP是网络时间协议,用于校准时间的一种算法,具体历史可以参考维基百科。
看网上的各种公式证明,好像都是逆向思维,完全看不懂。好在我老婆是数学系的,利用初中数学设未知数的方法,几分钟便解开了谜题。
证明NTP
背景:
有A和B两台电脑,它们的时间不一样,A想调整成B的时间,它们之间有网络可以通讯。
NTP的校准流程是这样的:
- A将当前时间T1(A看自己的钟表),通过网络发送给B。
- B收到请求时的时间是T2(B看自己的钟表)。
- B发回给A之前的时间是T3(B看自己的钟表),并将T2,T3都发回给A。
- A收到B的回应的时间是T4(A看自己的钟表)。
最终A会得到4个时间戳,T1、T2、T3、T4。
校准时间的思路是计算出A和B之间的时差,因为A和B的表一起往前走,所以只需要将A的时间加上时差就和B时间一致了。那么,怎么计算时差呢?
假设A和B的时差是未知数x,A和B之间的单次网络传输耗时为t,B从收到请求到返回请求之间的处理时间是d(B接收很多校准请求,负载略高),那么:
- T2 = T1 + x + t(补齐时差+传输期间的时间)
- T3 = T1 + x + t + d(补齐时差+A->B传输期间+处理响应请求期间)
- T4 = T1 + t + t + d(补齐2次传输途中+B响应请求期间的时间)
用公式a+b,可以得到公式d:
T2 + T3 = 2T1 + 2x + 2t + d
用公式d-c可以得到:
T2 + T3 – T4 = T1 + 2x
经过整理可以得到:
x = ( (T2 – T1) + (T3 – T4) ) / 2
也就是得到了时差x的值,接着把x带入到a中,可以求出2t(往返总延迟):
2t = (T4 – T1) + (T2 – T3)
问题
网络延迟不是对称的,就会导致x计算不停的在变,需要多次执行剔除异常值,再进行估算选值。
由调用链trace想到的ntp协议,所以好奇了解一下。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
