logo资料库

NTP时间同步在Android平台的应用.pdf

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
            NTP 时间同步在 Android 平台的应用  NTP 时间同步在 Android 平台的应用 孙玉刚 (上海交通大学软件学院 上海 200240) 摘要:随着全球信息化和通络通讯技术的迅速发展,人们对时间的精准性要求越来越高。本 文通过对 NTP 网络时间同步协议和原理的研究,分析了时间同步的架构与流程,提出了 NTP 网 络时间同步在 Android 平台的实现方案。 关键词:时间同步,NTP,Android APPLICATION OF NTP TIME SYNCHRONIZATION BASED ON ANDROID PLATFORM Yugang Sun (School of Software, Shanghai Jiao Tong University, Shanghai,China) Abstract:With the rapid development of the global information and communications technology, it becomes more important for people to have a precision time. In this paper, based on the research of NTP network time synchronization protocols and principles, we analyze the structure and flow of time synchronization, then raise the time synchronization solution implementations in Android platform. Key words: Time synchronization, NTP, Android 1 引论 在全球信息化的今天,人们的时间观念也越来越强,对时间的要求已经达到了分秒级的精确 度。越来越多的实时应用,都需要精确、公认和可靠的时间。例如各种涉及到时间戳的网络交易、 通讯记录、时间戳认证、通信网络的数据记录、互联网金融、电子邮件、网络管理系统的日志审 计以及交通航班航路的计算管理等[1]。 随着移动互联网技术和无线通信技术的深入发展,人们的日常生活和工作更多地依赖于智能 手机。智能手机日益替代手表,成为人们获得时间的最便捷工具。对比手表,智能手机可以通过 移动网络,实现自动与网络时间同步,确保时间的实时准确。 本文通过对 NTP 网络时间同步协议和原理的研究,提出了利用 NTP 网络时间同步技术,在 Android 智能手机上的时间同步实现方案。 2 NTP 技术原理分析 2.1 NTP 网络时间同步协议 NTP(Network Time Protocol)是一种用于 Internet 上计算机时钟同步的网络时间同步协议[2], 可以使计算机与其服务器或时钟源(如石英钟、GPS 等)做时间同步。NTP 可以估算数据包在网络 上的往返延迟外,还可独立估算计算机时钟偏差,从而实现在网络上的高精度计算机校时。NTP 是 TCP/IP 标准协议族的一员,标准的 NTP 协议采用的是 RFC1305 标准,通常可获得毫秒级的精 度。NTP 基于 UDP 报文进行传输,使用的 UDP 端口号为 123[3]。   1 
            NTP 时间同步在 Android 平台的应用  NTP 的顶级服务器直接通过 GPS 从原子钟、天文台、卫星获取国际标准 UTC 时间,提供高 精准度的时间校正服务。在通常的环境下,NTP 提供的时间精确度在 WAN 上为数十毫秒(依赖网 络负载),但实验表明这种技术在洲际间的校准精度只能达到几百毫秒甚至只能达到秒的量级,所 以,在庞大的网络中应设立一级、二级和三级时间服务器来解决精度的问题。 2.2 NTP 工作原理 NTP 的工作原理在 RFC1305 中有详细描述。下面以 NTP 基本工作原理图[4](图 2-1 所示)为 例[5],对其进行分析介绍。 Device A 与 Device B 通过网络相连,它们都有自己独立的系统时钟,需要通过 NTP 实现两 者系统时钟的自动同步。为便于理解,作如下假设:  Device B 作为 NTP 时间服务器, Device A 作为客户端,通过网络使本地时钟与服务器 Device B 进行时钟同步。系统时钟同步之前,设定 Device A 的时钟为 10:00:00am, Device B 的 时钟为 11:00:00am。  NTP 报文在 Device A 和 Device B 之间单向传输所需要的时间均为 1 秒。  Device B 处理 NTP 报文所需的时间为 1 秒。 图 2-1 NTP 工作原理图 Device A 与 Device B 时间同步的工作过程如下: (1) Device A 发送一个 NTP 请求报文给 Device B,该报文带有它离开 Device A 时的时间戳, 该时间戳为 10:00:00am(T1)。 (2) 当此 NTP 报文到达 Device B 时,Device B 加上自己的时间戳 11:00:01am(T2)。 (3) 当此 NTP 报文离开 Device B 时,Device B 再加上自己的时间戳 11:00:02am(T3)。 (4) 当 Device A 接收到该 NTP 响应报文时,Device A 的本地时间为 10:00:03am(T4)。 NTP 时间序列图 3-3[6]所示,该图说明了 NTP 传输延迟和偏移测量的基本原理。表 2-1 是 4 个关键时间戳定义详细描述。需要测量的三个数据如下:  d:表示 NTP 报文的往返传输时延(delay)。   T:表示客户端 Device A 在接收到 NTP 报文后,当时正确时间。 t:表示 Device A 相对 Device B 的时间偏差(offset)。   2 
            NTP 时间同步在 Android 平台的应用  图 2-2 NTP 时间序列图 ∵ T2 = T1 + t + d/2 ∴ T2 - T1 = t + d/2 ∵ T4 = T3 - t + d/2 ∴ T3 - T4 = t - d/2 ∴ d = (T2 - T1) + (T4 - T3) = (T4 - T1) - (T3 - T2) = 2 秒 t = [(T2 - T1) + (T3 - T4)] / 2 = 1 小时 T = T4 + t = 11:03 表 2-1 时间戳 ID 标记 时间描述 时间参照 T1 T2 T3 Originate Timestamp 客户端发送查询请求时间 以客户端方时间系统为参照 Receive Timestamp 服务器收到查询请求时间 以服务器时间系统为参照 Transmit Timestamp 服务器回复时间信息包时间 以服务器时间系统为参照 Destination Timestamp 以客户端方时间系统为参照 T4 从图 3-3 可以看出,d、t 都与 T3-T2 的差值无关,即与 NTP 服务器处理请求响应的时间 客户端收到时间信息包时间 无关。 2.3 NTP 时间戳 在 RFC1305 标准中,NTP 协议包含一个 64bit unsigned 定点数的 UTC 时间戳。与因特网标 准标准一致,NTP 数据被指定为整数或定点小数,以 big-endian 风格从左边 0 位、或者高位计数。 图 2-3 NTP 时间戳 如图 3-4 是 NTP 时间戳的格式[7],表 2-1 中的四个 NTP 时间戳都是用该格式表示。表示从 1900 年 1 月 1 日 00:00:00:000 算起的秒数。整数部分在前 32 位里,后 32bits(Seconds Fraction)用以 表示秒以下的部分。在 Seconds Fraction 部分,无意义的低位应该设置为 0。它代表的精度是大约 是 200Picoseconds(百亿分之一秒),这应该足以满足最高的要求了。 2.4 NTP 报文格式 进行网络协议实现时,最重要的是了解协议数据格式。NTP 有两种不同类型的报文,一种是 时钟同步报文,另一种是控制报文(仅用于需要网络管理场合)。NTP 时钟同步报文数据包有 48 个字节,其中 NTP 包头 16 字节,时间戳 32 个字节。NTP 时钟同步报文封装在 UDP 报文中,其 格式如图 2-4[4]所示。 NTP 协议主要字段的含义如下所示:   3 
            NTP 时间同步在 Android 平台的应用   LI(Leap Indicator):闰秒跳跃指示器。长度为 2 比特,只在服务器端有效。  VN(Version Number):NTP 的版本号。长度为 3 比特,目前的版本为 4。  Mode:NTP 工作模式。长度为 3 比特。Mode=1:主动对称模式;Mode=2:被动对称模 式;Mode=3:客户端模式;Mode=4:服务器模式;Mode=5:广播模式。  Stratum:服务器系统时钟的层数。长度为 8 比特,只在服务器端有效。取值范围为 1~ 16,它定义了时钟精度。精度从 1 到 16 依次递减,层数为 1 的准确度最高。  Poll:轮询时间间隔。长度为 8 比特,以秒为单位,只在服务器端有效。  Precision:本地系统时钟精度。长度为 8 比特,以秒为单位,只在服务器端有效。  Root Delay:本地与主参考时钟源的往返时间延迟。  Root Dispersion:本地系统时钟相对于主参考时钟的最大误差。  Reference Identifier:参考时钟源的标识。  Reference Timestamp:参考时间戳。本地系统时钟最后一次被设定或更新的时。  Originate Timestamp:NTP 请求报文离开发送端时,发送端的本地时间戳。  Receive Timestamp:NTP 请求报文到达接收端时,接收端的本地时间戳。  Transmit Timestamp:向客户机应答报文离开发送端时,发送端的本地时间戳。  Authenticator:验证信息。为可选字段。 图 2-4 NTP 协议报文格式 3 NTP 时间同步总体设计 时间同步在传统意义上也叫“对钟”或“对时”。即把分布在各地的时钟对准(同步起来), 使各地在同一时刻具有相同的时间值。 在移动通信和互联网时代,将通信网上各种通信设备或计算机设备的时间信息,基于 UTC 时 间偏差矫正在足够小的范围内,这种同步过程就叫做时间同步。Android 平台时间同步,就是利用 同步技术从网络获取精准的时间,使 Android 系统时间与标准 UTC 时间一致。 3.1 时间同步系统总体架构 NTP 时间同步系统总体架构(图 3-1 所示),包括时间源获取模块、时间延迟校正和时间更新   4 
