天浩旭科技
181 2393 7129
新闻中心
当前位置:首页 > 新闻中心
基于FreeRTOS+LwIP的SNMP实现方案
浏览次数:36 

简介

SNMP:简单网络管理协议(Simple Network Management Protocol),是由互联网工程任务组定义的一套网络管理协议。SNMP可以使网络管理员通过一台工作站完成对计算机、路由器和其他网络设备的远程管理和监视。利用SNMP协议可以更好地管理和监控网络。管理工作站可以远程管理所有支持该协议的网络设备,如监视网络状态、修改网络设备配置、接收网络事件警告等。
SNMP作为TCP/IP协议的一部分,其消息是被封装到UDP协议中进行传输的。SNMP协议主要由两大部分组成:网络管理站(也叫管理进程)和被管的网络单元(也叫被管设备),被管设备种类众多,比如:路由器、终端服务器、打印机等。在本文档中,国民技术的N32G457QEL_EVB V1.1全功能开发板就充当被管理设备。被管设备端和管理相关的软件叫代理程序(SNMP agent)或者代理进程,它是运行于设备上的代码或程序。管理进程和代理进程之间的通信可以有两种方式:一种是管理进程向代理进程发起的,询问其具体参数值(get操作)或者为其设置某个参数值(set操作);另一种是代理进程主动向管理进程发起的,向其报告自身的某些重要事件的发生(trap操作)。到目前为止,SNMP共有三个版本:v1,v2和v3。V1和v2有很多共同的特征,v3在前面版本的基础上增强了安全性方面的功能。其各自的消息格式、操作命令等将在后文中详细给出。

本文档主要针对国民技术MCU N32G45x系列产品在搭载FreeRTOS + LwIP的场景下的以太网实例:SNMP的应用


SNMP基本概念 

由于 SNMP 由管理站(NMS)和被管设备组成,在具体实现中,NMS 负责管理命令的发出、数据存储、数据分析,而运行于被管设备上的代理 agent 程序就负责与管理站的 SNMP 通信。管理站与代理 agent 端通过管理信息库(MIB)进行接口统一,MIB 定义了设备中的被管理对象。管理站和代理 agent 都实现了相应的MIB 对象,以此来识别双方的数据,实现通信。管理站向代理 agent 请求 MIB 中定义的数据,代理 agent 识别后,将管理提供的状态或者参数转换成 MIB 定义的格式,返回给管理站,就完成了一次管理操作。


1.1 MIB 

MIB 是(Management Information Base)管理信息库的缩写。它是 SNMP 管理与 agent 之间可以正常沟通的桥梁,是资源和对象标识符 oid(object identifier)之间唯一对应关系的数据库。任何一个被管理的资源都可以用 oid 来对应。所谓 oid,实质上是树形结构,每一个节点用一个数字对其进行标识,直至最终的资源,类似 PC 上的文件夹路径。例如下图中:Iso.Org.Dod.Internet.Mgmt.Mib.System 对应的 oid 为:.1.3.6.1.2.1.1。在实际开发中需要开发人员在 MIB 定义自己的 oid,为了便于测试,本文档中使用的是下图 System 节点下的叶子节点对应的 oid。


1.2 操作命令 

Get-request 操作:SNMP 管理从 SNMP agent 获取一个或多各参数值;
Get-nest-request 操作:SNMP 管理从 SNMP agent 获取一个或多个参数的下一个参数值;
Get-bulk 操作:SNMP 管理从 SNMP agent 获取批量参数值,其中,non-repeaters 和 max-repetitions 两个字段必须设置,non-repeaters 是指前 n 个参数可以用 Get-nest-request 操作执行,max-repetitions 是指 n 之后的参数只能用 Get-nest-request 操作获取到最多 m 个参数值;
Set-request 操作:SNMP 管理设置 SNMP agent 的一个或者多个参数值;

Get-response 操作:SNMP agent 返回一个或多个参数值,是 SNMP agent 对 SNMP 管理的操作命令的响应;
Trap 操作:SNMP agent 主动发出的报文,目的是通知 SNMP 管理设备自身所发生的一些事件,执行该操作后,设备不会收到来自 SNMP 管理的回复报文;
Inform-request 操作:与 Tarp 操作类似,不同的是,SNMP agent 主动发出该报文后,如果连接畅通,将会收到来自 SNMP 管理的回复报文。
在 SNMP 三个版本中,v1 版本只包含 Get-request 操作、Get-nest-request 操作、Set-request 操作、Getresponse 操作和 Trap 操作。V2 和 v3 版本都包含以上所有操作,并且 v3 在 v2 的基础上增加了安全性方面的功能。


1.3 报文格式 

前面提到 SNMP 有 3 个不同版本的协议,接下来就看看它们各自的报文格式。
1.3.1SNMPv1报文格式 
SNMPv1 报文主要由版本、团体名、SNMP PDU 三部分构成,如下图:


