【问题标题】:Handing 32-bit ifindex inside of snmp在 snmp 中处理 32 位 ifindex
【发布时间】:2013-12-30 20:01:43
【问题描述】:

在开发我自己的 SNMP 轮询器时,我遇到了能够轮询具有 32 位接口索引的设备的问题。我找不到任何解释如何将十六进制(5 个字节)转换为 32 位整数或从整数转换为十六进制的内容,因为它不使用简单的十六进制转换。例如,接口索引是 436219904。在使用 snmpget 执行 pcap 时,我看到它的十六进制是 81 d0 80 e0 00,这没有任何意义。我一生都无法弄清楚它是如何转换为整数值的。我试图找到一个处理这个问题的 RFC,但没有运气。 16 位接口值按应有的方式进行转换。 0001 = 1 以此类推。只有 32 位的似乎给我这个问题。任何帮助表示赞赏。

【问题讨论】:

    标签: format snmp 32-bit packet


    【解决方案1】:

    SNMP 使用 ASN.1 语法对数据进行编码。因此,您需要学习 BER 规则,

    http://en.wikipedia.org/wiki/X.690

    对于你的情况,我可以说你看错了数据,好像 436219904 在 SNMP 中将被编码为 Integer32,字节应该是 1A 00 30 00

    我猜你在分析中遗漏了一些细节,所以你可能想再做一次,并添加更多描述(屏幕截图等)来丰富你的问题。

    【讨论】:

      【解决方案2】:

      我怀疑您的问题中缺少的关键信息是您的轮询中使用的 ifIndex 值是被轮询表的索引(未提及,但我们可以假设 ifTable),这意味着它将是编码为被轮询的 OID 的子标识符(给我 [this ifIndex] 的 [some property])与请求的值(给我 [the ifIndex] for [some other row of [some other table])。

      根据X.209(SNMP 使用的 ASN.1 基本编码规则的版本),OID 中的子标识符(前两个除外)被编码为一个或多个八位字节(8 位),最高位用作一个延续位(即“下一个八位字节也是这个子标识符的一部分”),然后剩余 7 位作为实际值。

      换句话说,在您的值“81 d0 80 e0 00”中,前 4 个八位字节中的每一个都设置了最高位,并在最后一个八位字节中清除:这就是您知道子标识符中有 5 个八位字节的方式。每个八位字节的剩余 7 位被连接起来得到整数值。

      当然反过来,要将整数值编码为 OID 的子标识符,您必须一次构建 7 位。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多