一些 IPFIX 导出器通过使用更新的绝对时间戳字段(例如 flowStartSeconds(150)、flowEndSeconds(151))来避免此问题。有毫秒精度、微秒精度等的变体。见:
http ://www.iana.org/assignments/ipfix/ipfix.xhtml
(另外,请注意,IPFIX 标头中的绝对时间戳应该接近数据包实际完成和发送的时间,因此您至少可以对导出器和收集器之间的时钟偏移进行建模:
https:// www.rfc-editor.org/rfc/rfc7011#page-14)
但正如您所指出的,当 IPFIX 导出器发送遗留字段 flowEndSysUpTime(21) 和 flowStartSysUpTime(22) 时会出现问题。这对 NetFlow v1-9 来说没问题,因为标头时间戳也用 sysUpTimeSeconds 表示,但使用 IPFIX 会让您陷入困境。
一个简单的解决方案是假设流总是被及时刷新,计算它们的持续时间,并将它们与 NOW 对齐:
duration = flowEndSysUpTime - flowStartSysUpTime
start = (NOW - duration)
end = NOW
另一种方法是假设至少有一些流被迅速刷新,并使用 flowEndSysUpTime 数字维护每个设备启动时间的估计:
boot-time = MIN(NOW - flowEndSysUpTime)
start = boot-time + flowStartSysUpTime
end = boot-time + flowEndSysUpTime
但是,如果设备实际重新启动,您必须小心检测启动时间估计值的阶跃变化。如果连续快速重新启动两次,则该步骤更改可能只有约 30 秒。需要考虑的事情——但由于这些遗留字段只能精确到 1 秒,因此聪明是否值得麻烦尚不清楚。