SNMP在IT运营、网络设备管理、通信网元管理、物联网上应用广泛。以下章节将分析Linux/pSos等嵌入式环境下SNMP Agent流程特点及使用嵌入式设计SNMP Agent的技术细节(其中涉及到信息模型设计、C/C++语言等内容请各位看官提前学习哈)。本章也可以作为嵌入式下SNMP Agent的软件开发开发指导书。
(一)SNMP协议体系及技术要点
(二)SNMP Agent的设计要点
(三)SNMP Agent的实现
1 (二)SNMP Agent的设计要点
1.1 SNMP体系结构
SNMP(Simple Network Management Protocol)是被广泛接受并投入使用的工业标准,它的目标是保证管理信息在任意两点中传送,便于网络管理员在网络上的任何节点检索信息,进行修改,寻找故障;完成故障诊断,容量规划和报告生成。它采用轮询机制,提供最基本的功能集。最适合小型、快速、低价格的环境使用。它只要求无证实的传输层协议UDP,受到许多产品的广泛支持。
1.2 SMI与MIB文件和管理变量
SMI(Struct of Management Information)是ASN.1(抽象语法记法一)的一个子集,其中定义了几个SNMP常用类型和一个用来定义管理对象类型的宏,另外还作了几个重要的赋值。
SMI是定义管理对象类型的基础。
Management Inpormation Base 是所监控网络设备的标准变量定义的集合。SNMP用层次结构命名方案来识别管理对象,就象一棵树,树的节点表示管理对象,它可以用从根开始的一条路径来无二义的识别。
在Agent中这棵树是用较复杂的数据结构来实现的,不过这个工作可由MIB编译器完成。在树的叶节点中,存放有访问函数的指针,Agent就是通过调用这些函数来从相关模块取得管理变量的值的。
管理变量表示管理对象类型的值(或称该类型的实例),SNMP以管理变量作为操作对象。
管理变量的表示方法是这样规定的:形如x.y,其中x是管理对象的OBJECT IDENTIFER。y是能唯一确定对象类型值的一组数字;在简单变量(非表型)中为0,在表型变量中是这个表的索引,比如路由表中的目的网络地址等等 。
如:
计数器udpInDatagrams,它的对象标志为1.3.6.1.2.1.7.1,它的实例标记为1.3.6.1.2.1.7.1.0,对应的文字名为iso.org.dod.internet.mgmt.mib.udp.udpInDatagrams.0,可以简写为udpInDatagrams.0。
表型变量的表示要复杂一些。以UDP监听表为例,该表定义了两个变量的联合索引:
假设该表有三个实例: 假设该表有三个实例:
这三个实例经过处理后的对象标识表示为:
在MIB种对对象标识进行排序时时按照字典顺序进行排序的,排序后的情况如下:
所以对表形变量有以下两个结论:
· 表格中的一个给定变量的所有实例都在下一个变量实例之前显示;及表格的操作是“先列后行”;
· 表格中对行的排序与索引值的顺序有关;
这些概念对编写变量存取接口函数比较重要,希望开发人员能了解一些。
1.3 SNMP Agent处理流程
1.3.1 几个重要数据结构
几个重要的数据结构应该了解。
1. OID_T:标识变量名的一串数字中的一个成员,如:1.2.3.4
typedef unsigend long OIDC_T;
2. OBJ_ID_T:表示变量名,process_received_SNMP_process函数将根据它搜索mib树
typedef struct OBJ_ID_S { int num; //串中成员的个数 OIDC_T* list; //变量名串 }OBJ_ID_T;
3. VarBind:变量与值对(pair)绑定;
typedef struct VB_S { struct VB_S * vb_link; //指向下一个VB_T的指针 ALENGTH_T vb_seq_size; //VarBind表的总长 OBJ_ID_T vb_obj_id; OCTET_T vb_data_flags_n_type; // VarBind的数据类型 OCTET_T vb_flags; //VarBind的状态符号位 ALENGTH_T vb_data_length; // 数据长度 MIBLOC_T vb_ml; // 与此VarBind相关的mib-leaf /*********************** 变量值 ************************/ union { INT_32_T v_number; // Integer kinds of things UINT_32_T v_counter; EBUFFER_T v_string; //八位字串 OBJ_ID_T v_object; unsigned char v_network_address[4]; //网络地址 UINT_64_T v_counter64; BITSTRING_T v_bitstring; } value_u; PTR_T vb_priv; /* storage space for moving info */ /* between test and set routines */ VBPRIVPROC_T * vb_free_priv; /* pointer to routine to free the private storage space */ UNDOPROC_T * undoproc; /* 指向取消设置的规程*/ } VB_T;
4. VarBind List:它由一系列VarBind构成,列出一次请求中所有待操作的变量
typedef struct VBL_S { ALENGTH_T vbl_length; /* VarBind表的长度*/ int vbl_count; /*VarBind表中的VarBind数目 */ VB_T *vblist; /* 指向VarBind的指针*/ struct VBL_S *vblp; /* 用于GetBulkRequest操作的指针(SNMPv2中使用) */ } VBL_T;
5. SNMP_PKT_T: SNMP 数据包结构的内部表示
typedef struct SNMP_PKT_S { ALENGTH_T buffer_needed; /* Buffer长度 */ ALENGTH_T overall_length; /* 报文序列长度*/ UINT_32_T mib_view; /* 设置mib视图 */ OCTET_T flags; /*Packet的状态符号位 */ UINT_16_T lcl_ident; /* Local transaction identifer*/ SNMPADDR_T pkt_src; /* SNMP packet的源地址 . */ SNMPADDR_T pkt_dst; /* SNMP packet的目地址 . */ IO_COMPLETE_T *io_complete; /*处理此packet时调用的规程 */ ERR_COMPLETE_T *error_complete; /*出错时调用的规程*/ PTR_T async_cookie; /*cookie for use with completions */ OCTET_T phase; /* what phase we are running, should be the same size as vb_flags */ ALENGTH_T maxpkt; /*可编码生成的packet的最大长度 */ char * user_private; /* Anything one wants */ INT_32_T snmp_version; /*SNMP的版本号 */ UINT_16_T view_index; /*视图的索引 */ EBUFFER_T community; /*SNMPv1中的community名*/ ATVALUE_T pdu_type; /* PDU类型 */ ALENGTH_T pdu_length; /* PDU长度 */ union { /* For GetRequest, GetNextRequest, */ /* GetResponse, SetRequest, */ /* GetBulkRequest, InformRequest, */ /* and Trap2 PDUs. */ struct { /* 参见RFC 1157 */ INT_32_T request_id; INT_32_T error_status; INT_32_T error_index; VBL_T std_vbl; VBL_T saved_vbl; INT_32_T max_reps; int non_reps; } std_pdu; } pdu; MIBNODE_T * mib_root; /*MIB tree的根节点*/ OCTET_T lockflags; /*加LOCK的符号*/ OCTET_T gate_decr; /*gate描述*/ } SNMP_PKT_T;
1.3.2 基本处理流程设计
理解了SNMP Agent处理过程,我们终于可以进入最期待的部分了! J
下一章节我们将讲解如何实现一个完整的SNMP Agent。
(未完待续…)
(三)SNMP Agent的实现