基于SNMP的MIB库访问实现的研究
蔡國森
(北京工商大學??計算機學院)
摘要??SNMP是用于網絡管理/代理之間的請求/應答協議。管理信息庫(MIB)定義了由代理者維護的各種變量,它們由管理者來進行存取操作,從而實現具體的網絡管理。本文在對MIB的分析之后,給出了對MIB庫變量訪問的C語言程序實例.
關鍵詞??簡單網絡管理協議,模型,信息庫,訪問實現
1? ?? ???引言
? ?簡單網絡管理協議(SNMP)是Internet組織用來管理Internet的網絡協議,隨著Internet所使用的TCP/IP協議族成為事實上的網間網互連協議標準,SNMP也成為計算機網絡管理方面大家實際遵循的標準。幾乎所有的Internet網絡設備的生產廠家都在開發與SNMP有關的產品并投放市場。
2??SNMP 的管理模型
在SNMP管理模型中有三個基本組成部分:管理者(Manager),被管代理(Agent)和管理信息庫(MIB)。管理站一般是一個單機設備或一個共享網絡中的一員,它是網絡管理員和網絡管理系統的接口,能將網絡管理員的命令轉換成對遠程網絡元素的監視和控制,同時從網上所有被管實體的MIB (管理信息庫) 中提取出信息數據。作為管理站,它還必須擁有能進行數據分析、故障發現等管理應用軟件。整個管理站的管理工作是通過輪詢代理來完成的。管理者可以通過SNMP 操作直接與管理代理通信,獲得即時的設備信息,對網絡設備進行遠程配置管理或者操作;也可以通過對數據庫的訪問獲得網絡設備的歷史信息,以決定網絡配置變化等操作。SNMP管理代理指的是用于跟蹤監測被管理設備狀態的特殊軟件或硬件,每個代理都擁有自己本地的MIB。實際上,SNMP 的管理任務是移交給管理代理來執行的。代理翻譯來自管理站的請求,驗證操作的可執行性,通過直接與相應的功能實體通信來執行信息處理任務, 同時向管理站返回響應信息。
?
3? ?? ? 管理信息庫
? ?MIB信息為網管中被管資源,而網絡管理中的資源是以對象表示的,每個對象表示被管資源的某方面屬性,這些對象形成了MIB庫。每個MIB變量記錄了每個相連網絡的狀態、通信量統計數據、發生差錯的次數以及內部數據結構的當前內容等。網絡管理者通過對MIB庫的存取訪問,來實現五大管理功能。
3.1 MIB對象定義格式
ASN.1是一種用于描述結構化客體的結構和內容的語言,基于編碼規則BER(Basic Encoding Rules)是ASN.1標準定義的一種傳送文法。每個MIB變量格式是SMI規定的,用ASN.1描述如下:
OBJECTNAME BOJECT-TYPE
DESCRIPTION:(description)
SYNTAX: (syntax)
ACCESS: (access)
STATUS: (status)
::={(Parent)number}
OBJECTNAME是被管對象的名字,ASN.1要求所有對象的名字在MIB中必須是唯一的;BOJECT-TYPE 是每一個節點對象所必需的關鍵字;SYNTAX是被管對象類型的關鍵字,隨后跟著的是一個類型(syntax);ACCESS是被管對象的訪問方式關鍵字,在
SNMP 第二版中為MAX-ACCESS 關鍵字,(access)是被管對象的訪問方式,可為如下列舉值之一: read-only、read-write、no-accessible, SNMP 第2 版中又增加了read-create;STATUS是被管對象關鍵字,(status)是被管對象的狀態,如必備的、可選的或廢棄的;DESCRIPTION是 對被管對象的功能、特征等進行描述的關鍵字,(description)是被管對象的文本描述,在:::={(Parent)number }中,Parent表示位于MIB樹中的父節點,number表示是第幾個子節點。
3.2 MIB 樹
每個MIB對象都用對象標識符(OID)來唯一的標識,這是用定義在ASN.1語法中的樹型結構來組織的可用信息,其中每個可用信息是一個帶標號的節點,每個節點用數字和字符兩種方式顯示,其中對象標識符OID是由句點隔開的一組整數,也就是從根節點通向它的路徑,它命名節點并指示它在ASN.1樹中的準確位置。一個帶標號節點可以擁有包含其它帶標號節點為它的子樹,如果沒有子樹它就是葉子節點,它包含一個值并被稱為對象。圖3是帶有ASN.1編號的MIB樹實例:可以看出MIB-Ⅱ的OID是:1.3.6.1.2.1或者iso.org.dod.internet.mgmt.mib2。在SNMP中,實現應用到的MIB對象都是MIB-Ⅱ的子樹節點。
3.3 MIB 對象及變量
? ? Internet MIB是一樹形結構的數據庫, MIB-I定義了8個管理信息類別,MIB-Ⅱ是在MIB-I基礎上的擴展,增加了SNMP和CMOT兩項。MIB類別說明見表1。
表1??MIB類別表
MIB類別? ?? ???包含有關信息
System? ?? ?? ?? ?關于實體所在系統的數據
Interface? ?? ?? ?用于管理的網絡接口信息
AT? ?? ?? ?? ?? ? 地址轉換信息
IP? ?? ?? ?? ?? ? 網絡協議
ICMP? ?? ?? ?? ?? ?為IP設備攜帶錯誤和控制的協議
TCP? ?? ?? ?? ?? ? 傳輸控制協議
UDP? ?? ?? ?? ?? ?用戶數據報協議
EGP? ?? ?? ?? ?? ?外部網關協議
? ?? ?? ?CMOT? ?? ?? ?? ?? ?公共管理信息與服務協議
? ?SNMP? ?? ?? ?? ?? ?簡單網絡管理協議
MIB庫中每一個變量都符合ASN.1語法規則,MIB庫中只使用了ASN.1諸多類型中的INTEGER,OCTET STRING,OBJECT IDENTIFIER,NULL作為基本類型,同時定義了IpAddress,Counter,Gauge,TimeTicks,Opaque類型,大體上說,MIB中變量可分為兩大部分,簡單變量(Simple variable)和表格(Table)。簡單變量是常見的整型及字符串,也包括一些數據集合,通過在變量的對象標識符末尾附加.0來引用。表格對應一組數組,可包含變量的多個實例,表格中的每個表項可以用多個字段,這些字段本身可能是簡單變量也可能是表格,表格不能直接進行存取。
4? ?? ???MIB 訪問實現
4.1 SNMP 報文操作
由于SNMP 是工作在UDP 上的協議,即無連接的報文通信方式,它不保證報文是否正確到達(SNMP的報文格式如圖4所示)。與其他網絡管理協議不同的是,SNMP 使用一種稱作“取—存”的范例來實現各種操作。主要有以下3種信息:
(1) Get :由管理站去獲取代理管理信息庫的值,通過發送Get - Request , Get - Next – Request兩種消息來實現。管理站通過發送Get - Request 報文從擁有SNMP 管理代理的網絡設備中獲取指定對象的信息,而管理代理用Get - Response 報文來響應Get - Request 報文。Get - Next - Request 是獲取一個表中指定對象的下一個對象,因此通常用它來獲取一個表中的所有對象信息。
(2) Set :由管理站設置代理的管理信息庫的對象值,通過發送Set - request 來實現,它可以對一個網絡設備進行遠程參數配置。
Version
Community
SNMP??PDU
SNMP消息
PDU type
Request-id
0
0
Variable-bindings
Get-Request PDU,Get-Next-Request PDU,Set-Request PDU
PDU type
Request-id
Error-status
Error-status
Variable-bindings
Get-Response PDU
PDU type
Enterprise
Agent-addr
Generic-trap
Specific-trap
Time-stamp
Variable-bindings
Trap PDU
Name1
Value1
Name2
Value2
……..
Name n
Value n
圖4??SNMP消息格式
(3) Trap :使得代理能夠向管理站通告重要事件,是屬于非請求的消息,這些消息通知管理站發生了特定事件。Trap 消息可以用來通知管理站線路的故障、連接的終端和恢復、認證失敗等消息。 一個SNMP 實體在接收SNMP 報文時,一般要進行基本的語法檢查、版本號的驗證、認證(若成功就以ASN. 1 的形式返回一個PDU) 、對返回的PDU 再進行語法檢查。當所有的驗證和語法解析成功以后,實體就選擇適當的訪問策略,對該PDU 進行相應的處理。管理系統工作時,管理站周期性地發送Get - Request/ Get-Next-Request 報文來輪詢各個代理,獲取各個MIB 中的管理信息,同時,管理站也接收代理發來的Trap 報文,并記錄在一個數據庫中。網絡管理員可以通過專用的應用軟件從管理站上查看每個代理提供的管理信息。各個節點的代理程序駐留在工作站內存中,負責收集被管對象的網絡狀態信息。當代理接收到管理站的Get 報文后,代理將根據請求的內容從本地MIB 中提取所需信息,并以Get - Response 報文方式將結果回送給管理站。代理一方面在161 端口上(SNMP 的默認端口) 循環偵聽來自管理站的Get-Request/ Get-Next-Request 報文,并做出相應的響應,讀取或修改MIB 中的變量值,將結果返回給管理站,另一方面,它也不斷地檢查本地的狀態,適當地發送Trap 報文。
4.2 MIB訪問流程及原理
? ?首先根據自變量接收一個要訪問的被管理對象主機名,并接收要查詢的對象標識符的簡略定義形式. 過程首先生成SNMP 報文,一旦報文生成,再把報文簡單反轉過來,發送出去. 這其中要將請求標識符段內容及標識符長度保存起來,留待以后進行匹配檢查. 生成SNMP 報文后,建立代理地址,創建套接字連接,以便代理能將響應發回. 然后,啟動警告信號處理器,將SNMP 請求報文發給代理 ,等待一個響應的到來.因為SNMP 是工作在UDP 之上的,所以在SNMP 應用實體間通信時,無需先建立連接,這樣雖降低了系統開銷,但UDP 傳輸是不可靠的,為此,網絡管理站采取了相應的超時和重發策略. 本系統在發出請求報文之后,啟動超時計數器,等待響應的到來,并設置重發次數為3. 若3 次之后仍沒有收到響應,則關閉套接字,并返回一個“接收失敗”錯誤代碼. 反之,若確定收到一個響應,則調用一過程來把響應轉換成為內部表示形式, 即對SNMP 報文進行譯碼. 再用已保存的Request-id與響應Request-id段進行比較,來驗證這個報文是否是剛才發出的請求報文的響應. 若是,就調用另一個過程,把每段對象標識符的ASN.1 表示形式轉換成自己的內部形式,并顯示其值. 由于SNMP 報文對各個段都使用可變長度編碼,這就使得即便是從SNMP 報文中提取一簡單整數段,也要進行許多計算,因而,所開發的系統原碼程序中包含了一個語言較長、結構復雜的特殊句法分析程序,用于提取報文的各個段并進行譯碼,此句法分析軟件必須把一指針移遍報文中所有各段,以找出各段長度并提取其數值.
MIB訪問的主流程圖如下:
? ?? ?? ?? ?? ?? ?? ?? ???
4.3? ?? ?? ?? ???結合自己的開發經驗,列舉了訪問MIB的一個具體實現
以下介紹一個訪問MIB 庫中SysDescr變量的程序。該程序在Stratus 容錯機(BSD UNIX 4.3)上運行通過。讀者根據這個例子不難編寫對MIB 庫的其他變量的操作, 從而實現一個具體的網絡管理系統。
# include 〈stdio.h〉
# include 〈sys/types.h〉
# include 〈sys/socket.h〉
# include 〈netinet/in.h〉
# include 〈netdb.h〉
# define snmp_port 161 /* SNMP UDP 端口號*/
# define destaddress “192. 168. 1.16” /* 訪問目標機的IP 地址*/
struct??sockaddr_in??dest;
struct??hostent??*hp;
int sockfd;
register int i, n;
int fromlen;
int packsize= 43;
u_char sendpack [100 ]= {0x30, 0x37, 2, 1, 0, 4, 6, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63,0xa0, 0x26, 2, 4,0, 0, 0, 0, 2, 1, 0, 2, 1, 0, 0x30, 0x1c, 0x30,0x0c, 6, 8, 0x2b, 6, 1, 2, 1, 1, 1, 0, 5, 0};/* get_ request 報文編碼*/
u_char recvpack [150]; /* 收到get_ response 報文編碼*/
main( )
{
if ((hp=gethostbyname(destaddress))== 0)
{
printf (“unknown host”) ;
exit (1) ;
}
dest.sin_family= AF_INET;
dest.sin_port= htons(snmp_port) ;
memcpy((char*)&dest.sin_addr, (char*)hp->h_addr, hp->h_length) ;
if ((sockfd=socket(AF_INET, SOCK_ DGRAM , 17))?
{
printf (“can`t create udp socket”) ;
exit (1) ;
}
/* 以上生成udp 套接字*/
i= sendto (sockfd, sendpack, packsize, 0, (struct sockaddr* )&dest, sizeof (dest)) ;
if(i
{
printf (“sendto error”) ;
exit(1);
}
if (i!=packsize)
{
printf(“wrote %d bytes, return= %d”, packsize, i) ;
exit (1)
}
/* 發送udp 報文*/
puts (“receiving now ……”) ;
fromlen= sizeof(dest) ;
if ((n= recvfrom (sockfd, recvpack, sizeof ( recvpack) , 0, (struct sockaddr
*)&dest,&fromlen) )?
{
printf (“recv from error!”) ;
exit (1) ;
}
/* 接收udp 報文*/
for ( i= 0; i
printf (“%X”,recvpack) ;
close(sockfd) ;
}
五 結束語
? ?綜上所述,闡述了對MIB的存取實現,優點是考慮到命令模塊的可重用性,此方法而開發的網絡管理系統基模塊具備了發送網絡管理查詢請求到遠程設備的能力,實現了對動態管理數據的收集,只有很好的實現對MIB的存取,網絡管理系統才能更好的發揮作用,若對MIB 進行深入的分析,可以將其應用到流量監控、性能分析、訪問控制等重要的網絡管理功能。
參考文獻
1??Case,J., Fedor,M.Schoffstall,M , and J. Davin. A Simple Network??Management Protocol (SNMP). RFC 1157, SNM P Research, Performance Systems International, Performance Systems International, and? ?M IT Laboratory for Computer Science, May 1990
2??Rose M , and K.Mc Cloghrie. Structure and Identification of Management Information for TCP/IP- based internets RFC 1155, Performance Systems International, Hughes LAN Systems ,May 1990
3??M.Rose. Management Information Base for Net-work Management of TCP/IP-based internets :M IB-Ⅱ RFC 1158, Performance Systems International, May 1990
4??Conne??Xions , SMP/ SNMP Version 2 : the Evolution of??SNMP ,1992 ,6 (10) :3~5
5??岑賢道,安常青. 網絡管理協議及應用開發. 北京:清華大學出版社,1998
6??楊家海,任憲坤, 王沛瑜編. 網絡管理原理與實現技術.北京:清華大學出版社出版,2000
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/8048/showart_69066.html
?
?
?
| ? | |
| SNMP的MIB | |
?
| |
| 網友:linxh 發布于: 2007.07.01 00:16 (共有條評論)?查看評論?|?我要評論 | |
| ? | |
| 原文摘自:? ? ·?????? Get-Request 、Get-Next-Request與Get-Response ·?????? Set-Request ·?????? Trap
|
?
?
?
MIB文件簡單分析
AAC-MIB DEFINITIONS ::= BEGIN
****************************************************************************************************
??? MIB文件是以DEFINITIONS ::= BEGIN 開始,最后一行以END結束。
DEFINITIONS ::= BEGIN 前面是庫名稱,如這里的是AAC-MIB,這里庫名稱就像是一個系統中的
對象名,是唯一的!
****************************************************************************************************
??? IMPORTS
****************************************************************************************************
IMPORTS標識當前庫文件需要引入其它的類文件,編譯才不會出錯.引入格式為[對象]FROM[庫文件],像:
IpAddress
??? FROM RFC1155-SMI
MODULE-IDENTITY,OBJECT-TYPE
??? FROM SNMPv2-SMI
****************************************************************************************************
??? IpAddress???????????
???????????? FROM RFC1155-SMI
??????? MODULE-IDENTITY, OBJECT-TYPE?
??????????? FROM SNMPv2-SMI
??????? RowStatus,DisplayString
??????????? FROM SNMPv2-TC
??????? MODULE-COMPLIANCE, OBJECT-GROUP
??????????? FROM SNMPv2-CONF
--??????? EntryStatus
--??????????? FROM RMON-MIB
??????? dlink-common-mgmt??? FROM DLINK-ID-REC-MIB;
****************************************************************************************************
要引人的對象
****************************************************************************************************
swDlinkAACMIB MODULE-IDENTITY
??????? LAST-UPDATED "9911220000Z"
??????? ORGANIZATION "Working Group"
??????? CONTACT-INFO
??????????? " "
??????? DESCRIPTION
??????????? "The Link AAC module MIB."
??????? ::= { dlink-common-mgmt 5}
??? swAACCtrl OBJECT IDENTIFIER ::= { swDlinkAACMIB 1 }
-- -------------------------------------------------------------
-- Textual Conventions
-- -------------------------------------------------------------
??? swAACAuthenAdminState OBJECT-TYPE
??????? SYNTAX INTEGER {
??????????????????? other(1),
??????????????????? disabled(2),
??????????????????? enabled(3)
??????????????? }
??????? MAX-ACCESS read-write
??????? STATUS current
??????? DESCRIPTION
??????????? "This object indicates the Access Authentication is enable or
??????????? disable."
??????? ::= { swAACCtrl 1}???
???
****************************************************************************************************
引入文件標識結束后就是本類的對象節點描述.
節點描述格式為:
NODENAME NODETYPE
[DATA]
::={PARENT_NODENAME id}
NODENAME為當前節點的名稱,如sysDescs,這個名稱應該是唯一的;
NODETYPE為當前節點的類型,如MODULE-IDENTITY,OBJECT-TYPE等等;
DATA為節點的內容說明,包含數據類型,訪問模式,狀態,描述;
PARENT_NODENAME為當前節點的父節點,這個父節點可能在本類中,也可以要引用的外部類中;
id為當前節點在父類中的索引順序號.
****************************************************************************************************
END
****************************************************************************************************
最后一行以END結束
****************************************************************************************************
例子:
LOOGSON-MIB DEFINITIONS::=BEGIN
??? IMPORTS
??????? enterprises,OBJECT-TYPE,Integer32,TimeTicks
??????????? FROM SNMPv2-SMI
??????? OBJECT-GROUP, NOTIFICATION-GROUP
??????????? FROM SNMPv2-CONF
??????? TEXTUAL-CONVENTION, DisplayString
??????????? FROM SNMPv2-TC;
??? loogson OBJECT IDENTIFIER ::= { enterprises 29881 }
??? cq8401 OBJECT IDENTIFIER ::= { loogson 3 }
??? test??? OBJECT IDENTIFIER ::= { cq8401 1 }?
???
??? MachType OBJECT-TYPE
??????? SYNTAX OCTET STRING
??????? ACCESS read-only
??????? STATUS current
??????? DESCRIPTION "設備類型"
??????? ::={ test 1 }
END
總結
以上是生活随笔為你收集整理的基于SNMP的MIB库访问实现的研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用snmp4j实现Snmp功能(三)
- 下一篇: SNMP模型中,网管者、网管代理、网管协