孫 為
[摘要]首先論述簡單網絡管理協議SNMP的產生、發展及其管理機制,然后提出在SNMPv3的框架結構上實現代理進程的一種方案。
[關鍵詞]SNMP協議 管理模型 代理
中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)0310046-02
一、SNMP的產生
隨著現代網絡規模擴大化,結構的復雜化,早期網絡時代的人力管理已經無法勝任這一工作了,自動網絡管理工具由此而產生。
要有效地管理由不同廠家的產品構成的網絡系統,就要求各個網絡產品提供統一的管理接口,即遵循標準的網絡管理協議。目前國際上標準的網絡管理協議有兩個,一個是ISO于70年代末提出的CMIP,一個是IAB 80年代末提出SNMP。CMIP(公共管理信息協議)建立在OSI基礎上,它的協議大而全,需兼顧各個方面的要求,十分復雜,實現起來很困難,所以目前對其僅停留在研究階段。SNMP(簡單網絡管理協議)是IAB為管理基于TCP/IP的網絡而制定的網絡管理協議,于1990年4月被確定為Internet標準。它可以管理和監控任何形式的網絡設備,它的主要特點是簡單、實用、易擴展。目前絕大多數廠家都支持和應用SNMP,SNMP已成為事實上的網絡管理工業標準。
二、SNMP的發展
SNMP一共發展了3個主版本,分別為SNMPv1,SNMPv2和SNMPv3。SNMPv2又分為若干個子版本,其中SNMPv2c應用最為廣泛。
1990年5月,RFC1157出版,定義了SNMPv1。SNMPv1在90年代初得到了迅猛發展,但同時也暴露了明顯的不足,如在功能上難以實現大量的數據傳輸,在安全方面缺少身份鑒別和加密機制。
1993年發布的SNMPv2比SNMPv1有較大的進步,表現在支持分布式網絡管理、擴展了數據類型、可以實現大量數據的同時傳輸、增加了表的處理能力、加強了數據定義語言。
但是,SNMPv2并沒有完全實現預期的目標,尤其是安全性能沒有得到提高。1996年發布的SNMPv2c是SNMPv2的修改版本,功能有很大增強,但是安全性能仍沒有得到改善,繼續使用SNMPv1的基于共同體名的身份鑒別方式。
IETF SNMPv3工作組于1998年1月提出RFC2271-2275,正式形成SNMPv3。這一系列文件定義了包含SNMPv1、SNMPv2所有功能在內的體系框架和包含鑒別服務和加密服務在內的全新的安全特性,同時還規定了網絡安全和訪問控制規則。
三、SNMP的通訊機制
SNMP代理和管理站通過標準的SNMP協議報文進行異步通信,這些報文都是單個包。由此,SNMP使用UDP作為底層傳輸協議。UDP使用無連接服務,所以SNMP不需要在代理和管理站之間保持連接來傳輸消息。
(一)SNMP的通訊原語
SNMPv1中定義了五種通訊原語:GetRequest、GetResponse、GetNextRequest、SetRequest和Trap。SNMP管理站使用GetRequst請求被管設備的代理從設備中取特定OID的管理信息比如系統的名字,系統中網絡接口數,端口的流量等等。SNMP代理用GetResponse來響應管理站的請求。管理站用GetNextResponse指示讀取指定的OID所表示的被管理對象在MIB樹中按照字典順序的下一個被管理對象的管理信息的值,與GetResponse結合起來可以檢索表中的數據,瀏覽MIB樹。管理站用SetRequest通過代理來改變設備中的配置,用于配置管理的實現。Trap是SNMP代理發送給管理站的非請求消息,通知管理站發生了一個特殊事件[6]。例如:代理重啟、線路連接失敗或消息認證失敗等等。
SNMPv2中增加了GetBulkRequest的通訊原語,GetBulkRequest與GetNextResponse有相同的操作原則,也就是說,所選擇的總是按字典序的下一個對象實例。不同之處在于,使用GetBulkRequest可以指定選擇多個字典順序后繼。這樣,可使檢索大批管理信息所需的協議交換次數最少化。SNMPv2還增加了InformRequest通訊原語,此通訊原語用來負責管理者與管理者之間的通訊。
(二)SNMP報文格式
SNMP報文格式主要有兩部分構成,協議頭和SNMP協議數據單元。在不同的版本中協議頭不同。
1.SNMPv1的報文格式。
SNMPv1報文的協議頭由版本域和共同體域組成。其中版本域為version-1(0),共同體域是為增加系統的安全性而引入的,它的作用相當于口令(password)。agent可以要求manager在其發來的報文中填寫這一項,以驗證manager是否有權訪問它上面的MIB信息。community的缺點是沒有加密功能,由于是明碼傳送的,所以很容易被監聽者竊取。SNMPv2中改進了這一點。
SNMP協議數據單元是實際要傳送的數據,SNMPv1中有5種PDU,即對應5種協議操作,如圖2所示。其中GetRequest、GetNextRequest和SetRequest
的PDU的格式是一樣的,包括PDU類型,請求標識,錯誤狀態,差錯索引,變量綁定列表域(由多個變量綁定組成,每個變量綁定由對象標識符和對象得值組成),而Trap的PDU格式比較特殊,它由于包含的信息不同,結構上有所差別。

