snmp報文

1 BRE編碼(Basic Encoding Rule)

   基本編碼規則使用使用TLV 方式,即Type,Length,Value消息中所表達的信息都用一個Type 域標記一個Legnth 限定值然後是Value ,ASN.1是一種用來描述系統之間傳遞的信息格式的語言規範被廣泛用在通信協議的規格定義中一句話理解ASN.1 和BER即是:“信息的描述基於ASN.1 語法”和“信息的編碼基於BER方法”


2 SNMP報文的過程中我們經常用到的是下面的數據類型標識號




各種數據類型的解釋
INTEGER 一個變量雖然定義爲整型,但也有多種形式。有些整型變量沒有範圍限制,有些整型變量定義爲特定的數值(例如,IP的轉發標誌就只有允許轉發時的或者不允許轉發時的這兩種),有些整型變量定義一個特定的範圍(例如,UDP和TCP的端口號就從0到65535)。
OCTER STRING 0或多個8 bit字節,每個字節值在0~255之間。對於這種數據類型和下一種數據類型的BER編碼,字符串的字節個數要超過字符串本身的長度。這些字符串不是以NULL結尾的字符串。
DisplayString 0或多個8bit字節,但是每個字節必須是ASCII碼。在MIB-II中,所有該類型的變量不能超過255個字符(0個字符是可以的)。
:) OBJECT IDENTIFIER
:) NULL 代表相關的變量沒有值。例如,在get或get-next操作中,變量的值就是NULL,因爲這些值還有待到代理進程處去取。
:) IpAddress 4字節長度的OCTER STRING,以網絡序表示的IP地址。每個字節代表IP地址的一個字段。
:) PhysAddress OCTER STRING類型,代表物理地址(例如以太網物理地址爲6個字節長度)。
:) Counter 非負的整數,可從0遞增到232—1(4294976295)。達到最大值後歸0。
:) Gauge 非負的整數,取值範圍爲從0到4294976295(或增或減)。達到最大值後鎖定直到復位。例如,MIB中的tcpCurrEstab就是這種類型的變量的一個例子,它代表目前在ESTABLISHED或CLOSE_WAIT狀態的TCP連接數。
:) TimeTicks 時間計數器,以0.01秒爲單位遞增,但是不同的變量可以有不同的遞增幅度。所以在定義這種類型的變量的時候,必須指定遞增幅度。例如,MIB中的sysUpTime變量就是這種類型的變量,代表代理進程從啓動開始的時間長度,以多少個百分之一秒的數目來表示。
:) SEQUENCE 這一數據類型與C程序設計語言中的“structure”類似。一個SEQUENCE包括0個或多個元素,每一個元素又是另一個ASN.1數據類型。例如,MIB中的UdpEntry就是這種類型的變量。它代表在代理進程側目前“激活”的UDP數量(“激活”表示目前被應用程序所用)。在這個變量中 包含兩個元素:
Ø IpAddress類型中的udpLocalAddress,表示IP地址。
Ø INTEGER類型中的udpLocalPort,從0到65535,表示端口號。
:) SEQUENDEOF 這是一個向量的定義,其所有元素具有相同的類型。如果每一個元素都具有簡單 的數據類型,例如是整數類型,那麼我們就得到一個簡單的向量(一個一維向量)。但是我們將 看到,SNMP在使用這個數據類型時,其向量中的每一個元素是一個SEQUENCE(結構)。因而可以將它看成爲一個二維數組或表。
:) Opague 不透明類型或未知類型
3 SNM規定了5種協議數據單元PDU
(也就是SNMP報文),用來在管理進程和代理之間的交換。
l get-request操作:從代理進程處提取一個或多個參數值
l get-next-request操作:從代理進程處提取緊跟當前參數值的下一個參數值
l set-request操作:設置代理進程的一個或多個參數值
l get-response操作:返回的一個或多個參數值。這個操作是由代理進程發出的,它是前面三種操作的響應操作。
l trap操作:代理進程主動發出的報文,通知管理進程有某些事情發生。
前面的3種操作是由管理進程向代理進程發出的,後面的2個操作是代理進程發給管理進程的,爲了簡化起見,前面3個操作今後叫做get、get-next和set操作。下圖描述了SNMP的這5種報文操作。請注意,在代理進程端是用熟知端口161倆接收get或set報文,而在管理進程端是用熟知端口162來接收trap報文。
SNMP的5種報文操作



