beevik/ntp
GitHub: beevik/ntp
一个基于 Go 语言的简单 NTP/SNTP 客户端库,用于从远程 NTP 服务器查询精确时间及时钟同步数据。
Stars: 619 | Forks: 88
[](https://godoc.org/github.com/beevik/ntp)
[](https://github.com/beevik/ntp/actions/workflows/go.yml)
# ntp
ntp 包是一个基于 [RFC 5905](https://tools.ietf.org/html/rfc5905) 的简单 NTP (SNTP) 客户端实现。它允许你连接到远程 NTP 服务器,并请求关于当前时间的信息。
## 查询当前时间
如果你只关心远程 NTP 服务器上的当前时间,只需使用 `Time` 函数:
```
time, err := ntp.Time("0.beevik-ntp.pool.ntp.org")
```
## 查询时间同步数据
要获取当前时间以及一些额外的同步数据,请使用 [`Query`](https://godoc.org/github.com/beevik/ntp#Query) 函数:
```
response, err := ntp.Query("0.beevik-ntp.pool.ntp.org")
time := time.Now().Add(response.ClockOffset)
```
`Query` 返回的 [`Response`](https://godoc.org/github.com/beevik/ntp#Response) 结构体包含以下信息:
* `ClockOffset`:本地系统时钟相对于服务器时钟的估计偏移量。为了获得更准确的时间读数,你可以将此偏移量添加到后续的任何系统时钟读数中。
* `Time`:服务器根据自身时钟发送响应的时间。
* `RTT`:客户端与服务器之间往返时间延迟的估计值。
* `Precision`:服务器时钟读数的精度。
* `Stratum`:服务器的层级(stratum),指示从服务器到参考时钟的跳数。Stratum 1 服务器直接连接到参考时钟。如果 stratum 为零,则表示服务器返回了“死亡之吻”(kiss of death),你应该检查 `KissCode`。
* `ReferenceID`:所查询的参考时钟的唯一标识符。
* `ReferenceTime`:服务器最后一次更新其本地时钟设置的时间。
* `RootDelay`:服务器到 Stratum 1 服务器的总往返时间延迟。
* `RootDispersion`:服务器相对于参考时钟的估计最大测量误差。
* `RootDistance`:客户端与 Stratum 1 服务器之间的根同步距离的估计值。
* `Leap`:闰秒指示器,指示是否应在当前月份的最后一分钟添加或删除一秒。
* `MinError`:客户端与服务器之间时钟误差的下限。
* `KissCode`:描述返回“死亡之吻”(stratum=0)响应原因的 4 字符字符串。
* `Poll`:连续向服务器发送消息之间的最大轮询间隔。
`Response` 结构体的 [`Validate`](https://godoc.org/github.com/beevik/ntp#Response.Validate) 函数会执行额外的完整性检查,以确定该响应是否适合用于时间同步。
```
err := response.Validate()
if err == nil {
// response data is suitable for synchronization purposes
}
```
如果你想自定义 NTP 查询的行为,请使用 [`QueryWithOptions`](https://godoc.org/github.com/beevik/ntp#QueryWithOptions) 函数:
```
options := ntp.QueryOptions{ Timeout: 30*time.Second, TTL: 5 }
response, err := ntp.QueryWithOptions("0.beevik-ntp.pool.ntp.org", options)
time := time.Now().Add(response.ClockOffset)
```
可配置的 [`QueryOptions`](https://godoc.org/github.com/beevik/ntp#QueryOptions) 包括:
* `Timeout`:在放弃等待 NTP 服务器响应之前的等待时间。
* `Version`:要使用的 NTP 协议版本(2、3 或 4)。
* `TTL`:在请求报文被丢弃之前允许的最大 IP 跳数。
* `LocalAddress`:发送查询时使用的本地 IP 地址。当主机具有多个网络接口时非常有用。
* `Auth`:服务器用于对查询进行身份验证的对称身份验证密钥和算法。客户端使用相同的信息来验证服务器的响应。
* `Extensions`:可以添加扩展,以便在传输之前修改 NTP 查询,并在到达之后处理 NTP 响应。
* `GetSystemTime`:用于获取当前系统时间的自定义函数,用于覆盖默认的 `time.Now` 函数。
* `Dialer`:用于覆盖默认 UDP 拨号函数的自定义网络连接“拨号器”函数。
## 使用 NTP 池
NTP 池是由 [NTP Pool Project](https://www.pool.ntp.org/en/) 提供的共享资源,供全世界的人们和服务使用。为了防止其过载,请避免在你的应用程序中查询标准的 `pool.ntp.org` 区域名称。相反,请考虑申请你自己的[供应商区域](http://www.pool.ntp.org/en/vendors.html)或[加入该池](http://www.pool.ntp.org/join.html)。
## 网络时间安全 (NTS)
网络时间安全(NTS)是 NTP 的一项最新增强功能,旨在为该协议添加更好的身份验证和消息完整性。它由 [RFC 8915](https://tools.ietf.org/html/rfc8915) 定义。如果你想使用 NTS,请参阅 [nts 包](https://github.com/beevik/nts)。(nts 包是作为此包的扩展实现的。)
标签:EVTX分析, Go, NTP客户端, Ruby工具, 内核驱动, 日志审计, 时间同步, 网络协议