2.SNMPv2c的報文格式。
SNMPv2c在協議報文和PDU格式方面和SNMPv1大體一樣。不同的是SNMPv2的Trap報文和其他報文格式統一了,而且比v1版本增加了Inform、GetBulkRequest報文。這兩種報文除了GetBulkRequest報文中錯誤狀態和差錯索引處分別由Non-Repeaters(不重復個數)和Max-Repetitions(最大重復次數)所代替,其余部分和SNMPV1的報文一樣。SNMPV2的報文格式更加一致,這樣簡化了接收者的處理任務。
3.SNMPv3的報文格式。
SNMPv3在SNMPv2基礎之上增加了安全和管理機制,SNMPv3定義了一種全新的報文格式,協議頭增加了很多SNMPv3的安全參數,如圖3所示。
(三)SNMP報文的發送
一個SNMP實體按照以下步驟來傳送SNMP的5種報文的一種到另一個SNMP實體:
1.根據RFC1157中定義的ASN.1結構,構造SNMP的PDU;
2.將PDU連同源地址,目標地址,共同體名傳至鑒別服務,等待它進行加密,簽名等操作后的返回結果*;
3.在*前面加上協議頭,形成SNMP報文;
4.按照BER規范對3所形成的SNMP報文進行編碼,并傳遞給傳輸服務。
其中,step2只在SNMPV3版本中存在。
(四)SNMP報文的接收
一般,一個SNMP實體經過以下步驟接收一個SNMP報文:[3]
1.從傳輸層接收到報文編碼的字節流,按照BER規范進行解碼;
2.對該消息的基本句法進行檢查,如果報文沒有通過分析,就丟棄該報文;
3.檢查版本號,如果版本不兼容就丟棄該報文;
4.協議實體將安全參數,報文的PDU部分、以及源與目的傳輸地址傳遞給鑒別服務:如果認證成功,鑒別服務將按照ASN.1標準構造PDU返回給SNMP協議實體;如果鑒別失敗,鑒別服務觸發鑒別失敗的事件,SNMP協議實體產生鑒別失敗的Trap,并丟棄該報文;
5.協議實體將對鑒別成功的PDU進行ASN.1的句法檢查,如果失敗則丟棄此PDU。否則,按照版本號進行SNMP訪問控制檢查,若通過則對PDU進行相應處理,否則丟棄報文。
四、SNMP協議中代理進程的實現
為兼容SNMP的3個版本,按照SNMPv3的框架來實現代理進程,如圖4所示。
(一)代理進程的框架結構

