网络通信专题之获取ntp时间

大纲:


|NTP是什么?
|哪些地方用到了NTP?
|准确获取NTP时间的重要性?
|如何准确获取NTP时间?

|实现软件流程图



#NTP是什么?

NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。
它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。


        NTP时间同步报文中包含的时间是格林威治时间,是从1900年开始计算的秒数。


#哪些地方用到了NTP?

如设置闹钟、HTTPS证书的有效时间鉴定


#准确获取NTP时间的重要性?

就拿"HTTPS证书的有效时间鉴定"这个例子来说,假如在HTTPS握手的过程中报告的时间有误,这样就会导致证书校验失败,通信失败。


#如何准确获取NTP时间?

        NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。

        计算机主机一般同多个时钟服务器连接,利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源以便校正主机时间。即使在主机长时间无法与某一时钟服务器联系的情况下,NTP服务依然可以有效运转。

        所以,准确获取NTP时间需要参考多个可靠的NTP服务器,而且还需要对这些服务进行筛选。


      获取ntp时间有三种通信模式:

客户端/服务端、广播模式、symmetric

        关于获取ntp时间的三种通信模式的详细介绍以及协议的内容

        可以参考:NTP介绍与分析

       通过NTP协议进行时间同步

对于以上三种模式时间信息的传输都采用UDP协议,端口号123
        实现的过程中需要注意的问题:

是否需要时间补偿(传输过程中时间延迟、本地处理报文所需时间)

        常用的ntp服务器域名:

         "fr.pool.ntp.org" 

          "pool.ntp.org'

          "ch.pool.ntp.org" 

          "us.pool.ntp.org"

#实现软件流程图?


总流程图,如图1所示:


图1 总流程图


    初始化ntp服务的子流程图,如图2所示:

    初始化ntp服务的主要内容在图2黄色小框中。pcb的意思是一个udp的堆栈,用于udp通信;注册回调的作用在于本地接收到服务器的消息后能调用这段回调函数;域名解析后用链表作为dns缓存的作用是避免多次调用域名解析函数会域名解析不成功,一次域名成功解析后就缓存下来,下次就直接获取IP;填充结构体是分别将多个ntp服务器的域名、评分等信息存起来。

    ntp中的评分机制:

    为了保障ntp能准确获取时间,准备了多个ntp服务器作为备用。那到底用哪个服务器呢?引入一种评分机制。假如有3个服务器A、B、C,一开始时A的评分是0,B的评分是1,C的评分是0,这样就优先选择A服务器作为ntp的时钟源。一段时间后,由于网络原因,可能评分变为A的评分是0,B的评分是0,C的评分是1。那此时就选择C服务器作为ntp的时钟源。


图2 初始化ntp子流程图


向服务器请求ntp时间同步的子流程图如图3所示:

向ntp服务器发起请求的函数本质上是udp的一个发送函数,只要指定服务器的IP和端口。对于通信的具体细节请参考前面介绍“如何准确获取NTP”。


图3 向服务器请求ntp时间同步的子流程图


参考文献:
UTC 和 GMT的区别是什么啊?
https://zhidao.baidu.com/question/153332934.html

NTP介绍与分析
http://www.mamicode.com/info-detail-1826305.html

猜你喜欢

转载自blog.csdn.net/tommymusk/article/details/80432319