NTP — 什么是时间协议及应用中的同步

作者: IT Sectr 发布日期: 2026-07-14 阅读时间: 9 分钟

NTP(Network Time Protocol)— 一种网络时钟同步协议,在局域网中可提供毫秒级的时间精度,在广域网中可提供数十毫秒的精度。该协议由David Mills于1985年开发,用于所有现代操作系统、移动设备和网络设备中,将内部时钟与UTC参考时间对齐。根据NTP Pool Project(2026)的数据,每天有超过40亿台设备执行NTP请求进行同步。

要点

  • NTP — 通过网络进行时间同步的协议,精度从1毫秒(局域网)到50毫秒(广域网)
  • 层阶体系 — 层级系统(stratum 0–16),其中stratum 0为参考原子钟
  • 漂移校正 — NTP不仅设置时间,还调整时钟频率以保持持续精度
  • SNTP — NTP的简化版本,适用于资源受限的设备,用于物联网和Android
  • 安全性 — NTPv4支持通过对称密钥和NTS(网络时间安全)进行身份验证

什么是NTP?

NTP(Network Time Protocol)— 是一种网络协议,旨在通过分组交换网络将计算机的内部时钟与参考时间源精确同步。该协议在RFC 5905(NTPv4)中描述,采用分层服务器系统,每个层级称为stratum。NTP客户端向服务器发送请求,测量数据包的往返时间(RTT),并计算自身时钟相对于参考时间的偏移量。校正算法不仅考虑单次偏移,还考虑时钟发生器的漂移,这使得无需重复请求即可长时间保持精度。

NTP发展历史

该协议由David Mills于1985年为ARPANET网络开发。第一个规范(RFC 958)描述了一个简单的同步算法,精度达到100毫秒。NTPv3(RFC 1305,1992)添加了过滤算法和改进的延迟处理。NTPv4(RFC 5905,2010)— 当前版本 — 包括对IPv6的支持、服务器自动配置以及通过网络时间安全(NTS)抵御攻击。40年来,该协议从一个科研项目发展成为基础设施标准,没有它,金融交易、电信和移动网络的运行将不可能实现。

NTP如何工作

NTP的工作原理基于测量数据包在网络中的传输时间。客户端发送带有时间戳T1(本地发送时间)的请求。服务器在时刻T2(服务器时间)接收请求,创建带有时间戳T3的响应并发送。客户端在时刻T4接收响应。知道所有四个时间戳后,客户端计算偏移量offset = ((T2 - T1) + (T3 - T4)) / 2和延迟delay = (T4 - T1) - (T3 - T2)。如果延迟超过1秒,则结果被视为不可靠 — 这是对过载或不稳定信道的保护。

时钟漂移校正

仅仅设置精确时间是不够的 — 设备上的石英晶体振荡器由于温度、老化和电压而不断漂移(超前或滞后)。NTP通过PLL(锁相环)算法解决这个问题:它不是强制设置时间,而是调整时钟的运行速度。如果设备每小时快0.1秒,NTP会减慢系统时钟,直到漂移被补偿。这种方法允许在稳定网络中每几小时同步一次,而不是每30秒一次。

cpp
// 简化的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的层次结构

整个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 — NTP的简化版本

SNTP(简单网络时间协议,RFC 4330)— 针对资源受限设备的NTP简化实现:微控制器、物联网传感器和不需要高精度的移动应用程序。与完整NTP不同,SNTP不执行多服务器过滤,不分析时钟漂移,也不使用复杂的PLL算法。SNTP客户端发送请求,接收响应,并一次性设置时间。SNTP的精度为10–100毫秒(取决于网络)— 这足以满足绝大多数移动场景,但金融交易除外。

何时使用SNTP代替NTP

SNTP适用于只需要从服务器获取当前时间而不保持持续同步的Android应用程序。例如,应用程序在登录时显示服务器时间,或每天同步一次。完整NTP用于服务器系统、电信设备、金融平台和分布式数据库,在这些场景中持续的精度和漂移监控至关重要。对于移动开发,SNTP就足够了 — Android内置的时间服务使用它与Google服务器进行定期同步。

NTP在Android中的实现

