【问题标题】:What is the best way to ensure the correctness of data returned by a SNMP query?确保 SNMP 查询返回的数据正确性的最佳方法是什么?
【发布时间】:2013-12-18 21:49:42
【问题描述】:

我正在编写代码,该代码使用snmp->get_bulk_request() 方法进行 SNMP 查询以从网络设备获取接口表详细信息。

我面临的问题是有时,我从查询中收到的数据缺少一些细节。这是一个暂时的问题。

我相信设置一定次数的重试会降低出错的可能性。但是,当我浏览snmp->get_bulk_request() 的文档时,我发现了一个名为 maxrepetitions。从文档中我不清楚这个参数的作用。

我试图弄清楚maxrepetitions 参数与get_bulk_request 调用方法一起使用时会产生什么影响。我浏览了“get_bulk_request() - send a SNMP get-bulk-request to the remote agent”中的文档,发现了这个:

$result = $session->get_bulk_request(
                          [-callback        => sub {},]     # non-blocking
                          [-delay           => $seconds,]   # non-blocking 
                          [-contextengineid => $engine_id,] # v3 
                          [-contextname     => $name,]      # v3
                          [-nonrepeaters    => $non_reps,]
                          [-maxrepetitions  => $max_reps,]
                          -varbindlist      => \@oids,
                       );

get-bulk-request -maxrepetitions 的默认值为 0。maxrepetitions 值指定要为变量绑定列表中剩余变量返回的后继数。

具体来说,我的问题是:

  1. 添加maxrepetitions 是否等同于为查询添加重试?。
  2. 重试是否是确保数据最可能正确的正确方法?

如果不是,那么确保 SNMP 查询返回的数据中错误概率低的最佳方法是什么?

【问题讨论】:

  • 1) 您是否尝试过在命令行中使用snmpwalk 来复制问题? (这可能很困难,因为您说问题是暂时的,但可以排除Net::SNMP 本身的问题。2)尝试启用调试模式:$session->debug([$mask]); 3)检查/增加max_msg_size$octets = $session->max_msg_size([$octets]);

标签: perl snmp


【解决方案1】:

从手册页: 在 GETBULK PDU 中设置 max-repetitions 字段。这指定了重复的最大迭代次数 变量。 示例

   snmpbulkget -v2c -Cn1 -Cr5 -Os -c public zeus system ifTable

   will retrieve the variable system.sysDescr.0 (which is the lexicographically next object to system) and the first 5 objects in
   the ifTable:

   sysDescr.0 = STRING: "SunOS zeus.net.cmu.edu 4.1.3_U1 1 sun4m"
   ifIndex.1 = INTEGER: 1
   ifIndex.2 = INTEGER: 2
   ifDescr.1 = STRING: "lo0"
   et cetera.

【讨论】:

  • 所以看起来它不会根据最大重复次数重试。
  • 我开始认为,从查询中获取完整数据是为了给定查询的最大重复次数。在这种情况下,获取完整的接口表数据。而且重新查询数据并不是真正的重试
  • 我刚刚查看了 CPAN,会话中有一个重试字段。
  • 从文档中很难看出,但是你真的认为一个查询即使发送成功并且主机返回结果(尽管不完整)也会重试?
  • 我猜,这只是我们通过会话重试指定的超时重试次数。但同样,期待其他情况(即使查询成功也会重试)听起来不像是一个有效的用例。如果我向查询添加重试,则可以确保数据可能正确
【解决方案2】:

理解 SNMP 中的字段的正确方法是直接转到 RFC 文档:

http://tools.ietf.org/search/rfc3416#page-14

在 RFC 3416 中,max-repetitions 的含义已详细回答,因此您应该先阅读它。

(对于谁想要否决这个答案,因为我使用了一个链接)很难从该文档中单独提取max-repetitions 的解释,要解释它你还需要知道什么是@ 987654324@.

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2016-11-05
    • 2012-08-30
    • 2021-03-31
    • 2014-06-16
    相关资源
    最近更新 更多