三大模块。             NTP 时间同步在 Android 平台的应用  图 3-1 NTP 时间同步系统总体架构  时间源获取模块 时间获取模块包括时间同步指令、时间同步源、传输通道,用来监听网络,定时发送同步请 求,接收时间同步报文。时间源的获取决定了时间同步系统的可靠性。  延迟校正模块 时间延迟校正模块包括延迟校正、时间算法。时间同步是通过间信息的发送、传输、接收、 接受等过程完整,必然存时间差,必须对这个时间差的做延迟校正处理,并判断延迟的有效性。  时间更新模块 时间更新模块包括系统时间更新与时间显示。时间更新模块根据设备的时间格式设置,通过 Android 系统时间接口更新系统时间,显示需要设置的时间。 3.2 时间同步的功能设计 图 3-2 Android 时间同步界面 图 3-2 是 Android 时间同步应用的设置。在 Android 智能手机上,“置->日期和时间->自动确 定日期和时间”选项中,勾选“使用网络提供时间”,就可以自动通过网络进行时间同步。时间同 步的功能设计包括下面几方面:  工作条件 由于需要访问 NTP 网络服务器,所以必须确保有效的数据通讯(数据连接或 WIFI 连接)。  使用网络提供时间   5 
            NTP 时间同步在 Android 平台的应用  Android 使用网络时间进行同步,有 NITZ 和 NTP 两种方式。优先使用 NITZ 授时进行时间同 步,在没有 NITZ 服务时,采用 NTP 方式来获取网络时间进行同步。  工作模式 Android 时间同步应用有两种工作模式,分别是开机自动同步和手工启动同步。在勾选“使用 网络提供时间”情况下,开机后,系统自动启动时间自动同步进程。开机状态下,通过手工勾选 “使用网络提供时间”,启动时间自动同步进程。  3.3 时间同步的流程 图 3-3 NTP 时间同步流程图 Android 智能移动通讯终端进行 NTP 网络时间同步,前提是:自动同步时间开关打开;可以 建立有效数据通讯(数据连接或 WIFI 连接),并且可以连接到 NTP 服务器。NTP 网络时间同步 的具体流程如图 3-3 所示: (1) 设置 NTP 时间同步触发器; (2) 判断 24 小时内是否成功进行过时间同步; (3) 获取 NTP 服务器地址,创建 Socket 连接; (4) 收到报文进行解析; 6   
            NTP 时间同步在 Android 平台的应用  (5) 根据 NTP 时间同步算法,计算时间偏差; (6) 修改系统时间,完成 NTP 网络时间同步。 4 NTP 时间同步的实现和验证 4.1 NTP 时间同步的触发机制 Android 的网络时间同步类 NetworkTimeUpdateService.java,用来进行 NTP 网络时间同步的触 发和预处理。在 NetworkTimeUpdateService 类中,用一个 handler 监听网络连接状态和“使用网络 提供时间”的设置状态。当有网络数据连接,或手动开启自动同步时间时,触发网络时间同步方 法 onPollNetworkTime(),启动 NTP 网络时间同步进程。触发它的三个事件分别为:  EVENT_AUTO_TIME_CHANGED: 表示设置(Settings)菜单中“使用网络提供时间”的选项变化,它注册了观察者模式来监听 菜单的变化。如果有变化就发送这个 Event。  EVENT_POLL_NETWORK_TIME: 它的方式是开机后会注册一个 24 小时为周期的 Alarm,并发送这个 Event,这个 Alarm 的方 法是 registerForAlarms()。即如果 24 小时没有自动同步时间,就会主动同步一次,而如果曾成功 进行过时间同步,则调用 resetAlarm()方法把这个 Alarm 重置。  EVENT_NETWORK_CONNECTED: 当数据连接成功后,会发送这个 Event 进行时间同步。包括 WIFI 和 GPRS 等移动数据连接, 对应的代码在 mConnectivityReceiver 中。 下面是 Android 中触发 NTP 时间同步的具体代码片段: public void handleMessage(Message msg) { switch (msg.what) { case EVENT_AUTO_TIME_CHANGED: /*用户开启同步开关 */ case EVENT_POLL_NETWORK_TIME: /*开机触发或 24 小时定时触发 */ case EVENT_NETWORK_CONNECTED: /* 连接 WIFI 或数据连接 */ onPollNetworkTime(msg.what); } } 4.2 NTP 时间同步的预处理 NTP 时间同步在更新系统时间前,需要做如下预处理。 (1) 时间同步,首先要开启“自动确定日期和时间”选项。 (2) 24 小时 NTP 时间同步机制: 为了减少不必要的网络连接的。Android 平台设计 24 小时 NTP 时间同步的原则,即如果 24 小时内成功进行了时间同步,将使用缓存的时间进行时间同步,而不进行 NTP 网络请求。24 小 时 NTP 网络时间同步的设计逻辑如下:  如果 NTP 时间同步成功,会记录一个时间点 mLastNtpFetchTime。  当 NTP 的三个 Event 触发时,会再记录一个时间点(时间流逝值)refTime。  如果本次 NTP 请求与上次 NTP 同步的时间间隔不超过 24 小时,就会 resetAlarm()后 return 掉,而不进行 NTP 时间同步。 24 小时时间同步机制的实现代码如下: if (mLastNtpFetchTime == NOT_SET || refTime >= mLastNtpFetchTime + mPollingIntervalMs || event == EVENT_AUTO_TIME_CHANGED) { /*force refresh NTP cache when outdated*/   7 
            NTP 时间同步在 Android 平台的应用  if (mTime.getCacheAge() >= mPollingIntervalMs) { mTime.forceRefresh(); } /*force refresh NTP cache when outdated*/ } resetAlarm(mPollingIntervalMs); (3) NTP 网络服务器池设计: 由于网络时间服务器的访问存在不稳定性。在 Android 时间同步的实际应用中,是最影响用 户体验的因素,是 NTP 服务器的可用性和时间同步的和可靠性。采用 NTP 服务器池方法,在 NTP 服务器池存入多个已知可访问的 NTP 服务器地址,通过服务器池设计提高时间同步的可靠性。 NTP 网络服务器池的设计原则:如果由于 Socket 创建失败、NTP 连接失败、没有收到 NTP 报文, NTP 网络请求失败,则认为该服务器当前时间不可用。会在 1 分钟后重试 NTP 网络时间 同步,每次重试将从的服务器池中依次更换一个服务器地址,共重试 3 次。如果连续 3 个 NTP 服 务器不可用,则认为是当前网络状态不可靠,改由 24 小时后系统自动重试,或用户手工开启重试。 NTP 服务器池的代码实现片段如下: private static final String[] SERVERLIST = new String[]{ '' asia.pool.ntp.org",time-nw.nist.gov","ntp.sjtu.edu.cn","210.72.145.44", "hshh.org","2.android.pool.ntp.org","time-a.nist.gov"}; mTryAgainCounter++; /*M: For multiple NTP server retry*/ int index = mTryAgainCounter % mNtpServers.size(); if (mTime instanceof NtpTrustedTime){ ((NtpTrustedTime)mTime).setServer(mNtpServers.get(index)); mTime.forceRefresh(); } 4.3 NTP 时间同步的请求与响应 NTP 网络时间同步的核心部分,是在 SntpClient.java 中实现,包括构建 NTP 数据包、使用 UDP 协议发送请求、接收服务器响应、计算时间延迟。 (1) 发送 NTP 请求报文: 建立 NTP 请求,其报文内容包括:NTP 服务器地址、UDP 端口、NTP 模式、版本和请求发 送时间等。代码如下: socket = new DatagramSocket(); socket.setSoTimeout(timeout); InetAddress address = InetAddress.getByName(host); byte[] buffer = new byte[NTP_PACKET_SIZE]; DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT); /* NTP=123*/ buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3); /* get current time and write it to the request packet*/ long requestTime = System.currentTimeMillis(); long requestTicks = SystemClock.elapsedRealtime(); writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET, requestTime); socket.send(request); (2) 接收解析 NTP 报文: NTP 报文解析主要提取表 2-1 描述的四个时间戳:T1(Originate Timestamp)、T2(Receive Timestamp)、T3(Transmit Timestamp)、T4(Destination Timestamp)。在 NTP 原理中,有一个隐 含的前提是:在时间同步过程中,客户端系统时间不能跳变。但在实际中,可能存在发出请求还 没有收到响应的时间内,其他应用修改系统时间,如何处理这种情况?就要用到不受系统影响流   8 
分享到:
收藏