文檔
設計
與名稱所指明的意思相反,SNMP不僅僅是用於管理數據的協議。隨着時間的推移,它已經變得比最初的設計者們所計劃的要複雜得多。
術語和實體
網絡管理領域中,每個組件都有自己特定的術語,因此,我們也將在這裏採用這些術語。有意思的是,“管理”這個詞被過度使用。
網絡管理體系結構中有三個主要組件:管理實體、被管理實體和網絡管理協議。
- 管理實體是在集中式網絡管理站(NMS)中運行的應用程序。管理實體控制着網絡管理信息的收集、處理、分析和展示。它發出控制網絡的行爲命令並且與網絡管理員交互。
- 被管理實體是存在於此網絡中的硬件或者軟件。被管理實體枚舉並格式化自己的一些屬性和狀態,使管理實體可以使用它們,這個很重要。例如,被管理實體可以是主機、路由器、交換機、打印機或者其他設備。
- 網絡管理協議在管理實體和被管理實體之間起作用,允許管理實體查詢被管理實體的狀態並通過agent執行一些操作。
結構和組件
SNMP由以下四部分組成:
- 網絡管理對象的定義,也被稱爲MIB objects。管理信息表示爲管理對象的集合,這些對象組成一個虛擬的信息存儲,被稱爲管理信息庫(MIB)。一個MIB對象可能是一個計數器、描述性的信息(軟件版本)、狀態信息、協議特定信息(如到目的地的路由路徑)。因此,MIB objects定義由受管節點維護的管理信息。相關的MIB對象被收集到所謂的MIB模塊中。
- 數據定義 語言,也叫SMI(管理信息結構),引入了基本數據類型,允許創建它們的子類型和更復雜的數據結構。MIB對象用這種數據定義語言表示。
- SNMP協議用來在管理和被管理實體間傳達信息和命令。SNMP是C/S模型。有趣的是,管理和被管理實體上都有客戶端和服務端組件,哈哈哈哈。
- 可擴展的安全框架和系統管理功能。
SNMPv3之前的版本沒有後一種特性。
數據類型
SMI引入了11種用於表示託管對象的基礎數據類型。
它們是純ASN.1類型或者定製化類型。純ASN.1類型有:
- Integer
- Octet String
- Object Identifier
ASN.1是一個古老並且複雜的標準,它通過可移植的方式處理數據的結構化和序列化。
基於ASN.1的SNMP定製子類型:
- Integer32/Unsigned32 - 32位整型
- Counter32/Counter64 - 可增長數
- Guage32 - 未包裝的31位整型
- TimeTicks - 事件發生後的時間
- Opaque - uninterpreted ANS.1 string
在這些標量類型之外,SNMP還定義了一種將它們放到有序數組中的方法。通過這些數組可以構建二維表。
PySNMP依賴PyASN.1來創建SNMP的類型。在PyASN.1中,ASN.1類型的實例由看起來像字符串或整數的Python對象表示。
我們可以將PyASN1對象與Python類型相互轉換。PyASN1可以參與基本算術運算或字符串連接等操作。所有SNMP基礎類型都是不可變的,就像它們對應的Python類型一樣。
>>> from pyasn1.type.univ import *
>>> Integer(21) * 2
Integer(42)
>>> Integer(-1) + Integer(1)
Integer(0)
>>> int(Integer(42))
42
>>> OctetString('Hello') + ', ' +
>>> OctetString(hexValue='5079534e4d5021')
OctetString('Hello, PySNMP!')
在向PySNMP發數據或從PySNMP接收數據時,PySNMP的用戶可能會遇到PyASN1類和對象。
稍後我們將更詳細地討論Object Indentifier這一數據類型,它用於命名一個對象。在本系統中,對象以分層分層分層的方式進行identified。
Object Identifier
OIDs被廣泛地應用來identifying標識對象。這個標識系統可以描述爲一棵樹,其節點由不同的組織、知識領域、對象的概念或類型、對象具體的實例 來分配。以開發人員的角度看,OID是一長串由點分割的數字,來編碼對應的節點。
樹的每個分支都有一個數字和名稱,從樹的頂部到你感興趣的點的完整路徑構成該點的名稱。這個完整的路徑就是OID,也叫identifier of an object。樹頂周圍的點具有普遍性。
頂級OIDs對應不同的標準組織。供應商爲自己的產品和託管對象定義私有分支。
在這個分層結構的頂端是國際標準化組織(ISO)和國際電信標準化部門。
ITU-T電信聯盟 是上面兩個組織共同努力的分支。
在PyASN1模型中,OID看起來像一個不可變的數字序列。與Python 元組一樣,PyASN1 OID可以被分割或連接。切割子串返回一個sub-OID。
>>> from pyasn1.type.univ import *
>>> internetId = ObjectIdentifier((1, 3, 6, 1))
>>> internetId
ObjectIdentifier('1.3.6.1')
>>> internetId[2]
6
>>> [ x for x in internetId ]
[1, 3, 6, 1]
>>> internetId + (2,)
ObjectIdentifier('1.3.6.1.2')
>>> internetId[1:3]
ObjectIdentifier('3.6')
>>> internetId[1] = 2
...
TypeError: object does not support item assignment
對象集合
可以將管理信息庫(MIB)視爲相關託管對象集合的正式描述,這些對象的值共同反映了某個託管實體中某些子系統的當前狀態。
這些值可以通過向託管節點的代理髮送SNMP消息,讓其執行,來查詢、修改,或者向管理實體報告。
比如,典型的對象,監控打印機上不同墨盒的狀態和可能打印文件袋 數量,再如,交換機上進出的流量以及丟包率或者廣播包數量。
每個託管設備都有一個存放 MIB中鍵對應值的數據庫,所以,可用數據實際上並不依賴數據庫,而是依賴於實現。重要的是,你得知道MIB不包含實際數據,只是定義數據模式,有點像數據庫模式。
爲了正確地組織MIB模塊和對象,所有產品的所有可管理特性都安排在這個MIB樹的結構中。每個MIB模塊和對象都由一個OID唯一標識。
SNMP的管理實體和託管實體都可以使用MIB信息。
- 管理對象
- 通過MIB對象名稱查詢OID
- 將值轉換爲對應類型的MIB對象
- humans read comments left by other humans
- managed entity
- 用代碼實現MIB對象
從人類的角度看,MIB是一個ASN.1語言的子集語言編寫的文本文件。我們維護了一個9000+行的MIB模塊得到即刻,你可以將它應用在子集的項目中。
- 用代碼實現MIB對象
PySNMP將ASN.1 MIB文件轉換成Python模塊,然後SNMP引擎在運行時按需加載這些模塊。PySNMP MIB 模塊是通用的——相同的模塊可以被管理實體和託管實體使用。
MIB轉換由PySNMP自動執行,但是從技術上講,它是由PySNMP的兄弟項目PySMI來處理的。。但是,你也可以使用PySMI的mibdump.py工具手動執行上述轉換。
協議操作
SNMP是c/s模型的,管理和托實體組件都包含客戶端和服務器組件。客戶端和服務器都以name-value的形式交換數據。value是強類型的。
SNMP協議的核心就是協調SNMP所有組件工作的引擎啊!!!
協議定義了兩種操作模式:
- Request-preponse messages 請求-響應消息
- Unsolicited messages 未響應消息
協議攜帶了SNMP消息。除了用於協議操作的頭信息外,管理信息還通過所謂的協議數據單元PDU來傳輸。SNMP尋址中定義了其中PDU類型,它們在概念上不同,由管理實體或託管實體分別執行。
- Manager-to-agent
- GetRequest, SetRequest, GetNextRequest, GetBulkRequest, InformRequest
- Manager-to-manager
- InformRequest, Response
- Agent-to-manager
- SNMPv2-Trap, Response
核心應用
RFC3413定義了一些標準的SNMP應用。
PySNMP嚴格遵循RFCs及其抽象服務接口 來實現這些標準應用程序(通過本機SNMP API)。
這種方法的缺點是對於大多數SNMP任務來說過於詳細和冗長。爲了使SNMP易於使用,PySNMP引入了高級SNMP API——High-level SNMP API.