为什么SNMP通常运行在UDP而不是TCP / IP上?

今天早上,由于SNMP通过UDP运行,SNMP陷阱没有“通过”,所以在工作中遇到了很大的问题。 我记得在大学的networking课上,UDP不能保证像TCP / IP这样的交付。 维基百科说,SNMP可以通过TCP / IP运行,但是UDP更常见。

我知道TCP / IP上UDP的一些优点是速度,广播和多播。 但在我看来,保证交付对networking监控来说比广播能力更重要。 特别是当存在严重的高度安全需求时。 我的一位同事告诉我,当stream量变大时,UDP数据包将首先被丢弃。 这是另一个selectTCP / IP over UDP进行networking监视(IMO)的理由。

那么为什么SNMP使用UDP? 我无法弄清楚,也无法在Google上find合适的理由。

在有损networking(或拥塞networking)中,实际上UDP预计比TCP工作得更好。 TCP在传输大量数据方面要好得多,但是当networking出现故障时,UDP更有可能通过。 (实际上,最近我做了一个testing,发现在UDP超时设置正确的情况下,在UDP上的SNMP比在TCP上的SNMP成功的好得多。 一般来说,TCP在大约5%的数据包丢失时开始performance不佳,在33%(ish)下完全无用,UDP仍然会成功(最终)。

因此,一如既往的正确的做法是为正确的工作select正确的工具。 如果您正在对大量数据进行例行监视,则可以考虑使用TCP。 但是要准备回到UDP来解决问题。 现在大多数堆栈实际上可以同时使用TCP和UDP。

至于发送TRAPs,是TRAPs是不可靠的,因为他们没有被确认。 但是,SNMP INFORM是SNMP TRAP的已确认版本。 因此,如果您想知道通知接收方已收到消息,请使用INFORM。 请注意,TCP不能解决此问题,因为它仅提供收到消息的第3层级通知。 通知接收方实际上并没有保证。 SNMP INFORM做应用程序级别的确认,并且比假设TCP ack表示他们知道的更可信。

如果系统通过TCP发送SNMP陷阱,如果将stream量传送给接收方有问题,则可能会阻止等待数据包被确认。 如果生成了很多陷阱,可能会耗尽系统上的可用套接字,系统会locking。 使用UDP不是一个问题,因为它是无状态的。 1月份,BitBucket也出现了类似的问题,虽然它是系统日志协议,而不是SNMP–基本上,它们由于configuration错误而无意中使用了TCP上的系统日志,系统日志服务器closures,所有服务器都被locking等待系统日志服务器来确认其数据包。 如果SNMP陷阱是通过TCP发送的,则可能会发生类似的问题。

http://blog.bitbucket.org/2012/01/12/follow-up-on-our-downtime-last-week/

使用SNMP陷阱被认为是不可靠的。 你真的不应该依靠陷阱。

SNMP被devise为用作请求/响应协议。 协议细节很简单(因此名称为“简单networkingpipe理协议”)。 而UDP是一个非常简单的传输。 尝试在您的基本代理上实现TCP – 这比使用UDP编码的简单代理复杂得多。

SNMP get / getnext操作具有重试机制 – 如果在超时内没有收到响应,则发送相同的请求达到最大尝试次数。

查看O'Reilly关于SNMP的文章: https : //library.oreilly.com/book/9780596008406/essential-snmp/18.xhtml

将SNMP用于SNMP陷阱的一个优点是可以将UDP指向广播地址,然后将其置于该子网上的多个pipe理站。