SNMP请求是顺序的吗?它们有可能以倍数到达

时间:2018-12-28 13:47:39

标签: snmp net-snmp pysnmp snmp4j snmpd

我正在编写SNMP代理,并计划编写代理来逐一处理SNMP请求。意味着当请求到达端口161时-在响应/超时完成之前将不接受任何其他请求。

我不确定会有很多SNMP客户端-但这是SNMP请求是同步的又是顺序的-是否有任何办法可以使它们一次批量出现?

3 个答案:

答案 0 :(得分:1)

我认为,由于多个独立的管理器轮询您的代理和/或如果代理的响应速度不够快,则一个焦虑的管理器会重试同一命令,因此SNMP查询很容易突然爆发。

在编写SNMP代理程序时,另一个考虑因素是估计代理程序收集所需数据以进行响应的最大时间。我认为它不应该是OID平均值,而应该是OID最大值。换句话说,如果您的代理服务于100个OID,从中查询一个“慢速” OID将导致整个(同步)代理阻止并停止为其他代理服务-这种情况可能会破坏您的代理在网络上的信誉。

最重要的是,如果您碰巧连续多次遇到相同的慢OID(例如经理重试),则延迟可能会累积,从而有效地阻止了其他查询。

总结:我认为高性能SNMP代理应具有以下特征:

  • 支持大规模并发SNMP命令处理
  • 具有非阻塞数据源访问权限,用于收集管理对象数据
  • 具有某种形式的缓存或速率限制,以保护计算昂贵的数据源免受自大的SNMP管理器的侵害

另一方面,如果您的SNMP代理在低功耗硬件上提供一小段静态数据,并且您不希望有过多的管理人员与您交谈,那么也许您可以摆脱简单的同步SNMP代理...

BTW,BSD套接字接口将容纳未处理的UDP数据包队列,因此您的代理将有机会赶上。

答案 1 :(得分:1)

您的问题的前提是有缺陷的,因为没有“一次批量发送”的概念-无论以什么顺序接收组成SNMP数据包的UDP数据报,无论持续多长时间在您的网络接口接收每个数据包之间,操作系统将按接收顺序将SNMP数据包呈现给您。您有一个侦听端口和一个读缓冲区。因此,这种同步已经已经是网络数据处理的工作方式了,您不必担心。

但是,我要说的是,如果您在处理SNMP请求时正在等待某些资源可用(如使用“超时”一词所建议的那样),则您可能应该继续并开始处理其他未决事件同时,SNMP请求,否则您将面临整个堆栈中断的风险。让经理等待某个未知的时间来响应请求B是不公平的,因为其他经理提出的请求A受到服务延迟。话虽这么说,您可能确实希望每次可以处理多少个请求有一个上限,以防止潜在的DDoSsing —只有在了解用例和生态系统的情况下,您才能选择此值。 / p>

答案 2 :(得分:-1)

获取请求是每个请求一个OID,GetBulk请求可以在一个请求中请求多个OID。 SNMP客户端也可以使用异步模式,以最小的间隔发送多个请求并等待答复。 由于网络延迟和等价路由,数据包也可能无序到达。您可以尝试使用snmpget,snmpgetbulk,snmpbulkwalk发送请求,并使用tcpdump查看线路上的内容。

因此,通常来说,您的代理必须准备好接受突发请求。 为简单起见,如果请求率较低并且您的代理可以足够快地答复,则可以使用一对一处理。在这种情况下,某些请求可能会失败,但是客户端可以重试请求并最终获得代理的答复。