SNMP sysUpTime(OID 1.3.6.1.2.1.1.3.0) 时间戳信息解析遇到的问题
提示:sysUpTime: SNMP OID 1.3.6.1.2.1.1.3.0 计算出来的启动时间,与设备显示的不一致
SNMP V2C Trap 时间戳详细解析
最近计划通过SNMP Trap 获取设备的事件信息,发现Trap时候,设备会发生
OID = 1.3.6.1.2.1.1.3.0 的字段信息。
查资料,发现该OID表示MIB中的sysUpTime。
网络上查询该OID的定义解析:
RFC1213 defines sysUpTime as a 32-bit counter in 1/100 second. From the RFC’s definition of sysUpTime:
“The time (in hundredths of a second) since the network management portion of the system was last re-initialized.”
即是:该字段的值是32-bit 的计数器, 每1个单位,表示1秒的百分之一,即是0.01秒。 该计数器的值,是从设备启动后开始计数。
但是通过Trap收到的华为S9xxx设备发来的 sysUpTime ,与设备时间开机时间无法对上。
抓取到的 OID = 1.3.6.1.2.1.1.3.0 , timeticks-value=4294967296
而通过display version, 显示设备启动时间:
Quidway S9xxx Terabit Routing Switch uptime is 123 weeks, 5 days, 15 hours, 51 minutes
按照OID = 1.3.6.1.2.1.1.3.0的定义,4294967296应该是71 weeks
4294967296/100/(2436007) = 71.0146708994709
OID = 1.3.6.1.2.1.1.3.0 计算出来的启动时间,与设备显示的不一致。
这个问题困扰了很久。。。
OID = 1.3.6.1.2.1.1.3.0 计算出来的启动时间,与设备显示的不一致
提示:现网设备实际数据:
抓取到的 OID = 1.3.6.1.2.1.1.3.0 , timeticks-value=4294967296
而通过display version, 显示设备启动时间:
Quidway S9xxx Terabit Routing Switch uptime is 123 weeks, 5 days, 15 hours, 51 minutes
按照OID = 1.3.6.1.2.1.1.3.0的定义,4294967296应该是71 weeks
4294967296/100/(2436007) = 71.0146708994709
>>> 4294967296/100/(24*3600*7)
71.0146708994709
>>>
原因分析:
提示:SysUpTime MIB supports 32-bit (Timeticks):
SysUpTime MIB supports 32-bit = 2 to the 32nd power = 2^32 = 4294967296 (Timeticks)
32位的整数,最大表示是 2^32 = 4294967296
4294967296 最多表示 是 497天多一点,如果超过这个数值,计数器又从0开始计数。
>>> 2**32/100/(24*3600)
497.1026962962963
>>>
All PacketWise images and models will have the same behavior after the sysUpTime value reaches 497 days, the sysUpTime polled value resets to zero (0).
解决方案:
提示:需要自己加上 n * 2**32 去计算 SysUpTime
如果一个设备启动时间特别长的话,设备通过Trap 发到接收器的 timeticks (OID = 1.3.6.1.2.1.1.3.0),需要加上 n * 2**32,再去计算设备的开机时间,从而再去计算trap信息的实际时间。
后记:
后面发现这个Trap接收到时间,实际也没什么意义了
因为Trap 收到的信息,是设备事件的信息,基本都是实时收到,在接收trap的程序上,记录接收的Trap消息的时间即可,无需通过这个 OID = 1.3.6.1.2.1.1.3.0 去计算了。。。