摘要 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 | 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)) < 0)
{
printf (“can`t create udp socket”) ;
exit (1) ;
}
/* 以上生成udp 套接字*/
i= sendto (sockfd, sendpack, packsize, 0, (struct sockaddr* )&dest, sizeof (dest)) ;
if(i<0)
{
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) ) < 0)
{
printf (“recv from error!”) ;
exit (1) ;
}
/* 接收udp 封包*/
for ( i= 0; i< n; i+ + )
printf (“%X”,recvpack[i]) ;
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