SNMP sysUpTime(OID 1.3.6.1.2.1.1.3.0) 时间戳信息解析

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 去计算了。。。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SNMP(Simple Network Management Protocol)是一种用于管理网络设备的协议。它的架构包括以下组件: 1. 管理站(Manager):管理站是控制和监视一个或多个代理的计算机或应用程序。管理站通过SNMP协议与代理通信,从而获得代理的信息并控制其行为。 2. 代理(Agent):代理是一种运行在网络设备上的软件程序,它能够收集和传输有关设备状态的信息。代理还可以执行管理站发出的命令,例如修改设备配置或重新启动设备。 3. MIB(Management Information Base):MIB是一种数据库,用于存储代理所提供的信息。MIB包含由SNMP定义的标准对象和由供应商定义的私有对象。标准对象包括设备类型、系统状态、接口状态等。 4. SNMP协议:SNMP协议定义了管理站和代理之间的通信格式。它使用UDP协议进行传输,具有简单、轻量级的特点。 下面是一个使用Java语言实现SNMP的代理代码示例: ```java import java.io.IOException; import org.snmp4j.*; import org.snmp4j.agent.*; import org.snmp4j.agent.mo.*; import org.snmp4j.agent.mo.snmp.SNMPv2MIB; import org.snmp4j.smi.*; import org.snmp4j.transport.TransportMappings; public class SNMPAgent { public static final OID sysDescr = new OID(".1.3.6.1.2.1.1.1.0"); public static final OID sysUpTime = new OID(".1.3.6.1.2.1.1.3.0"); public static final OID ifNumber = new OID(".1.3.6.1.2.1.2.1.0"); public static void main(String[] args) throws IOException { // 创建代理 DefaultMOServer server = new DefaultMOServer(); // 获取SNMPv2-MIB MOServerLookup lookupService = new DefaultMOServerLookup(); lookupService.addMOServer(new SNMPv2MIB()); server.setServerLookup(lookupService); // 创建对象树 MOTableBuilder builder = new MOTableBuilder(new OID("1.3.6.1.2.1")); builder.addColumnType(SMIConstants.SYNTAX_INTEGER, MOAccessImpl.ACCESS_READ_ONLY); builder.addColumnType(SMIConstants.SYNTAX_OCTET_STRING, MOAccessImpl.ACCESS_READ_ONLY); builder.addRowValue(new Integer32(1)); builder.addRowValue(new OctetString("Test Object")); MOTable table = builder.build(); server.register(table, null); // 注册标准对象 server.register(new DefaultMOFactory().createSysUpTime(sysUpTime), null); server.register(new DefaultMOFactory().createSysDescr(sysDescr), null); server.register(new DefaultMOFactory().createIfNumber(ifNumber), null); // 启动代理 TransportMapping<?> transport = new DefaultUdpTransportMapping(new UdpAddress("0.0.0.0/161")); Snmp snmp = new Snmp(transport); snmp.setLocalEngine(new OctetString(MPv3.createLocalEngineID())); snmp.setMessageDispatcher(new MessageDispatcherImpl()); snmp.addCommandResponder(server); snmp.listen(); } } ``` 这个代理实现了sysDescr、sysUpTime和ifNumber三个标准对象,以及一个自定义对象。它使用SNMPv2-MIB作为MIB库,并使用UDP协议进行传输。当运行该代理后,可以使用SNMP管理站获取这些对象的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值