SNMP 类型 Unsigned32 的正确编码是啥?

Posted

技术标签:

【中文标题】SNMP 类型 Unsigned32 的正确编码是啥?【英文标题】: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 种实现会在线路上产生不同的结果?

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

【问题讨论】:

【参考方案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 的解析器。但就像我说的那样,你应该阅读原始字节。你做到了吗?

以上是关于SNMP 类型 Unsigned32 的正确编码是啥?的主要内容,如果未能解决你的问题,请参考以下文章

uint8_t uint32_t 类型强制转换出错 以及 unsigned char 类型和 unsigned int 类型相互转化

C基本类型

snmp 中的本地化

C++数据类型范围

unsigned/signed int/char类型表示的数值范围

C++ builder中如何把unsigned char类型转换成16进制的输出