Summary

  • RFC 3430 让 SNMP 可以借助 TCP 的流量控制和大数据传输能力,但可靠的字节流不等于 SNMP 操作已被处理。
  • 操作类型仍决定确认含义:snmpV2-trap 仍是未确认通知;inform-request 才会触发具有明确接收端含义的 SNMP 响应。

“可靠传输”这个说法很容易让人多走一步:连接还开着,TCP 已确认字节,最后连接还正常关闭,于是就把这些迹象上推成“管理应用已经收到事件”。RFC 3430 专门用第 2.4 节“可靠传输与已确认操作”提醒读者不要这样推断。

这份备忘录于 2002 年 12 月以 Experimental 状态发布,为 Simple Network Management Protocol 增加一种 TCP 传输映射。它没有替换 SNMP 的消息模型,也没有把每种通知改造成需要确认的操作。它允许 SNMP 消息经 TCP 传送,主要服务于更高效的大批量数据传输。实现这一可选映射的 SNMP 引擎仍须实现 RFC 3417 定义的 SNMP/UDP 映射。RFC 3430 还规定,由请求发起方为整个请求—响应事务选择传输;事务中途不能换传输。

因此,这不是“一个不可靠协议换成可靠协议”这么简单。TCP 的流量控制和分段可能减少 UDP 传送大量管理数据时频繁往返的小型请求,但连接建立、拆除和保持打开状态都会消耗网络与操作系统资源。资源紧张的设备可以拒绝新的 TCP 连接。RFC 3430 建议在 TCP 上相应延后 SNMP 重传定时器,避免应用定时器先于 TCP 自身的重传过程到期。

从数据报切换到字节流,消息边界也要重新处理。UDP 把一条消息放在一个数据报边界内;TCP 交给应用的是字节序列,读取边界不保证与 SNMP 消息边界对齐。因此 RFC 3430 要求接收端依据 BER 编码里的长度字段,找出一条 SNMP 消息结束、下一条开始的位置。发送端不得把两条消息的字节交错写入流中。另一方面,一个持久、全双工的连接可以承载多组请求—响应,也允许先发多个请求;响应不必按请求到达顺序返回。即使响应顺序变了,消息边界仍必须明确。

分帧规则仍然不能证明应用已经行动。TCP 在 RFC 3430 所限定的条件下保护端点间有序字节流,却不能证明远端 SNMP 进程已解析或处理消息。正常关闭 TCP 连接,甚至不能证明接收端 TCP 引擎已把所有字节交给应用进程。消息一旦发往网络,也不能仅凭用了 TCP 就保证它最终一定送达。

更强但不同的回执来自 SNMP 操作本身。RFC 3430 把未确认的 snmpV2-trap 与已确认的 inform-request 作了对比。把 Trap 放在 TCP 上,不会自动给它添上一条 SNMP 确认。接收端对 Inform 返回的 SNMP 响应,按 RFC 3430 的定义,说明通知通过了传输与安全模型,并已排入通知接收应用的队列。set-request 的响应则表示命令响应器已经处理写请求。这些都是有意义的协议级确认,却不能证明某个人看到告警、业务流程据此行动,或现实中的目标状态已经变化。

连接建立失败时,意图与回执之间还多了一道边界。RFC 3430 规定,TCP 连接建不起来,事务便中止,并以超时错误报告给应用。附录 A 讨论了 UDP 回退等连接建立替代方案,但不把换一种传输当成消除不确定性的办法:需要可靠通知交付的发起方,仍须为连接建立失败的通知保留本地日志;即使尝试回退也失败,日志仍然必要。日志留下待处理事项,却不是目的端已收到的证明。

安全仍是另一层。TCP 映射不改变 SNMPv3 安全机制。RFC 3430 建议使用基于用户的安全模型和基于视图的访问控制模型,并另外指出 TCP 会带来 SYN flood 一类拒绝服务风险。经过认证并获授权的 SNMP 操作,与字节已交付、通知已入队、下游处理已完成和运营效果已观察到,并不是同一份回执。

RFC 3430 的历史贡献,比“SNMP over TCP 很可靠”更窄,也更有用:它为大型管理交换提供流式传输,规定如何在流里划定消息边界,并指出传输可靠性只是对已确认操作的低劣近似。Trap 仍是 Trap;Inform 仍是带有响应语义的操作。字节流可以承载两者,却不能替接收方决定它究竟做了什么。

本文分析的是规范所定义的协议契约,不声称当前部署状况、产品支持、性能测量或特定故障。证据链分层记录:连接建立、BER 消息分帧、字节交付、SNMP 引擎接收或处理操作、通知进入接收应用队列,最后才是其他系统或人员采取行动。RFC 3430 的响应只覆盖其中一部分。

Sources:RFC 3430;RFC 3417;RFC 3411;RFC 3413;RFC 3414;RFC 3415;RFC 3419;RFC 9293。状态:RFC Editor。