主要观点:WireGuard 的时间戳使用 TAI64N ,其内核实现和 wireguard-go 产生 TAI64N 时间戳的逻辑源于 libtai ,但 libtai 中的偏移量存在问题,导致计算出的 TAI64 时间戳并非真正的 TAI 时间。
关键信息:
- TAI64 定义中 2^62 代表 1970-01-01 00:00:00 TAI ,每秒计数器加 1 。
- libtai 计算 TAI64 时间戳时偏移了 0x400000000000000A (10 秒),用于校正 UTC 和 TAI 时间标准的差异,但多数现代系统此校正错误。
- 现代计算机时间定义为自 1970-01-01 00:00:00 UTC 以来的秒数,Unix 时间不包含闰秒。
- 多数现代系统中获取的时间戳包含 UTC 的闰秒,与 libtai 计算的 TAI64 时间戳有偏差,导致多数 TAI64 实现产生错误结果。
- WireGuard 受此影响产生“UTC + 10s”时间戳,但其对自身功能无影响,因 peer 间时间戳比较时误差可抵消。
重要细节:
- 介绍了时间标准的历史,从太阳时到 GMT 、UT 、UTC ,以及原子时 TAI 的诞生和发展。
- 说明计算机时间定义及 POSIX 规定,Unix 时间不包含闰秒,多数现代系统的时间戳包含 UTC 闰秒。
- 以 Linux 和 FreeBSD 为例,展示了
date
和clock_gettime
的输出,证明系统时间包含闰秒。 - 指出 libtai 作者认为系统时钟应设为 TAI ,其计算 TAI64 时间戳的方式及存在的问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。