1. NTP简介
NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网
络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能。
NTP 服务器(Network Time Protocol(NTP))是用来使计算机时间同步化的一种协议,它
可以使计算机对其服务器或时钟源(如石英钟,GPS 等等)做同步化,它可以提供高精准度
的时间校正(LAN 上与标准间差小于1 毫秒,WAN 上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。时间按NTP 服务器的等级传播。按照离外部UTC源的远近把所有服
务器归入不同的Stratum(层)中。
NTP的数据报文格式如下图所示:
NTP 数据报文格式的各个字段的作用,如下表所示:
字节段 | 描述 |
---|---|
LI:2 比特 | 11 为告警状态,表示时钟未被同步 |
VN:3 比特 | 表示 NTP 的版本号 |
Mode:3 比特 | 0 为未定义、1 为主动对等体模式、2 为被动对等体模式、3 为客户模式、4 为服务器模式、5 为广播模式或组播模式 |
Strat:8 比特 | 表示系统时钟的层数,取值范围为1~16 |
Poll:8 比特 | 表示轮询时间,即两个连续 NTP 报文之间的时间间隔 |
Prec:8 比特 | 表示系统时钟的精度 |
Root Delay:32 比特 | 表示本地到主参考时钟源的往返时间 |
Root Dispersion 32 比特 | 表示系统时钟相对于主参考时钟的最大误差 |
Reference Identifier 32 比特 | 表示参考时钟源的标识 |
Reference Timestamp64 比特 | 表示系统时钟最后一次被设定或更新的时间 |
Originate Timestamp 64 比特 | 表示 NTP 请求报文离开发送端时发送端的本地时间 |
Receive Timestamp 64 比特 | 表示 NTP 请求报文到达接收端时接收端的本地时间 |
Transmit Timestamp 64 比特 | 表示应答报文离开应答者时应答者的本地时间 |
Authenticator 96 比特 | 表示验证信息我们怎么获取阿里云NTP 实时时间数据 |
当然这其中不是所有的报文都需要用到,我们要做的就是根据项目的需要来构建 NTP 请求报文,并完成报文的数据内容解析,完成实时时间校对。
使用网络调试助手以 UDP 协议连接阿里云 NTP 服务器,接着在发送框上填入 NTP 请求报文,发送完成之后网络调试助手接收到一段数据,然后解析进行实时时间的校准。
需要的步骤如下:
- 以UDP 协议连接阿里云NTP 服务器;
- 发送NTP 报文到阿里云NTP 服务器;
- 获取阿里云NTP 服务器返回的数据,取第40 位到43 位的十六进制数值;
- 把40 位到43 位的十六进制数值转成十进制;
- 把十进制数值减去1900-1970 的时间差(2208988800 秒);
- 数值转成年月日时分秒。(可通过在线
转换器时间转换链接上计算当前时间)
2. NTP实验
例程功能:
使用UDP 协议连接阿里云的NTP 服务器,并周期发送NTP 请求报文,发送完成之后对阿里云NTP 服务器返回的数据进行解析,把它转换成实时时间信息。
通过lwip_ntp_client_init构建NTP的报文,需要配置的就是version和mode都为3,然后转换成16进制;
lwip_get_seconds_from_ntp_server就是在连接服务器之后,获取40-43位的16进制数,并减去1900-1970的时间差后,调用lwip_calc_date_time把秒数换算成年月日;
lwip_demo中,就是netconn方式实现UDP连接。
总结
NTP就是通过开发板作为Client,然后去连接云服务器,获取NTP报文后取出40-43位的16进制数,然后进行年月日的转换,来完成时间校准。