代码之家  ›  专栏  ›  技术社区  ›  Programmer

SNMP请求是连续的吗?它们是否有可能多次到达

  •  0
  • Programmer  · 技术社区  · 7 年前

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

    我不确定是否有许多SNMP客户端—但SNMP请求是否是同步和顺序的—是否有任何方法可以一次性批量提供这些客户端?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Ilya Etingof    7 年前

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

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

    总而言之:我认为高性能SNMP代理应该具有以下特点:

    • 具有收集托管对象数据的非阻塞数据源访问权限

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

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

        2
  •  1
  •   Lightness Races in Orbit    7 年前

    您的问题的前提是有缺陷的,因为没有“一次性批量”的概念-无论组成SNMP数据包的UDP数据报以何种顺序接收,也不管网络接口接收每个数据包之间的持续时间有多长,您的操作系统将按接收顺序、顺序向您提供SNMP数据包。您有一个侦听端口和一个读取缓冲区。所以这个同步性是 网络数据处理是如何工作的

    不过,我想说,如果您在处理SNMP请求时等待某些资源可用(正如您使用“超时”一词所建议的那样),那么您可能应该继续并同时开始处理其他未决的SNMP请求,否则您可能会冒着整个堆栈崩溃的风险。仅仅因为某个其他经理发出的请求a在服务过程中遇到延迟,就让经理等待对请求B的响应的未知时间是不公平的。也就是说,您可能确实希望对一次可以服务的请求数量设定上限,以防止潜在的DDoS攻击-只有您了解用例和生态系统,才能选择此值。

        3
  •  -1
  •   Yuri Lachin    7 年前

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

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

    推荐文章