4 SNMP報文格式




解釋如下:
4.1 Version(版本號):
該字段是TLV 格式的數據塊包含3個字節,表示報文的版本號
內容爲02-01-XX 其中02 字節是數據類型,對應了表格1 中的Integer 整型數據01是數據長度:1個字節。XX 是數據值,它的取值分別對應SNMP的三種不同的版本。對應關係如下:
XX=0 對應SNMPv1
XX=1 對應SNMPv2c
XX=2 對應SNMPv2
XX=3 對應SNMPv3
4.2 Community(團體名)
字段也是TLV 格式的數據塊,其LV 取決於實際的團體名,例如某個SNMPv1 的網管報文的團體名爲字符串public, 則編碼的二進制爲04-06-70-75-62-6c-69-63。
04對應表格1 的Octet string 即字符串型數據。
06對應後面的長度是6個字節。
70-75-62-6c-69-63是“public“的ASCII碼值。
從這裏可以看出SNMPv1 的團體名是以明文表示的當SNMP。報文被非法截獲後團體名就泄漏出去了對網絡管理的安全將產生一定的威脅。SNMPv3在網絡管理的安全性方面有改進採用MD5 SHA 的認證方法保證安全SNMP 報文的協議數據單元PDU 結構分兩類一般網管報文的PDU 和Trap
4.3 一般的PDU報文(非Trap)
報文的 PDU 分別介紹如下:
一般的SNMP 報文的PDU 結構如圖2 所示


4.3.1 PDU Type:
SNMP 的Get-Request、Get-Response 等基本命令集的操作類型。
根據PDU的類型,填入0~4中的一個數字(非Trap報文填寫0-3),其對應關係如下表所示意圖。
PDU類型
PDU類型 名稱
0 get-request
1 get-next-request
2 get-response
3 set-request
4 trap
4.3.2 Request ID :
採用02-04-XX-XX-XX-XX 的TLV 數據塊用於網管站和被管設備之間傳遞的SNMP 報文的操作和應答的匹配,這和CAMS服務器與設備之間交互的Radius 報文ID 的功能基本相同,之所以使用報文ID機制來匹配報文,根本原因在於UDP 通信的不可靠特點:基於UDP 的應用程序均應該依靠這種方法維持通信的正常秩序。
4.3.3 Error-status:
採用02-01-00的TLV 數據塊用來指示錯誤類型一般情況下V總是0
差錯狀態描述
差錯狀態 名字 說明
0 noError 一切正常
1 tooBig 代理無法將回答裝入到一個SNMP報文之中
2 noSuchName 操作指明瞭一個不存在的變量
3 badValue 一個set操作指明瞭一個無效值或無效語法
4 readOnly 管理進程試圖修改一個只讀變量
5 genErr 某些其他的差錯
4.3.4 Error-index:
02-01-XX 的TLV 數據塊。用來表示產生錯誤的變量。當出現noSuchName、badValue或readOnly的差錯時,由代理進程在回答時設置的一個整數,它指明有差錯的變量在變量列表中的偏移。
var-bindings 字段包含衆多的變量對偶var_n表示變量n 的標識,value_n 表示變量n 的取值。其中的var_n 基本上就是SNMP的管理變量,是SNMP 操作的基本對象,也即下文所述的OID(ObjectIdentifier),每個OID 標識一個管理變量OID符合TLV 格式,但是OID 的V部分不再符合TLV格式。其編碼方式在下節講述。Value_n 表示OID 的取值部分,其編碼方法是TLV 格式的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章