SNMP協議 PDU報文格式分析(BER編碼)
簡單網路管理協議(SNMP)是目前在計算機網路中用得最廣泛的網路管理協議,它使用ASN.1(Abstract Syntax Notation One)來定義SNMP報文格式和MIB(Management Information Base)變數的名稱。
ASN.1是一種描述資料和資料特徵的正式語言,它和資料的儲存及編碼無關。根據ASN.1標準定義,資料型別分為:簡單資料型別: boolean、null、integer、real、octerstring、object identifier、ipaddress、time ticks等。構造資料型別:sequence、sequence of set
基本編碼規則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位包含的就是資料的長度值,長度值在0到127之間;如果短/長指示器是1,則為長限定格式,其低7
例:
length:30 => 1E
length:169 => 81 A9
length:1500 => 82 05 DC
值域
值域儲存的是資料的實際編碼。雖然ASN.1定義了很多資料型別,但大多數型別可由整形、物件標
識、空、串等基本資料型別和sequence構造型別表示。例如有符號整數和無符號整數、TimeTicks、Gauge、Counter統一用整數表示。
整型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}
(轉自網路)