前段时间,要写一个windows下的分布式软件,刚开始的方案是需要一个精确的时钟同步,误差必须控制在1毫秒内。也许很多人都知道有NTP以及PTP 时间同步协议。windows本身自带NTP协议的服务,通过注册表配置即可实现,但是误差无法满足要求,而且每次配置都要重启W32Time服务。也只有PTP这个精确时钟同步协议满足要求,后面想自己实现PTP协议,不过查了些资料,发现想的太简单了。
PTP协议的原理虽然简单,不过实现起来不简单,需要确定最佳主时钟,而且需要获取高精度的本地时钟(后面查到win8以上系统可以通过GetSystemTimePreciseAsFileTime获取<1us的高精度时钟)。后来发现有个著名的开源ptp协议实现:ptpd(Precision Time Protocol daemon)。不过该代码只针对linux系统,至于为什么没有在windows下的实现,大概有如下的原因:
1)windows不提供带时间戳的网络包,不像linux下socket有SO_TIMESTAMP选项,而且也不提供高精度时钟的内核api(win8以下系统);
2)部分windwos系统存在时钟调整Bug,比如你调整的系统时间低于16个tick(系统的时基)单位,将会被忽略。
由于以上原因,后面也没去做windows上的ptp协议实现。
文章评论
学习了