NTP(Network Time Protocol)— 一种网络时钟同步协议,在局域网中可提供毫秒级的时间精度,在广域网中可提供数十毫秒的精度。该协议由David Mills于1985年开发,用于所有现代操作系统、移动设备和网络设备中,将内部时钟与UTC参考时间对齐。根据NTP Pool Project(2026)的数据,每天有超过40亿台设备执行NTP请求进行同步。
要点
NTP(Network Time Protocol)— 是一种网络协议,旨在通过分组交换网络将计算机的内部时钟与参考时间源精确同步。该协议在RFC 5905(NTPv4)中描述,采用分层服务器系统,每个层级称为stratum。NTP客户端向服务器发送请求,测量数据包的往返时间(RTT),并计算自身时钟相对于参考时间的偏移量。校正算法不仅考虑单次偏移,还考虑时钟发生器的漂移,这使得无需重复请求即可长时间保持精度。
该协议由David Mills于1985年为ARPANET网络开发。第一个规范(RFC 958)描述了一个简单的同步算法,精度达到100毫秒。NTPv3(RFC 1305,1992)添加了过滤算法和改进的延迟处理。NTPv4(RFC 5905,2010)— 当前版本 — 包括对IPv6的支持、服务器自动配置以及通过网络时间安全(NTS)抵御攻击。40年来,该协议从一个科研项目发展成为基础设施标准,没有它,金融交易、电信和移动网络的运行将不可能实现。
NTP的工作原理基于测量数据包在网络中的传输时间。客户端发送带有时间戳T1(本地发送时间)的请求。服务器在时刻T2(服务器时间)接收请求,创建带有时间戳T3的响应并发送。客户端在时刻T4接收响应。知道所有四个时间戳后,客户端计算偏移量offset = ((T2 - T1) + (T3 - T4)) / 2和延迟delay = (T4 - T1) - (T3 - T2)。如果延迟超过1秒,则结果被视为不可靠 — 这是对过载或不稳定信道的保护。
仅仅设置精确时间是不够的 — 设备上的石英晶体振荡器由于温度、老化和电压而不断漂移(超前或滞后)。NTP通过PLL(锁相环)算法解决这个问题:它不是强制设置时间,而是调整时钟的运行速度。如果设备每小时快0.1秒,NTP会减慢系统时钟,直到漂移被补偿。这种方法允许在稳定网络中每几小时同步一次,而不是每30秒一次。
// 简化的NTP算法方案
struct NTPPacket {
uint8_t flags; // LI、VN、模式
uint8_t stratum; // 服务器层级
uint32_t refTimestamp; // 参考时间戳
uint32_t originTimestamp; // T1
uint32_t recvTimestamp; // T2
uint32_t xmitTimestamp; // T3
};
// 计算偏移量和延迟
double offset = ((t2 - t1) + (t3 - t4)) / 2.0;
double delay = (t4 - t1) - (t3 - t2);
整个NTP系统组织成一个层次结构,每个层级称为stratum。Stratum 0 — 参考时钟:原子钟、GPS接收器或WWVB无线电信号。这些设备不直接连接到网络。Stratum 1 — 直接连接到参考时钟的服务器。Stratum 2从stratum 1接收时间,stratum 3从stratum 2接收,以此类推直到stratum 15。stratum编号越高,潜在精度越低 — 每个层级都会增加少量延迟和误差。Stratum 16表示时间不可用(未同步)。
| 层级 | 描述 | 精度 |
|---|---|---|
| Stratum 0 | 原子钟、GPS、无线电信号 | 纳秒 |
| Stratum 1 | 连接到参考的服务器 | 微秒 |
| Stratum 2 | 公共NTP服务器 | 1–10毫秒 |
| Stratum 3 | 组织的本地服务器 | 10–50毫秒 |
| Stratum 4+ | 客户端设备 | 高达100毫秒 |
对于移动设备,stratum 2服务器是最优的 — 它们数量充足,并在精度和可用性之间提供了良好的平衡。例如,pool.ntp.org — 一个由全球数千台服务器组成的池,自动分配负载。对于Android应用程序,不建议直接使用stratum 1:首先,这会给主服务器造成过多负载;其次,移动设备需要stratum 2提供的10–50毫秒精度就足够了。在企业网络中,会安装一个本地stratum 3-4服务器,与外部stratum 2同步。
SNTP(简单网络时间协议,RFC 4330)— 针对资源受限设备的NTP简化实现:微控制器、物联网传感器和不需要高精度的移动应用程序。与完整NTP不同,SNTP不执行多服务器过滤,不分析时钟漂移,也不使用复杂的PLL算法。SNTP客户端发送请求,接收响应,并一次性设置时间。SNTP的精度为10–100毫秒(取决于网络)— 这足以满足绝大多数移动场景,但金融交易除外。
SNTP适用于只需要从服务器获取当前时间而不保持持续同步的Android应用程序。例如,应用程序在登录时显示服务器时间,或每天同步一次。完整NTP用于服务器系统、电信设备、金融平台和分布式数据库,在这些场景中持续的精度和漂移监控至关重要。对于移动开发,SNTP就足够了 — Android内置的时间服务使用它与Google服务器进行定期同步。
在Android应用程序中,当系统时间可能被用户更改或由于缺乏网络而与实际时间不同时,需要通过NTP获取精确时间。Android没有内置的公共NTP客户端 — 开发人员使用Apache Commons Net SntpClient库或第三方解决方案。2022年,Google通过Google Play Services向Android API添加了内部SntpClient类,但它需要配置且未记录供一般使用。替代方法 — 通过REST API请求时间,该API在响应正文中返回服务器时间戳。
Android上SNTP的基本实现包括向NTP服务器(例如pool.ntp.org)发送UDP数据包、解析响应并提取发送时间(T3 — 传输时间戳)。代码应处理网络超时和解析错误 — 在实际应用程序中,此操作在后台执行,结果缓存到下一次同步。Apache Commons Net库提供了现成的NTPUDPClient类,只需在build.gradle中添加依赖项即可在Android中使用,只需极少的修改。
// 通过Apache Commons Net获取NTP时间
fun getNtpTime(server: String = "pool.ntp.org"): Date? {
return try {
val client = NTPUDPClient()
client.setDefaultTimeout(5000)
val info = client.getTime(InetAddress.getByName(server))
client.close()
Date(info.getMessage().getTransmitTimeStamp().getTime())
} catch (e: Exception) {
null
}
}
NTP的精度取决于几个因素:网络延迟(RTT)、信道稳定性、服务器负载和本地时钟发生器的质量。在延迟小于1毫秒的局域网中,NTP可以达到0.1–1毫秒的精度。通过互联网在10–50毫秒的延迟下,精度下降到10–50毫秒。比单次精度更重要的是稳定性:如果延迟变化(抖动),NTP需要更多时间来计算可靠的偏移量。对于移动设备,不稳定的主要因素是Wi-Fi和移动网络之间的切换,此时延迟可能会改变一个数量级。
对于对精确时间敏感的Android应用程序,建议:使用多个NTP服务器并选择最小延迟;不要在网络切换时刻同步;缓存最后接收到的时间并通过System.currentTimeMillis进行校正。对于游戏和实时应用程序(NTP因网络延迟不适用)— 使用每个请求中传递的服务器时间。在金融交易应用程序中,务必检查与服务器的偏差 — 如果差异超过5秒,则将操作作为潜在不安全而阻止。
常见问题
NTP(网络时间协议)— 通过互联网进行时钟同步的协议。它用于将设备上的时间与参考UTC对齐。没有NTP,计算机时钟由于石英晶体振荡器的漂移每天会相差数秒,这对金融交易、日志记录和安全至关重要。
NTP系统使用层级 — strata:stratum 0(原子钟和GPS),stratum 1(连接到参考的服务器),stratum 2(公共NTP服务器),stratum 3–4(本地服务器),stratum 5–15(客户端)。层级越高,潜在误差越大。Stratum 16表示时间未同步。
SNTP — NTP的简化版本,适用于资源受限设备。它不过滤服务器,不分析时钟漂移,也不使用PLL。SNTP适用于精度10–100毫秒足够的移动应用程序。完整NTP用于服务器、电信设备和金融科技系统。
使用Apache Commons Net库的NTPUDPClient类。向pool.ntp.org发送请求,接收响应并提取传输时间戳(Transmit Timestamp)。或者,使用您服务器的REST API,它在Date标头或响应正文中以Unix时间戳格式返回服务器时间。
没有NTP同步,设备上的系统时间可能相差数分钟甚至数小时。这会干扰推送通知、SSL证书(有效期检查)、日志、任务调度器和加密协议的工作。在涉及金融交易的应用程序中,超过5秒的不同步被视为安全威胁。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。