版本:表示 SNMP 的版本,版本字段的值是报文版本号减 1,如果是 SNMPv1 报文则对应字段值为 0。
团体名:用于在 agent 与 NMS 之间完成认证,字符串形式,常用的是 “public”和“private”。团体名包括“可读”和“可写”两种,执行 Get、Get-next 操作时,采用“可读团体名”进行认证;执行 Set 操作时,则采用“可写团体名”认证。
SNMPv1 PDU:包含 PDU 类型、请求标识符、变量绑定列表等信息。
其中,PDU 的格式如下:

PDU Type:协议数据单元的类型。支持 Get-request PDU、Get-next-request PDU、Set-request PDU、response PDU 或 Trap PDU 五种类型。
Request ID:请求标示字段,唯一的标示一个请求报文。
Error Status:错误状态标示字段。SNMPv1 中错误码包括:1、noSuchName:指定了一个代理不知道的对象;2、tooBig:代理不能一次把请求的结果放入到一个 PDU 中;3、badValue:进行 set 操作时候把变量修改为一个无效的值;4、genErr:除以上错误外的其他错误。
Error Index:错误索引字段。
Variable Bindings:变量绑定字段。

版本:表示 SNMP 的版本,版本字段的值是报文版本号减 1,如果是 SNMPv2 报文则对应字段值为 1。
团体名:用于在 agent 与 NMS 之间完成认证,字符串形式,常用的是 “public”和“private”。团体名包括“可读”和“可写”两种,执行 Get、Get-next 操作时,采用“可读团体名”进行认证;执行 Set 操作时,则采用“可写团体名”认证。
SNMPv2c PDU:包含 PDU 类型、请求标识符、变量绑定列表等信息。
其中,PDU 格式如下:

PDU Type:协议数据单元的类型。支持 Get-request PDU、Get-next-request PDU、Set-request PDU、
response PDU、Trap PDU、Get-bulk PDU 或 Inform PDU 七种类型。
Request ID:请求标示字段,唯一的标示一个请求报文。
Error Status:错误状态标示字段。SNMPv2c 中错误码包括:1、wrongValue:进行 set 操作时候把变量修改为一个无效的值;2、wrongEncoding:进行编码字段的值,与其他的字段不一致;3、wrongType:进行 set操作时候把变量修改为一个无效的类型;4、wrongLength:进行 set 操作时候把一个变量值设置成与它长度不一致的值;5、inconsistentValue:把一个变量设置为其他的情况下有效的值,当前情况下无效;6、noAccess:试图设置一个不可访问的值;7、notWritable:试图修改一个存在,但不能修改的值;8、noCreation:试图修改一个存在,但不能创建的值;9、inconsistentName:试图设置一个当前不存在且当前不能创建的变量;10、resourceUnavailable:设置过程中申请某些资源失败;11、commitFailed:set 操作失败;12、undoFailed:进行set 操作失败,有些赋值无法回复;13、genErr:除以上错误外的其他错误。
Error Index:错误索引字段。
Variable Bindings:变量绑定字段。


1.3.3 SNMPv3报文格式 
SNMPv3 报文结构从功能上来说,与 SNMPv1、SNMPv2c 的区别主要增加了报头数据和安全参数,如下图:

版本:表示 SNMP 的版本,该字段为 3.
报头数据:主要包含消息发送者所能支持的最大消息尺寸、消息是否进行加密/认证、采用的安全模式等描述内容。格式如下:

Msg ID:可以使请求和应答相互关联,响应报文中的 Msg ID 和发送报文中的值相同。
Msg Max size:消息发送者支持的最大的消息尺寸。
Msg Sec Model:指明了发送方采用的安全模式。
Msg Flag:请求报文指定是否要求回应 report 消息,消息是否进行了加密和认证。
安全参数:包含用户名、密钥、加密参数等安全信息。格式如下:

Auth Engin ID:唯一的标识一个认证。
Auth Engin Boots:从配置认证引擎到现在,认证引擎重新启动的次数。
Auth Engin Time:从配置认证引擎到现在的时间。
User Name:用户名。
Auth Para:认证参数值。
Priv Para:加密后的参数值。
SNMPv3 PDU:包含 PDU 类型、请求标识符、变量绑定列表等信息,包含 Get-request PDU、Get-nextrequest PDU、Set-request PDU、response PDU、Trap PDU、Get-bulk PDU 或 Inform PDU 七种类型。格式如下:

Context Egine ID:SNMP 唯一标识符,和 PDU 类型一起决定应该发往那个应用程序。
Context Name:指明上下文之间的关系,由应用程序决定。
Data:报文的数据内容。

业务咨询1业务咨询2业务咨询3技术咨询Skype Me! 境外商务
QQ
0755-86583632
Tel