Python 计算两台主机之间的网络时延及时钟差

一. 客户端代码

二. 服务端程序

运行: python3 server.py

三. 测试流程

将server.py放在其中一台主机上运行,然后将client.py放在另一台主机上运行,运行后客户端程序将打印网络时延及两端的时钟差。

四. 原理解析

假设有两台主机A,B。

A在以本机时钟为基准情形下记下自己在$t_1$时刻将包发往主机B,并将这个时间戳$t_1$传送给B,

B收到A的包之后,取出时间戳$t_1$,并以本机时钟为基准得到当前时间戳$t_2$,将$t_2-t_1$测得的结果$R$连带发包时刻$t_4$一起发往A。

A收到回包后的时间戳为$t_3$,拆解B发包时刻以及A->B的总耗时(即$t_2-t_1$),然后以各自的时钟为基准计算出B->A的总耗时$Q$,即$t_3  – t_4 = Q$。

设往返网络时延皆为$\alpha$,时钟差为$Clock_a – Clock_b = \delta$,则可得以下联立方程:

$t_1+\alpha = t_2 + \delta$

$t_2  –  t_1  =  R$

$t_4 + \delta = t_3 – \alpha$

$t_3  –  t_4  =  Q$

 

联立方程可解:

$\delta = – ( R + Q )/2$

$\alpha = (R – Q)/2$

 

方程解释:

其中$R,Q$结果表示以各自的时钟为基准,将时间戳作差计算出的收包耗时。

$t_1+\alpha = t_2 + \delta$ 表示主机A发包时刻$t_1$经过网络时延$\alpha$,以A主机为准得到的时间戳应为$ t_2 + \delta$

五. 注意事项

以上假设都是忽略了主机A,B的收发包时延, 以及CPU指令执行的时间. 如果AB收发包因为各种原因存在很大延时, 那么真正的时钟差及网络时延是很难计算出来的.