在Android应用程序中,当系统时间可能被用户更改或由于缺乏网络而与实际时间不同时,需要通过NTP获取精确时间。Android没有内置的公共NTP客户端 — 开发人员使用Apache Commons Net SntpClient库或第三方解决方案。2022年,Google通过Google Play Services向Android API添加了内部SntpClient类,但它需要配置且未记录供一般使用。替代方法 — 通过REST API请求时间,该API在响应正文中返回服务器时间戳。

SNTP客户端实现示例

Android上SNTP的基本实现包括向NTP服务器(例如pool.ntp.org)发送UDP数据包、解析响应并提取发送时间(T3 — 传输时间戳)。代码应处理网络超时和解析错误 — 在实际应用程序中,此操作在后台执行,结果缓存到下一次同步。Apache Commons Net库提供了现成的NTPUDPClient类,只需在build.gradle中添加依赖项即可在Android中使用,只需极少的修改。

kotlin
// 通过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精度及影响因素

NTP的精度取决于几个因素:网络延迟(RTT)、信道稳定性、服务器负载和本地时钟发生器的质量。在延迟小于1毫秒的局域网中,NTP可以达到0.1–1毫秒的精度。通过互联网在10–50毫秒的延迟下,精度下降到10–50毫秒。比单次精度更重要的是稳定性:如果延迟变化(抖动),NTP需要更多时间来计算可靠的偏移量。对于移动设备,不稳定的主要因素是Wi-Fi和移动网络之间的切换,此时延迟可能会改变一个数量级。

移动开发建议

对于对精确时间敏感的Android应用程序,建议:使用多个NTP服务器并选择最小延迟;不要在网络切换时刻同步;缓存最后接收到的时间并通过System.currentTimeMillis进行校正。对于游戏和实时应用程序(NTP因网络延迟不适用)— 使用每个请求中传递的服务器时间。在金融交易应用程序中,务必检查与服务器的偏差 — 如果差异超过5秒,则将操作作为潜在不安全而阻止。

常见问题

什么是NTP,它有什么用?

NTP(网络时间协议)— 通过互联网进行时钟同步的协议。它用于将设备上的时间与参考UTC对齐。没有NTP,计算机时钟由于石英晶体振荡器的漂移每天会相差数秒,这对金融交易、日志记录和安全至关重要。

NTP的层次结构是如何组织的?

NTP系统使用层级 — strata:stratum 0(原子钟和GPS),stratum 1(连接到参考的服务器),stratum 2(公共NTP服务器),stratum 3–4(本地服务器),stratum 5–15(客户端)。层级越高,潜在误差越大。Stratum 16表示时间未同步。

NTP和SNTP有什么区别?

SNTP — NTP的简化版本,适用于资源受限设备。它不过滤服务器,不分析时钟漂移,也不使用PLL。SNTP适用于精度10–100毫秒足够的移动应用程序。完整NTP用于服务器、电信设备和金融科技系统。

如何在Android中通过NTP获取精确时间?

使用Apache Commons Net库的NTPUDPClient类。向pool.ntp.org发送请求,接收响应并提取传输时间戳(Transmit Timestamp)。或者,使用您服务器的REST API,它在Date标头或响应正文中以Unix时间戳格式返回服务器时间。

为什么移动设备上的时间同步很重要?

没有NTP同步,设备上的系统时间可能相差数分钟甚至数小时。这会干扰推送通知、SSL证书(有效期检查)、日志、任务调度器和加密协议的工作。在涉及金融交易的应用程序中,超过5秒的不同步被视为安全威胁。

总结

  • NTP — 网络时间同步协议,通过stratum 0–16层级结构提供从1毫秒(局域网)到50毫秒(广域网)的精度
  • 漂移校正 — NTP不仅设置时间,还通过PLL调整时钟频率,使精度在同步之间保持数小时
  • 层阶体系 — 每个层级(stratum)增加潜在误差;对于移动设备,pool.ntp.org等stratum 2服务器是最优选择
  • SNTP — NTP的简化版本,适用于物联网和Android,不使用过滤和PLL;10–100毫秒的精度足以满足大多数场景
  • 在Android中的实现 — 通过Apache Commons Net(NTPUDPClient)或带服务器时间戳的REST API;该平台没有内置的公共NTP客户端
  • 安全性 — NTPv4支持网络时间安全(NTS)以防止响应伪造;对金融和企业应用程序至关重要
  • 精度因素 — RTT、抖动、网络切换;移动应用程序需要10–50毫秒的精度,但关键操作需要检查与服务器的偏差

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读