野外的 TAI64 有时不是 TAI • blog.dave.tf

主要观点: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 为例,展示了 dateclock_gettime 的输出,证明系统时间包含闰秒。
  • 指出 libtai 作者认为系统时钟应设为 TAI ,其计算 TAI64 时间戳的方式及存在的问题。
阅读 3
0 条评论