确定NetFlow数据包中流的绝对时间的最佳方法是什么?看起来,流中只包含了相对时间信息(SysUpTime在流的开始和结束)。
对于Netflow v5和v9,可以通过Unix秒(数据包报头中的SysUptime字段: UnixSeconds - SysUptime + FlowStartSysUptime )计算它。但是UnixSeconds字段的精度只有一秒。
在IPFIX (v10)中,报头只包含创建数据包时的系统时间,而不包含系统正常运行时间。
发布于 2017-01-25 23:33:27
一些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,它会让您陷入困境。
一个简单的解决方案是假设流总是被迅速冲洗,计算它们的持续时间,然后将它们排列起来:
duration = flowEndSysUpTime - flowStartSysUpTime
start = (NOW - duration)
end = NOW
另一种方法是假设至少有一些流被迅速刷新,并使用flowEndSysUpTime编号对每个设备的启动时间保持一个估计:
boot-time = MIN(NOW - flowEndSysUpTime)
start = boot-time + flowStartSysUpTime
end = boot-time + flowEndSysUpTime
但是,如果设备实际上是重新启动的,那么您必须小心地检测对启动时间的估计中的步骤更改。这个步骤的变化可能只有30秒,如果它被重新启动两次快速连续。需要考虑的是--但是由于这些遗留的字段只精确到1秒,所以不清楚聪明是否值得去做。
https://stackoverflow.com/questions/41835769
复制相似问题