【问题标题】:What is the correct encoding for SNMP type Unsigned32?SNMP 类型 Unsigned32 的正确编码是什么?
【发布时间】:2012-05-25 14:55:26
【问题描述】:

我正在编写一个 SNMP 代理,并且 MIB 定义包含一个 Unsigned32 类型的 OID。

代理的 Unix 实现使用 Net-SNMP 并将 OID 设置为 ASN_UNSIGNED 类型,因为它没有 ASN_UNSIGNED32。当我使用 Wireshark 查看 GET 响应时,它会将其解码为“Gauge32”值。乍一看,这是有道理的,因为根据 RFC 1902,Unsigned32 和 Gauge32 是相同的。

Windows 实现基于 Windows 的 SnmpAPI.lib 并将 OID 设置为 ASN_UNSIGNED32,当我使用 Wireshark 查看 GET 响应时,它会将其解码为“Unsigned32”。这对我来说看起来更好。

为什么这 2 种实现会在线路上产生不同的结果?

哪个是正确的版本,我如何设法从两个实现中获得相同的版本?

【问题讨论】:

    标签: c++ windows linux snmp net-snmp


    【解决方案1】:

    事实证明,Net-SNMP 使用当前的 RFC 1902 编码,其中 Unsigned32 和 Gauge32 相同,而 Windows 使用过时的 RFC 1442 编码,其中 Unsigned32 和 Gauge32 具有不同的编码。

    【讨论】:

    • 好收获。听起来像是 Windows 的错误。
    • 从表面上看,自 1996 年 RFC 1902 出现以来,Microsoft 并没有真正更新过 SNMP 服务。所以他们只是坚持旧版本,似乎大多数 SNMOP 工具仍然与 RFC 1442 兼容。
    【解决方案2】:

    如果您在 Windows 上保存 Wireshark 捕获,然后在 Unix 上的 Wireshark 中打开它。然后你可能会看到它显示的类型是什么。 Unsigned32 和 Gauge32 在标准中定义是可以互换的,所以在所有的 SNMP 实现中应该没有什么不同。在网络上,它应该传输相同的字节。

    【讨论】:

    • 这就是我的想法,但是两个 Wireshark 跟踪都是在 Linux 上完成的,来自 Linux 代理的 OID 显示为 Gauge32,来自 Windows 代理的 OID 显示为 Unsigned32。在同一台机器上执行相同的 Wireshark。
    • 没有时间深入研究 Wireshark 的解析器。但就像我说的那样,你应该阅读原始字节。你做到了吗?
    猜你喜欢
    • 2017-12-19
    • 2017-04-26
    • 1970-01-01
    • 2022-07-07
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2011-03-06
    相关资源
    最近更新 更多