【问题标题】:GETBULK SNMP4J RequestGETBULK SNMP4J 请求
【发布时间】:2017-05-23 10:28:56
【问题描述】:

我正在使用snmp4j 尝试针对远程代理执行 SNMP 功能。由于我们无法控制的一些限制,我需要执行GETBULK 以在短时间内获得一个大表。

我目前的实现:

public Map<String, String> doGetBulk(@NotNull VariableBinding... vbs)  
        throws IOException {

        Map<String, String> result = new HashMap<>();
        Snmp snmp = null;

        try {

            // Create TransportMapping and Listen
            TransportMapping transport = new DefaultUdpTransportMapping();
            snmp = new Snmp(transport);
            transport.listen();

            PDU pdu = new PDU();
            pdu.setType(PDU.GETBULK);
            pdu.setMaxRepetitions(200);
            pdu.setNonRepeaters(0);
            pdu.addAll(vbs);

            ResponseEvent responseEvent = snmp.send(pdu, this.target);
            PDU response = responseEvent.getResponse();

            // Process Agent Response
            if (response != null) {
                for(VariableBinding vb : response.getVariableBindings()) {
                    result.put("." + vb.getOid().toString(), vb.getVariable().toString());
                }
            } else {
                LOG.error("Error: Agent Timeout... ");
            }

        } catch (NullPointerException ignore) {
            // The variable table is null
        } finally {
            if (snmp != null) snmp.close();
        }
        return result;
    }

但是,当我知道有 5000+ 个结果时,这只会返回 100 个结果。我知道我不能超过 PDU 的大小,所以我在将响应截断为 100 个块时遇到了问题,但我不知道如何获得句柄来级联请求以获取接下来的 100 个条目。

【问题讨论】:

    标签: java snmp snmp4j


    【解决方案1】:

    使用 MaxRepetitions > 100 是不好的做法,因为 TCP/IP 数据包分段和 UDP 的性质不能保证数据包的顺序。所以大多数 SNMP 框架和代理都有这样的内置限制。

    【讨论】:

      【解决方案2】:

      所有细节都已经在 RFC 文档中了,

      https://www.rfc-editor.org/rfc/rfc1905

      4.2.3 告诉代理端应该如何处理 GET BULK 请求,以及

      虽然 Response-PDU 中的最大变量绑定数是
      以 N + (M * R) 为界,可能会生成较小的响应
      三个变量绑定的数量(可能为零)
      原因。

      (1)如果封装了Response-PDU的消息大小 包含请求数量的变量绑定将是 大于本地约束或最大消息大小 的发起者,那么响应是用较小的 变量绑定的数量。这个较小的数字是有序集 变量绑定,最后有一些变量绑定 的集合被删除,这样消息封装的大小 Response-PDU 大约等于但不大于 本地约束或最大消息大小 鼻祖。请注意,已删除的变量绑定数量已 与 N、M 或 R 的值无关。

      (2) 也可以使用较少的数量生成响应 多变的 绑定 if 对于迭代 i 的某个值,使得 i 更大 大于零且小于或等于 M,即所有生成的 变量绑定将值字段设置为“endOfMibView”。 在这种情况下,变量绑定可能会在 (N + (i * R))-th 变量绑定。

      (3) 如果处理的请求有很多 重复 需要比一个显着更多的处理时间 正常请求,那么代理可以用更少的 比全部重复次数,提供至少一个 重复完成。

      关于如何做一系列正确的 GET BULK 操作来查询你想要的所有数据,你可以参考 4.2.3.1 的例子。

      【讨论】:

        【解决方案3】:

        您已将最大重复次数设置为 200,即服务器最多可以向您发送 200 行。所以一方面,你永远不会得到超过 200 行(至少 5000 行或更多)。另一方面,服务器可能会决定向您发送更少的行,这实际上是服务器的选择;你告诉他你能处理什么。

        通常您最多请求 10-50 行。 (顺便说一句:那里有许多带有错误 SNMP 实现的服务器,并且您设置的最大重复次数越高,您一无所获的机会就越大。)

        所以你必须逐行请求行集。由于您可能不想自己实现,我建议使用 TableUtils 类。只需从getTable() 开始。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多