SNMP基本概念agent设备manager网管系统数据交互方式manager 轮询 agent 传统轮询模式agent 推送 managertrap告警模式版本目前有v1、v2c和v3这3个版本使用Lextm.SharpSnmpLib库的MessageFactory.ParseMessages能自动识别不同的版本得到统一的ISnmpMessage结构。常用请求类型GET请求一次可以请求多个oid但受到网络包大小的限制没法请求太多oid。GET BUIK请求可以多次查询全部的oid等价于分页查询或流式查询对内存也比较友好GET NEXT请求请求下一个oidGET BULK的基础版SET请求修改一个或多个oid的值上述请求对应linux上snmp工具套件的snmpget、snmpbulkget、snmpgetnext、snmpset这几个命令行样例如下snmpget -v 1 -c public localhost:10161 1.3.6.1.4.1.99999.3.1.1 snmpgetnext -v 1 -c public localhost:10161 1.3.6.1.4.1.99999.3.1.1 snmpbulkget -v 2c -c public localhost:10161 1.3.6.1.4.1.99999.3.1.1 snmpset -v 2c -c public -t 5 localhost:10161 1.3.6.1.4.1.99999.3.4.6 i 30安全V1和V2仅支持community string来作为明文密码。v3支持基于用户安全协议的认证。v3的安全级别为noAuthNoPriv、authNoPriv、authPriv。noAuthNoPriv是只靠用户名识别基本上等同于v1和v2里的community string了属于裸奔authNoPriv是身份验证防篡改但报文中的oid和值还是明文可以抓包偷看authPriv则是在authNoPriv的基础上对oid和值也做了加密别人无法抓包偷看。可见三个安全级别是逐层递增的。顺带说一下v3版本下的manager和agent交互也跟v1/v2不一样因为它有专门的用户安全协议所以在发送正式的GET/GETNEXT请求前manager和agent会有一个发现握手discovery handshake阶段该阶段下manager会先用noAuthNoPriv安全级别获得agent的EngineID和时钟信息然后manager才用更高的安全级别发送加密请求给agent。C#的Lextm.SharpSnmpLib库该库提供了SNMP报文的解析但没有提供UDP server机制开发SNMP Agent需要可自己开发一个简单的udp server做到及时响应过程不难udp因为是无连接的所以不用像tcp server那样listen同时因为是面向报文的也无需像tcp那样考虑分包、粘包等繁琐细节编程时主线程recvFrom之后起单独的线程处理报文并sendTo结果即可。顺带说一下网上资料说Lextm.SharpSnmpLib库有一个SnmpEngine类实现了UDP server机制并处理了v3版本的发现握手。仔细研究下来发现早期版本确实有这么一个类但开发团队不愿持续维护SnmpEngine就把它移到sample仓了可以到github上拿这个sample仓的代码参考使用。