1. 程式人生 > >SNMP協議 PDU報文格式分析(BER編碼)

SNMP協議 PDU報文格式分析(BER編碼)

簡單網路管理協議(SNMP)是目前在計算機網路中用得最廣泛的網路管理協議,它使用ASN.1(Abstract Syntax Notation One)來定義SNMP報文格式和MIB(Management Information Base)變數的名稱。

ASN.1是一種描述資料和資料特徵的正式語言,它和資料的儲存及編碼無關。根據ASN.1標準定義,資料型別分為:簡單資料型別: booleannullintegerrealocterstringobject identifieripaddresstime ticks等。構造資料型別:sequencesequence of set

set ofchoice等。構造資料型別提供一種或多種簡單資料型別進行復合的方法。

基本編碼規則BER

在具體系統中,我們需要用具體的編碼規則將ASN.1語法表示的抽象資料轉換成具體的位元流。

SNMP使用的編碼方法是BER(Basic Encoding Rule)BER的資料都由三個域構成:標識域(tag)+

度域(length)+值域(value)

標識域

標識域指明資料的型別,佔用1個位元組,常見的

型別有:

BOOL(0x01);

INT(0x02);

OCTSTR(0x04);

NULL(0x05);

OBJID(0x06);

ENUM(0x0A);

SEQ(0x30);

SETOF(0x31);

IPADDR (0x40);

COUNTER (0x41);

GAUGE(0x42);

TIMETICKS(0x43);

OPAQUE(0x44);

GET(0xA0);

GETNEXT(0xA1);

GETResp(0xA2);

SET(0xA3);

TRAP(0xA4);

長度域

長度域指明值域的長度,不定長,一般為一到三個位元組。其格式可分為短格式和長格式.長度域採用短/長指示器(Short/Long Form)來標明長度指示符是否是單個位元組,指示器在bit8上。如果短/長指示器是0,則為短限定格式,7位包含的就是資料的長度值,長度值在0127之間;如果短/長指示器是1,則為長限定格式,其低7

位的值表示後面緊跟的長度指示值的位元組數,而後續位元組拼接起來的值就是資料欄位的長度,即資料長度。

:

length30 => 1E 

length169 => 81 A9 

length1500 => 82 05 DC

值域

值域儲存的是資料的實際編碼。雖然ASN.1定義了很多資料型別,但大多數型別可由整形、物件標

識、空、串等基本資料型別和sequence構造型別表示。例如有符號整數和無符號整數、TimeTicksGaugeCounter統一用整數表示。

整型Integer

integer::=0x02 length {byte}* (*表示重複)

整型資料值域用補碼錶示,去掉多餘的零(正數)或一(負數)。值域最高位為符號位。例:

1500 => 02 02 05 DC

-1500 => 02 02 FA 24

物件標識ObjectID

SNMP伺服器維護的所有管理資訊庫(MIB)物件採用ObjectID表示,,1.3.6.1.2.1.1.1表示MIB

中的裝置描述SysDesc變數,其編碼規則如下:

objectID::=0x06 length {subidentifier}*  (1)

subidentifier::={leadingbyte}* lastbyte (2)

leadingbyte::=1 7bitvalue (3)

lastbyte::=0 7bitvalue (4)

首兩個ID被合併為一個位元組X*40+Y (5)

雖然規則很多,但由於大多數子物件標識在0~127,只需按規則(1)(5)即可;當子物件標識大於127,則按規則(2)(3)(4)將其分解為多個位元組,最後一個位元組的高位為零,其餘位元組的高位為一。

:1.3.6.1.810.1,根據規則(5),首兩個子物件

標識1.3被合併為2B(1*40+3=43);子物件標識810超過127 ,根據規則(2)(3)(4)將其拆分為兩個

位元組86 2A(810=11 0010 1010 ==> 1000 0110 00101010);整個MIB被編碼為:0x06 0x06 0x2b 0x06 0x010x86 0x2a 0x01

sequence組合型別

sequence::=0x30 length {asndata}*

:30 05 02 01 10 05 00表示一個sequence結構,內含兩個成員,其中一個為整型,另一個為空型別(NULL)

其它型別

null::=0x05 0x00

string::=0x04 length {byte}*

SNMP報文

SNMP報文格式

SNMP共有五種報文,分別為Get_Request(0xA0)Get_Next_Request(0xA1)Get_Response(0xA2)Set_Request(0xA3)Trap(0xA4),其結構如下:

SNMP_Message::=SEQUENCE{version Integer,community OcterString, pdu SNMP_PDUs}

SNMP_PDUs::=CHOICE{get_request PDU,get_next_request PDU,get_response PDU,set_request PDU,trap TrapPDU}

PDU::=SEQUENCE{request-id Integer,error-status Integer,error index Integer,variable-bindings VarBindList}

TrapPDU∷=SEQUENCE{enterprise ObjectID,agent_addr IPAddr, trap_type Integer, specific_type Integer,time TimeTicks, variable-bindings VarBindList}

(轉自網路)