0

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

我不确定是否有许多 SNMP 客户端 - 但 SNMP 请求是否是同步和顺序的 - 有什么方法可以一次批量发送它们?

4

3 回答 3

1

您的问题的前提是有缺陷的,因为没有“一次批量进入”的概念 - 无论接收构成 SNMP 数据包的 UDP 数据报的顺序是什么,也无论两者之间的持续时间有多长通过您的网络接口接收每个数据包,您的操作系统将按接收顺序依次向您显示 SNMP 数据包。您有一个监听端口和一个读取缓冲区。因此,这种同步性已经是网络数据处理的工作方式,您不必担心。

不过,我想说的是,如果您在处理 SNMP 请求时等待某些资源可用(正如您使用“超时”一词所建议的那样),您可能应该继续并开始处理其他待处理的 SNMP 请求与此同时,或者你冒着整个堆栈陷入停顿的风险。仅仅因为某个其他管理器发出的请求 A 正在经历服务延迟,就让管理器等待一段未知的时间来响应请求 B 是不公平的。话虽如此,您可能确实希望在任何时候都可以为多少请求提供服务的上限,以防止潜在的 DDoSsing — 选择此值只能由您自己完成,并且您了解用例和生态系统。

于 2018-12-29T18:20:38.353 回答
1

我认为 SNMP 查询很容易爆发,因为多个独立的经理轮询您的代理和/或一个焦虑的经理在您的代理响应速度不够快时重试相同的命令。

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

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

总结一下:我认为高性能的 SNMP 代理应该具有以下特点:

  • 支持海量并发SNMP命令处理
  • 具有非阻塞数据源访问权限以收集托管对象数据
  • 具有某种形式的缓存或速率限制,以保护计算量大的数据源免受自大的 SNMP 管理器的影响

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

顺便说一句,BSD 套接字接口将保存未处理的 UDP 数据包队列,因此您的代理将有机会赶上。

于 2018-12-28T16:13:20.847 回答
-1

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

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

于 2018-12-28T14:32:25.710 回答