簡單網(wǎng)絡(luò)管理協(xié)議(SNMP:Simple Network Management Protocol)是由互聯(lián)網(wǎng)工程任務(wù)組(IETF:Internet Engineering Task Force )定義的一套網(wǎng)絡(luò)管理協(xié)議。該協(xié)議基于簡單網(wǎng)關(guān)監(jiān)視協(xié)議(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一個(gè)管理工作站可以遠(yuǎn)程管理所有支持這種協(xié)議的網(wǎng)絡(luò)設(shè)備,包括監(jiān)視網(wǎng)絡(luò)狀態(tài)、修改網(wǎng)絡(luò)設(shè)備配置、接收網(wǎng)絡(luò)事件警告等。雖然SNMP開始是面向基于IP的網(wǎng)絡(luò)管理,但作為一個(gè)工業(yè)標(biāo)準(zhǔn)也被成功用于電話網(wǎng)絡(luò)管理。
一套完整的SNMP系統(tǒng)主要包括管理信息庫(MIB)、管理信息結(jié)構(gòu)(SMI)及SNMP報(bào)文協(xié)議。
(1)管理信息庫MIB:任何一個(gè)被管理的資源都表示成一個(gè)對象,稱為被管理的對象。MIB是被管理對象的集合。它定義了被管理對象的一系列屬性:對象的名稱、對象的訪問權(quán)限和對象的數(shù)據(jù)類型等。每個(gè)SNMP設(shè)備(Agent)都有自己的MIB。MIB也可以看作是NMS(網(wǎng)管系統(tǒng))和Agent之間的溝通橋梁。它們之間的關(guān)系如圖1所示。
圖1 NMS Agent和MIB的關(guān)系
MIB文件中的變量使用的名字取自ISO和ITU管理的對象標(biāo)識符(object identifier)名字空間。它是一種分級樹的結(jié)構(gòu)。如圖2所示,第一級有三個(gè)節(jié)點(diǎn):ccitt、iso、iso-ccitt。低級的對象ID分別由相關(guān)組織分配。一個(gè)特定對象的標(biāo)識符可通過由根到該對象的路徑獲得。一般網(wǎng)絡(luò)設(shè)備取iso節(jié)點(diǎn)下的對象內(nèi)容。如名字空間ip結(jié)點(diǎn)下一個(gè)名字為ipInReceives的MIB變量被指派數(shù)字值3,因而該變量的名字為:
iso.org.dod.internet.mgmt.mib.ip.ipInReceives
相應(yīng)的數(shù)字表示(對象標(biāo)識符OID,唯一標(biāo)識一個(gè)MIB對象)為:
1.3.6.1.2.1.4.3
圖2 MIB樹結(jié)構(gòu)
當(dāng)網(wǎng)絡(luò)管理協(xié)議在報(bào)文中使用MIB變量時(shí),每個(gè)變量名后還要加一個(gè)后綴,以作為該變量的一個(gè)實(shí)例。如ipInReceives的實(shí)例數(shù)字表示為:1.3.6.1.2.1.4.3.0.
需要注意的是,MIB中的管理對象的OID有些需要動態(tài)確定,如IP路由表,為了指明地址202.120.86.71的下一站路由(next hop),我們可以引用這樣的實(shí)例:
iso.org.dod.internet.mgmt.mib.ip. ipRouteTable.ipRouteEntry.ipRouteNextHop.202.120.86.71, 相應(yīng)的數(shù)字表示為:1.3.6.1.2.1.4.21.1.7.202.120.86.71
對于這種動態(tài)對象標(biāo)識的實(shí)例,由于無法轉(zhuǎn)換為預(yù)先指定的Readkey名稱,與飛鄰的產(chǎn)品架構(gòu)沖突(需要動態(tài)生成可變Readkey),暫不考慮支持。
(2)管理信息結(jié)構(gòu)(SMI)
SMI定義了SNMP框架所用信息的組織、組成和標(biāo)識,它還為描述MIB對象和描述協(xié)議怎樣交換信息奠定了基礎(chǔ)。
SMI定義的數(shù)據(jù)類型:
◆ 簡單類型(simple)
Integer:整型是-2,147,483,648~2,147,483,647的有符號整數(shù)
octet string: 字符串是0~65535個(gè)字節(jié)的有序序列
OBJECT IDENTIFIER: 來自按照ASN.1規(guī)則分配的對象標(biāo)識符集
◆ 簡單結(jié)構(gòu)類型(simple-constructed)
SEQUENCE 用于列表。這一數(shù)據(jù)類型與大多數(shù)程序設(shè)計(jì)語言中的“structure”類似。一個(gè)SEQUENCE包括0個(gè)或更多元素,每一個(gè)元素又是另一個(gè)ASN.1數(shù)據(jù)類型
SEQUENCE OF type 用于表格。這一數(shù)據(jù)類型與大多數(shù)程序設(shè)計(jì)語言中的“array”類似。一個(gè)表格包括0個(gè)或更多元素,每一個(gè)元素又是另一個(gè)ASN.1數(shù)據(jù)類型。
◆ 應(yīng)用類型(application-wide)
IpAddress: 以網(wǎng)絡(luò)序表示的IP地址。因?yàn)樗且粋€(gè)32位的值,所以定義為4個(gè)字節(jié);
counter:計(jì)數(shù)器是一個(gè)非負(fù)的整數(shù),它遞增至最大值,而后回零。在SNMPv1中定義的計(jì)數(shù)器是32位的,即最大值為4,294,967,295;
Gauge :也是一個(gè)非負(fù)整數(shù),它可以遞增或遞減,但達(dá)到最大值時(shí)保持在最大值,最大值為232-1;
time ticks:是一個(gè)時(shí)間單位,表示以0.01秒為單位計(jì)算的時(shí)間;
SNMP報(bào)文
SNMP報(bào)文結(jié)構(gòu)如下:(編碼之前)
SNMP共有5種報(bào)文,所以其PDU也有5中,第七點(diǎn)會詳細(xì)介紹SNMP的5種協(xié)議數(shù)據(jù)單元。
1、SNMP的5種協(xié)議數(shù)據(jù)單元
SNMP規(guī)定了5種協(xié)議數(shù)據(jù)單元PDU(也就是SNMP報(bào)文),用來在管理進(jìn)程和代理之間的交換。
get-request操作:從代理進(jìn)程處提取一個(gè)或多個(gè)參數(shù)值。
get-next-request操作:從代理進(jìn)程處提取緊跟當(dāng)前參數(shù)值的下一個(gè)參數(shù)值。
set-request操作:設(shè)置代理進(jìn)程的一個(gè)或多個(gè)參數(shù)值。
get-response操作:返回的一個(gè)或多個(gè)參數(shù)值。這個(gè)操作是由代理進(jìn)程發(fā)出的,它是前面三種操作的響應(yīng)操作。trap操作:代理進(jìn)程主動發(fā)出的報(bào)文,通知管理進(jìn)程有某些事情發(fā)生。
前面的3種操作是由管理進(jìn)程向代理進(jìn)程發(fā)出的,后面的2個(gè)操作是代理進(jìn)程發(fā)給管理進(jìn)程的,為了簡化起見,前面3個(gè)操作今后叫做get、get-next和set操作。圖1描述了SNMP的這5種報(bào)文操作。請注意,在代理進(jìn)程端是用熟知端口161倆接收get或set報(bào)文,而在管理進(jìn)程端是用熟知端口162來接收trap報(bào)文。
圖2是封裝成UDP數(shù)據(jù)報(bào)的5種操作的SNMP報(bào)文格式。可見一個(gè)SNMP報(bào)文共有三個(gè)部分組成,即公共SNMP首部、get/set首部、trap首部、變量綁定。
(1)公共SNMP首部
共三個(gè)字段:
? 版本
寫入版本字段的是版本號減1,對于SNMP(即SNMPV1)則應(yīng)寫入0。
? 共同體(community)
共同體就是一個(gè)字符串,作為管理進(jìn)程和代理進(jìn)程之間的明文口令,常用的是6個(gè)字符“public”。
? PDU類型
根據(jù)PDU的類型,填入0~4中的一個(gè)數(shù)字,其對應(yīng)關(guān)系如表2所示意圖。
表2 PDU類型
(2)get/set首部
? 請求標(biāo)識符(request ID)
這是由管理進(jìn)程設(shè)置的一個(gè)整數(shù)值。代理進(jìn)程在發(fā)送get-response報(bào)文時(shí)也要返回此請求標(biāo)識符。管理進(jìn)程可同時(shí)向許多代理發(fā)出get報(bào)文,這些報(bào)文都使用UDP傳送,先發(fā)送的有可能后到達(dá)。設(shè)置了請求標(biāo)識符可使管理進(jìn)程能夠識別返回的響應(yīng)報(bào)文對于哪一個(gè)請求報(bào)文
? 差錯(cuò)狀態(tài)(error status)
由代理進(jìn)程回答時(shí)填入0~5中的一個(gè)數(shù)字,見表3的描述
表3 差錯(cuò)狀態(tài)描述
? 差錯(cuò)索引(error index)
當(dāng)出現(xiàn)noSuchName、badValue或readOnly的差錯(cuò)時(shí),由代理進(jìn)程在回答時(shí)設(shè)置的一個(gè)整數(shù),它指明有差錯(cuò)的變量在變量列表中的偏移。
(3)trap首部
? 企業(yè)(enterprise)
填入trap報(bào)文的網(wǎng)絡(luò)設(shè)備的對象標(biāo)識符。此對象標(biāo)識符肯定是在圖3的對象命名樹上的enterprise結(jié)點(diǎn){1.3.6.1.4.1}下面的一棵子樹上。
? trap類型
此字段正式的名稱是generic-trap,共分為表4中的7種。
當(dāng)使用上述類型2、3、5時(shí),在報(bào)文后面變量部分的第一個(gè)變量應(yīng)標(biāo)識響應(yīng)的接口。
? 特定代碼(specific-code)
指明代理自定義的時(shí)間(若trap類型為6),否則為0。
? 時(shí)間戳(timestamp)
指明自代理進(jìn)程初始化到trap報(bào)告的事件發(fā)生所經(jīng)歷的時(shí)間,單位為10ms。例如時(shí)間戳為1908表明在代理初始化后1908ms發(fā)生了該時(shí)間。
(4)變量綁定(variable-bindings)
指明一個(gè)或多個(gè)變量的名和對應(yīng)的值。在get或get-next報(bào)文中,變量的值應(yīng)忽略。
管理變量的表示
管理變量表示管理對象類型在某一時(shí)刻的值(或稱該類型的實(shí)例),SNMP以管理變量作為操作對象。
管理變量的表示方法是這樣規(guī)定的:形如x.y,其中x是管理對象的object identifer。y是能唯一確定對象類型值的一組數(shù)字,在非表型變量中為0,在表型變量中是這個(gè)表的索引,比如接口表中的接口號,或路由表中的目的網(wǎng)絡(luò)地址等等 。如:在MIB文件里定義了ipAdEntNetMask這一管理對象,其object identifier為1.3.6.1.1.5.6.1.3它是個(gè)路由表中的一項(xiàng),它的一個(gè)實(shí)例就是路由表中某一行的子網(wǎng)掩碼,如果這行的索引、目的網(wǎng)絡(luò)地址為129.102.1.0。則這個(gè)變量名是:1.3.6.1.1.5.6.1.3.129.102.1.0。在以后的說明中,為了方便,把唯一確定管理變量的一組數(shù)字,也就是x.y中的y稱作實(shí)例。
SNMP的運(yùn)行過程
駐留在被管設(shè)備上的AGENT從UDP端口161接受來自網(wǎng)管站的串行化報(bào)文,經(jīng)解碼、團(tuán)體名驗(yàn)證、分析得到管理變量在MIB樹中對應(yīng)的節(jié)點(diǎn),從相應(yīng)的模塊中得到管理變量的值,再形成響應(yīng)報(bào)文,編碼發(fā)送回網(wǎng)管站。網(wǎng)管站得到響應(yīng)報(bào)文后,再經(jīng)同樣的處理,最終顯示結(jié)果。
下面根據(jù)RFC1157詳細(xì)介紹Agent接受到報(bào)文后采取的動作:
首先解碼生成用內(nèi)部數(shù)據(jù)結(jié)構(gòu)表示的報(bào)文,解碼依據(jù)ASN.1的基本編碼規(guī)則,如果在此過程中出現(xiàn)錯(cuò)誤導(dǎo)致解碼失敗則丟棄該報(bào)文,不做進(jìn)一步處理。
第二步:將報(bào)文中的版本號取出,如果與本Agent支持的SNMP版本不一致,則丟棄該報(bào)文,不做進(jìn)一步處理。當(dāng)前北研的數(shù)據(jù)通信產(chǎn)品只支持SNMP版本1。
第三步:將報(bào)文中的團(tuán)體名取出,此團(tuán)體名由發(fā)出請求的網(wǎng)管站填寫。如與本設(shè)備認(rèn)可的團(tuán)體名不符,則丟棄該報(bào)文,不做進(jìn)一步處理,同時(shí)產(chǎn)生一個(gè)陷阱報(bào)文。SNMPv1只提供了較弱的安全措施,在版本3中這一功能將大大加強(qiáng)。
第四步:從通過驗(yàn)證的ASN.1對象中提出協(xié)議數(shù)據(jù)單元PDU,如果失敗,丟棄報(bào)文,不做進(jìn)一不處理。否則處理PDU,結(jié)果將產(chǎn)生一個(gè)報(bào)文,該報(bào)文的發(fā)送目的地址應(yīng)同收到報(bào)文的源地址一致。
根據(jù)不同的PDU,SNMP協(xié)議實(shí)體將做不同的處理:
1.1、GetRequest PDU
第一種情況:如果PDU中的變量名在本地維護(hù)的MIB樹中不存在,則接受到這個(gè)PDU的協(xié)議實(shí)體將向發(fā)出者發(fā)送一個(gè)GetResponse報(bào)文,其中的PDU與源PDU只有一點(diǎn)不同:將ERROR-STATUS置為noSuchName,并在ERROR-INDEX中指出產(chǎn)生該變量在變量LIST中的位置。
第二種情況:如果本地協(xié)議實(shí)體將產(chǎn)生的響應(yīng)報(bào)文的長度大于本地長度限制,將向該P(yáng)DU的發(fā)出者發(fā)送一個(gè)GetResponse報(bào)文,該P(yáng)DU除了ERROR-STATUS置為tooBig,ERROR-INDEX置為0以外,與源PDU相同。
第三種情況:如果本地協(xié)議實(shí)體因?yàn)槠渌虿荒墚a(chǎn)生正確的響應(yīng)報(bào)文,將向該P(yáng)DU的發(fā)出者發(fā)送一個(gè)GetResponse報(bào)文,該P(yáng)DU除了ERROR-STATUS置為genErr,ERROR-INDEX置為出錯(cuò)變量在變量LIST中的位置,其余與源PDU相同。
第四中情況:如果上面的情況都沒有發(fā)生,則本地協(xié)議實(shí)體向該P(yáng)DU的發(fā)出者發(fā)送一個(gè)GetResponse報(bào)文,該P(yáng)DU中將包含變量名和相應(yīng)值的對偶表,ERROR-STATUS為noError,ERROR-INDEX為0,request-id域的值應(yīng)與收到PDU的request-id相同。
1.2、GetNextRequest PDU
GetNextRequest PDU的最重要的功能是表的遍歷,這種操作受到了前面所說的管理變量的表示方法的支持,從而可以訪問一組相關(guān)的變量,就好象他們在一個(gè)表內(nèi)。
下面通過一個(gè)例子解釋表遍歷的過程:
被管設(shè)備維護(hù)如下路由表:
Destination NextHop Metric
10.0.0.99 89.1.1.42 5
9.1.2.3 99.0.0.3 3
10.0.0.51 89.1.1.42 5
假設(shè)網(wǎng)管站欲取得這張路由表的信息,該表的索引是目的網(wǎng)絡(luò)地址。
網(wǎng)管站向被管設(shè)備發(fā)送一個(gè)GetNextRequest PDU,其中的受管對象的標(biāo)識如下
GetNextRequest ( ipRouteDest, ipRouteNextHop, ipRouteMetric1 )
SNMP agent響應(yīng)如下GetResponse PDU:
GetResponse (( ipRouteDest.9.1.2.3 = “9.1.2.3” ),
( ipRouteNextHop.9.1.2.3 = “99.0.0.3” ),
( ipRouteMetric1.9.1.2.3 = 3 ))
網(wǎng)管站繼續(xù):
GetNextRequest ( ipRouteDest.9.1.2.3,
ipRouteNextHop.9.1.2.3,
ipRouteMetric1.9.1.2.3 )
agent響應(yīng):
GetResponse (( ipRouteDest.10.0.0.51 = “10.0.0.51” ),
( ipRouteNextHop.10.0.0.51 = “89.1.1.42” ),
( ipRouteMetric1.10.0.0.51 = 5 ))
值得注意的是agent必須能夠確定下一個(gè)管理變量名,以保證所有變量能被取到且只被取到一次。
網(wǎng)管站繼續(xù):
GetNextRequest ( ipRouteDest.10.0.0.51,
ipRouteNextHop.10.0.0.51,
ipRouteMetric1.10.0.0.51 )
agent 響應(yīng):
GetResponse (( ipRouteDest.10.0.0.99 = “10.0.0.99” ),
( ipRouteNextHop.10.0.0.99 = “89.1.1.42” ),
( ipRouteMetric1.10.0.0.99 = 5 ))
網(wǎng)管站繼續(xù)
GetNextRequest ( ipRouteDest.10.0.0.99,
ipRouteNextHop.10.0.0.99,
ipRouteMetric1.10.0.0.99 )
這時(shí)因?yàn)槁酚杀碇兴械男卸急蝗”椋琣gent因返回路由表對象的下一字典后繼即該管理對象在MIB樹中的后序遍歷的直接后繼。這里應(yīng)是nettoMediaIndex,管理對象的OBJECT IDENTIFIER。這個(gè)響應(yīng)通知網(wǎng)管站對表的遍歷已經(jīng)完成。
1.3、GetResponse PDU
GetResponse PDU只有當(dāng)受到getRequest GetNextRequest SetRequest才由協(xié)議實(shí)體產(chǎn)生,網(wǎng)管站收到這個(gè)PDU后,應(yīng)顯示其結(jié)果。
1.4、SetRequest PDU
SetRequest PDU除了PDU類型標(biāo)識以外,和GetRequest相同,當(dāng)需要對被管變量進(jìn)行寫操作時(shí),網(wǎng)管站側(cè)的協(xié)議實(shí)體將生成該P(yáng)DU。
對SetRequest的響應(yīng)將根據(jù)下面情況分別處理:
如果是關(guān)于一個(gè)只讀變量的設(shè)置請求,則收到該P(yáng)DU的協(xié)議實(shí)體產(chǎn)生一個(gè)GetReponse報(bào)文,并置error status為noSuchName, error index的值是錯(cuò)誤變量在變量list中的位置。
如果被管設(shè)備上的協(xié)議實(shí)體收到的PDU中的變量對偶中的值,類型、長度不符和要求,則收到該P(yáng)DU的協(xié)議實(shí)體產(chǎn)生一個(gè)GetReponse報(bào)文,并置error status為badValue, error index的值是錯(cuò)誤變量在變量list中的位置。
如果需要產(chǎn)生的GetReponse報(bào)文長度超過了本地限制,則收到該P(yáng)DU的協(xié)議實(shí)體產(chǎn)生一個(gè)GetReponse報(bào)文,并置error status為tooBig, error index的值是0。
如果是其他原因?qū)е耂ET失敗,則收到該P(yáng)DU的協(xié)議實(shí)體產(chǎn)生一個(gè)GetReponse報(bào)文,并置error status為genErr, error index的值是錯(cuò)誤變量在變量list中的位置。
如果不符合上面任何情況,則agent將把管理變量設(shè)置收到的PDU中的相應(yīng)值,這往往可以改變被管設(shè)備的運(yùn)行狀態(tài)。同時(shí)產(chǎn)生一個(gè)GetResponse PDU,其中error status置為noError,error index的值為0。
1.5、Trap PDU
Trap PDU的有如下的形式
Trap是被管設(shè)備遇到緊急情況時(shí)主動向網(wǎng)管站發(fā)送的消息。網(wǎng)管站收到trap PDU后要將起變量對偶表中的內(nèi)容顯示出來。一些常用的trap類型有冷、熱啟動,鏈路狀態(tài)發(fā)生變化等。
評論
查看更多