簡單網絡管理協議(SNMP)是TCP/IP協議簇的一個應用層協議。服務器
在1988年被制定,並被Internet體系結構委員會(IAB)採納做爲一個短時間的網絡管理解決方案;因爲SNMP的簡單性,在Internet時代獲得了蓬勃的發展,1992年發佈了SNMPv2版本,以加強SNMPv1的安全性和功能。如今,已經有了SNMPv3版本。網絡
SNMPv1提供最小限度的網絡管理功能,採用團體名認證。數據結構
!!團體名的做用相似於密碼,用來限制NMS對Agent的訪問。
複製代碼
若是 SNMP 報文攜帶的團體名沒有獲得 NMS/Agent 的承認,該報文將被丟棄。app
SNMPV1 是一種簡單的請求/響應協議。網絡管理系統發出一個請求,管理器則返回一個響應。這一行爲的實現是經過使用四種協議操做中的其中任一種完成的。這四種操做分別是框架
在兼容 SNMPv1 的同時又擴充了 SNMPv1 的功能:ide
SNMPv3主要在安全性方面進行了加強,它採用了新的模型:編碼
USM 提供了認證和加密功能,VACM 肯定用戶是否容許訪問特定的 MIB 對象以及訪問方式。加密
一套完整的SNMP系統主要包括管理信息庫(MIB)、管理信息結構(SMI)及SNMP報文協議。spa
任何一個被管理的資源都表示成一個對象,MIB是被管理對象的集合。它定義了被管理對象的一系列屬性:
每一個SNMP設備(Agent)都有本身的MIB。
MIB文件中的變量使用的名字取自ISO和ITU管理的對象標識符(object identifier)名字空間。它是一種分級樹的結構。如圖2所示,第一級有三個節點:ccitt、iso、iso-ccitt。低級的對象ID分別由相關組織分配。一個特定對象的標識符可經過由根到該對象的路徑得到。通常網絡設備取iso節點下的對象內容。如名字空間ip結點下一個名字爲ipInReceives的MIB變量被指派數字值3,於是該變量的名字爲:
iso.org.dod.internet.mgmt.mib.ip.ipInReceives
複製代碼
相應的數字表示(對象標識符OID,惟一標識一個MIB對象)爲:
1.3.6.1.2.1.4.3
複製代碼
當網絡管理協議在報文中使用MIB變量時,每一個變量名後還要加一個後綴,以做爲該變量的一個實例。如ipInReceives的實例數字表示爲:1.3.6.1.2.1.4.3.0.
須要注意的是,MIB中的管理對象的OID有些須要動態肯定,如IP路由表,爲了指明地址202.120.86.71的下一站路由(next hop),咱們能夠引用這樣的實例:
iso.org.dod.internet.mgmt.mib.ip. ipRouteTable.ipRouteEntry.ipRouteNextHop.202.120.86.71, 相應的數字表示爲:1.3.6.1.2.1.4.21.1.7.202.120.86.71
SMI定義了SNMP框架所用信息的組織、組成和標識,它還爲描述MIB對象和描述協議怎樣交換信息奠基了基礎。
SMI定義的數據類型:
Integer:整型是-2,147,483,648~2,147,483,647的有符號整數
octet string: 字符串是0~65535個字節的有序序列
OBJECT IDENTIFIER: 來自按照ASN.1規則分配的對象標識符集
SEQUENCE用於列表。這一數據類型與大多數程序設計語言中的「structure」相似。一個SEQUENCE包括0個或更多元素,每個元素又是另外一個ASN.1數據類型
SEQUENCE OF type 用於表格。這一數據類型與大多數程序設計語言中的「array」相似。一個表格包括0個或更多元素,每個元素又是另外一個ASN.1數據類型。
IpAddress:以網絡序表示的IP地址。由於它是一個32位的值,因此定義爲4個字節;
counter: 計數器是一個非負的整數,它遞增至最大值,然後回零。在SNMPv1中定義的計數器是32位的,即最大值爲4,294,967,295;
Gauge:也是一個非負整數,它能夠遞增或遞減,但達到最大值時保持在最大值,最大值爲232-1; time ticks:是一個時間單位,表示以0.01秒爲單位計算的時間;
SNMP報文結構以下:
版本號+ 團體名 + 協議數據單元PDU
複製代碼
SNMP共有5種報文,因此其PDU也有5種。
SNMP中定義了五種消息類型:Get-Request、Get-Response、Get-Next-Request、Set-Request和Trap。
(1)Get-Request 、Get-Next-Request與Get-Response
SNMP Manager使用 Get-Request消息從擁有SNMP代理的網絡設備中檢索信息,而SNMP代理則用Get-Response消息響應。Get-Next-Request用於和Get-Request組合起來查詢特定的表對象中的列元素。
(2)Set-Request
SNMP管理站用Set-Request 能夠對網絡設備進行遠程配置(包括設備名、設備屬性、刪除設備或使某一個設備屬性有效/無效等)。
(3)Trap
SNMP代理使用Trap向SNMP管理站發送非請求消息,通常用於描述某一事件的發生,如接口UP/DOWN,IP地址更改等。
上面五種消息中Get-Request、Get-Next-Request和Set-Request是由管理站發送到代理側的161端口的;後面兩種Get-Response和Trap 是由代理進程發給管理進程的,其中Trap消息被髮送到管理進程的162端口,全部數據都是走UDP封裝。SNMP工做流程如圖2:
下圖是封裝成UDP數據報的5種操做的SNMP報文格式。可見一個SNMP報文共有三個部分組成,即公共SNMP首部、get/set首部、trap首部、變量綁定。
(1)公共SNMP首部 共三個字段: 版本。寫入版本字段的是版本號減1,對於SNMP(即SNMPV1)則應寫入0。 共同體(community)。共同體就是一個字符串,做爲管理進程和代理進程之間的明文口令,經常使用的是6個字符「public」。 PDU類型。根據PDU的類型,填入0~4中的一個數字,其對應關係如表2所示意圖。
表2 PDU類型
PDU類型 名稱
0 get-request
1 get-next-request
2 get-response
3 set-request
4 trap
複製代碼
(2)get/set首部
請求標識符(request ID) 這是由管理進程設置的一個整數值。代理進程在發送get-response報文時也要返回此請求標識符。管理進程可同時向許多代理髮出get報文,這些報文都使用UDP傳送,先發送的有可能後到達。設置了請求標識符可以使管理進程可以識別返回的響應報文對於哪個
由代理進程回答時填入0~5中的一個數字
差錯狀態 名字 說明
0 noError 一切正常
1 tooBig 代理沒法將回答裝入到一個SNMP報文之中
2 noSuchName 操做指明瞭一個不存在的變量
3 badValue 一個set操做指明瞭一個無效值或無效語法
4 readOnly 管理進程試圖修改一個只讀變量
5 genErr 某些其餘的差錯
複製代碼
企業(enterprise) 填入trap報文的網絡設備的對象標識符。此對象標識符確定是在圖3的對象命名樹上的enterprise結點{1.3.6.1.4.1}下面的一棵子樹上。
代理地址
即代理進程所在系統的地址。
trap類型
此字段正式的名稱是generic-trap,共分爲表4中的7種。
trap類型 | 名字 | 說明 |
---|---|---|
0 | coldStart | 代理進行了初始化 |
1 | warmStart | 代理進行了從新初始化 |
2 | linkDown | 一個接口從工做狀態變爲故障狀態 |
3 | linkUp | 一個接口從故障狀態變爲工做狀態 |
4 | authenticationFailure | 從SNMP管理進程接收到具備一個無效共同體的報文 |
5 | egpNeighborLoss | 一個EGP相鄰路由器變爲故障狀態 |
6 | enterpriseSpecific | 代理自定義的事件,須要用後面的「特定代碼」來指明 |
特定代碼
特定代碼僅僅在trap類型爲6時有效,不然都置爲0,他是廠家自定義的事件代碼。
時間戳(timestamp) 指明自代理進程初始化到trap報告的事件發生所經歷的時間,單位爲10ms。例如時間戳爲1908代表在代理初始化後1908ms發生了該時間。
管理變量表示管理對象類型在某一時刻的值,SNMP以管理變量做爲操做對象。
管理變量的表示方法是這樣規定的:形如x.y,其中
如:在MIB文件裏定義了ipAdEntNetMask這一管理對象,其object identifier爲1.3.6.1.1.5.6.1.3它是個路由表中的一項,它的一個實例就是路由表中某一行的子網掩碼,若是這行的索引、目的網絡地址爲129.102.1.0。則這個變量名是:1.3.6.1.1.5.6.1.3.129.102.1.0。在之後的說明中,爲了方便,把惟一肯定管理變量的一組數字,也就是x.y中的y稱做實例。
駐留在被管設備上的AGENT從UDP端口161接受來自網管站的串行化報文,經解碼、團體名驗證、分析獲得管理變量在MIB樹中對應的節點,從相應的模塊中獲得管理變量的值,再造成響應報文,編碼發送回網管站。網管站獲得響應報文後,再經一樣的處理,最終顯示結果。
若是PDU中的變量名在本地維護的MIB樹中不存在,則接受到這個PDU的協議實體將向發出者發送一個GetResponse報文,其中的PDU與源PDU只有一點不一樣:將ERROR-STATUS置爲noSuchName,並在ERROR-INDEX中指出產生該變量在變量LIST中的位置。
若是本地協議實體將產生的響應報文的長度大於本地長度限制,將向該PDU的發出者發送一個GetResponse報文,該PDU除了ERROR-STATUS置爲tooBig,ERROR-INDEX置爲0之外,與源PDU相同。
若是本地協議實體由於其餘緣由不能產生正確的響應報文,將向該PDU的發出者發送一個GetResponse報文,該PDU除了ERROR-STATUS置爲genErr,ERROR-INDEX置爲出錯變量在變量LIST中的位置,其他與源PDU相同。
若是上面的狀況都沒有發生,則本地協議實體向該PDU的發出者發送一個GetResponse報文,該PDU中將包含變量名和相應值的對偶表,ERROR-STATUS爲noError,ERROR-INDEX爲0,request-id域的值應與收到PDU的request-id相同。
GetNextRequest PDU的最重要的功能是表的遍歷,這種操做受到了前面所說的管理變量的表示方法的支持,從而能夠訪問一組相關的變量,就好象他們在一個表內。
假設網管站欲取得這張路由表的信息,該表的索引是目的網絡地址。被管設備維護以下路由表:
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
複製代碼
網管站向被管設備發送一個GetNextRequest PDU,其中的受管對象的標識以下
GetNextRequest ( ipRouteDest, ipRouteNextHop, ipRouteMetric1 )
複製代碼
SNMP agent響應以下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 ))
複製代碼
網管站繼續:
GetNextRequest ( ipRouteDest.9.1.2.3,
ipRouteNextHop.9.1.2.3,
ipRouteMetric1.9.1.2.3 )
複製代碼
agent響應:
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必須可以肯定下一個管理變量名,以保證全部變量能被取到且只被取到一次。網管站繼續:
GetNextRequest ( ipRouteDest.10.0.0.51,
ipRouteNextHop.10.0.0.51,
ipRouteMetric1.10.0.0.51 )
複製代碼
agent 響應:
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 ))
複製代碼
網管站繼續
GetNextRequest ( ipRouteDest.10.0.0.99,
ipRouteNextHop.10.0.0.99,
ipRouteMetric1.10.0.0.99 )
複製代碼
這時由於路由表中全部的行都被取遍,agent因返回路由表對象的下一字典後繼即該管理對象在MIB樹中的後序遍歷的直接後繼。這裏應是nettoMediaIndex,管理對象的OBJECT IDENTIFIER。這個響應通知網管站對錶的遍歷已經完成。
GetResponse PDU只有當受到getRequest GetNextRequest SetRequest才由協議實體產生,網管站收到這個PDU後,應顯示其結果。
SetRequest PDU除了PDU類型標識之外,和GetRequest相同,當須要對被管變量進行寫操做時,網管站側的協議實體將生成該PDU。對SetRequest的響應將根據下面狀況分別處理:
若是是關於一個只讀變量的設置請求,則收到該PDU的協議實體產生一個GetReponse報文,並置error status爲noSuchName, error index的值是錯誤變量在變量list中的位置。
若是被管設備上的協議實體收到的PDU中的變量對偶中的值,類型、長度不符和要求,則收到該PDU的協議實體產生一個GetReponse報文,並置error status爲badValue, error index的值是錯誤變量在變量list中的位置。
若是須要產生的GetReponse報文長度超過了本地限制,則收到該PDU的協議實體產生一個GetReponse報文,並置error status爲tooBig, error index的值是0。
若是是其餘緣由致使SET失敗,則收到該PDU的協議實體產生一個GetReponse報文,並置error status爲genErr, error index的值是錯誤變量在變量list中的位置。
若是不符合上面任何狀況,則agent將把管理變量設置收到的PDU中的相應值,這每每能夠改變被管設備的運行狀態。同時產生一個GetResponse PDU,其中error status置爲noError,error index的值爲0。
Trap PDU的有以下的形式
產生trap的系統的OBJECT IDENTIFIER
系統的IP地址
普通類型
特定類型
時戳
變量對偶表
複製代碼
Trap是被管設備遇到緊急狀況時主動向網管站發送的消息。網管站收到trap PDU後要將起變量對偶表中的內容顯示出來。一些經常使用的trap類型有冷、熱啓動,鏈路狀態發生變化等。