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的實現