beevik/ntp

GitHub: beevik/ntp

一个基于 Go 语言的简单 NTP/SNTP 客户端库,用于从远程 NTP 服务器查询精确时间及时钟同步数据。

Stars: 619 | Forks: 88

[![GoDoc](https://godoc.org/github.com/beevik/ntp?status.svg)](https://godoc.org/github.com/beevik/ntp) [![Go](https://static.pigsec.cn/wp-content/uploads/repos/cas/31/31c96a8fe552af584b5983afc39ddf2e71ca6806185aad0eda564c77331e5b3e.svg)](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工具, 内核驱动, 日志审计, 时间同步, 网络协议