SNMPv3中代理和管理者都稱作SNMP實體,每一個實體主要有兩個組件:SNMP引擎和一個或多個應用程序。
引擎與實體是一一對應關系,它包含四個組件:發送器、消息處理子系統、安全子系統和訪問控制子系統。其中發送器支持多個版本的SNMP消息同時存在,它的功能包括:發送和接受網絡中的SNMP消息;決定SNMP消息的版本并和符合相應版本的消息處理模型交互;和命令發生器應用程序進行PDU的交互。消息處理子系統是為傳輸和從接受到的消息中提取相關信息參數的準備模塊,它其中按照處理的消息的版本格式的不同分成了不同的子模塊。安全子系統提供了安全服務,其中包括加密和驗證。訪問控制子系統提供授權服務,它也可以有多個訪問控制模型。
代理實體中的應用程序有命令產生器應用程序,通知產生器應用程序等。
(二)代理進程的流程
代理進程的主要工作是響應管理者的請求,對設備的管理數據進行讀寫操作,然后把取得的信息以SNMP報文的形式反饋給管理者。代理進程的另一個工作就是當出現特殊事件的時候,向特定的管理端發送Trap。代理進程主要可由3個獨立的線程來實現:
1.代理主線程SnmpAgent,此線程用于啟動,運行,關閉代理進程。該線程啟動后,首先初始化系統配置,導入mib文件和xml文件(對象實例數據文件),并啟動以下其他兩個線程,讓其獨立運行。然后啟動發送器,從端口等待接收管理者發送過來的報文編碼字節流,然后解碼成Snmp的報文,并進行版本兼容的檢驗(不兼容直接丟棄),調用安全子系統,進行PDU的驗證加密(不成功丟棄報文,并發認證失敗的Trap),將獲得的可繼續處理的請求報文返回給主線程。主線程調用請求響應模塊,并將獲得的請求報文傳給它,請求響應模塊將對請求做出正確的響應過程,取得必要的管理信息,返回給主線程。主線程把取得的管理信息交給消息處理模塊,該模塊根據將信息封裝PDU并把響應PDU傳給命令產生器,最終封裝成響應報文,返回主線程。[7]主線程最后將響應報文傳給發送器發送給管理者。
2.Trap服務線程SnmpTrapService,此線程負責接收觸發Trap的事件,獲取封裝Trap報文的參數信息,然后將信息交給消息處理模塊。
3.數據收集線程SnmpDataCollect,此線程一方面要定時從設備接口程序中收集管理數據,并從內存更新到xml文件(xml文件在SnmpAgent線程啟動時已被導入到內存中的一棵樹),這樣,請求響應模塊在響應get或getNext操作時,直接從內存的xml樹中讀取所要求的對象實例的值。當處理set操作時,如果xml文件更新成功,則要發出通知給設備接口程序,以改變設備中的配置。
五、結束語
SNMP具有很多的優點,因此得到較廣泛的應用。但它安全性、多協議支持等,需要在今后版本中加以解決。隨著SNMP的新發展,在協議實現過程中,軟件的結構必須要利于各個版本的共存。
參考文獻:
[1]Mani Subramanian.Network Management:Principles and Practice,1st edition Copyright 2000.
[2]Mark A.Miller,用SNMP管理互聯網絡(第二版),中國水利水電出版社,2001.7.
[3]岑賢道、安常青,網絡管理協議及應用開發,清華大學出版社,1998.7.
[4]William Stallings,SNMP網絡管理(第一版),中國電力出版,2001.9.
[5]杜荔等,一種基于SNMP實現MIB庫多變量訪問的方法,東北大學學報(自然科學版),1998.8.
[6]高宏等,Internet網絡管理協議簡單網絡管理協議(SNMP),數據通信,1999.1.
[7]蔡皖東,SNMP網絡管理機制及其實現,微電子學與計算機,1999.1.
作者簡介:
孫為,男,助教,主要研究方向:網絡管理、協議工程學。