如何得到两服务间的时间差

目录

这篇文章将简单介绍一下 NTP 服务的数学原理,还有获得两服务器时间差的简单技巧。

数学原理

get_diff_time_1.png

  上图是 server1 到 server2 的 icmp ping 包的过程。T1 是 server1 发包时打的时间戳,T2 是 server2 收到包时打的时间戳,
T3 是 server2 回包时打的时间戳,T4 是 server1 收到回包时打的时间戳。利用 T1,T2,T3,T4,我们便可以得到 server1 和 server2
的时间差,其中 d1 是 server1 到 server2 的延时,d2 是 server2 本机的延时,d3 是 server2 到 server1 的延时。

我们的问题是已知 T1,T2,T3,T4,求需要求解的是未知数 d,也就是 server2 - server1 实际的时间差。

我们可以得到下面这些等式:
#时间戳 T1 + server2 和 server1 的时间差距 d + server1 到 server2 的延时实际 d1 = 时间戳 T2 
1, T1+d+d1=T2
# 注意 d 被定义为了 server2 比 server1 多的时间 所以 T3 要减去多的时间 d 然后加上 d3 才是 T4
2, T3-d+d3=T4


#等式 1,2 可以得到
3, 2d = (T2-T4)-(T1-T3)-(d1-d3)

# 很显然我们无法通过 2 个方程求解出 3 个未知数。这时我们可以假设来回的延迟是一样的也就是 d1=d3
得出 2d =(T2-T4)-(T1-T3) 就可以得到我们要求解的 d
很明显我们可以看出这样得出的 d 的误差不会超过 T4-T1(假设误差发生在一边的情况),如果 T4-T1 误差是毫秒
级别的这种误差是可以接受的。



获得两服务器间的时间差

这里写给出下面的脚本。

# 获取本机到 10.191.12.56 的时间差
ping -T tsandaddr 10.191.12.56 -c1 | \ 
sed -n '/TS:/,/packets/p' | \
grep -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' | \
grep -v '[a-z]' | \
awk 'BEGIN{diff=0}{diff=$2+diff}END{print diff,"ms"}'

脚本原理

jimila]$  ping -T tsandaddr 10.191.12.58  -c1
PING 10.191.12.58 (10.191.12.58) 56(124) bytes of data.
64 bytes from 10.191.12.58: icmp_seq=1 ttl=60 time=2.50 ms
TS:   10.187.94.10  29095563 absolute
  100.127.211.129 -864
  100.127.227.38  2062643846 absolute not-standard
  10.191.12.58  866
Unrecorded hops: 3


--- 10.191.12.58 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 2.508/2.508/2.508/0.000 ms

# 我们可以看到 ping 包进过了 IP1:10.187.94.10,IP2:100.127.211.129,IP3:100,127.227.38 最后到达目标 IP4:10.191.12.56
# 在内网延迟极小的情况下我们可以忽略延迟认为 IP4 的时间戳 - IP1 的时间戳就等于 IP1 和目标 IP4 机器的时间差。

#所以有 IP4-IP1 = IP4-IP3 + IP3-IP2 + IP2 -IP1 = -864+866  (absolute 的都没有参与计算)
#所以上面的脚本就认为得到了 IP4 和 IP1 的时间差(注意是在内网中 ping 的延迟极小的情况下)

get_diff_time_2.png

目录