31.Кодирование управляющей информации на примере конкретного PDU-SNMP v.1
Вот пример сообщения протокола SNMP, которое представляет собой запрос о значении объекта SysDescr (числовое имя 1.3.6.1.2.1.1.1).
30 | 29 | 02 | 01 | 00 | --- | --- | --- |
SEQUENCE | len=41 | INTEGER | len=41 | vers=0 | --- | --- | --- |
04 | 06 | 70 | 75 | 62 | 6C | 69 | 63 |
string | len=6 | p | u | b | l | i | c |
A0 | 1C | 02 | 04 | 05 | AE | 56 | 02 |
getreq | len=28 | INTEGER | len=4 | --- | requested ID | --- | --- |
02 | 01 | 00 | 02 | 01 | 00 | --- | --- |
INTEGER | len=1 | status | INTEGER | len=1 | error index | --- | --- |
30 | 0E | 30 | 0C | 06 | 08 | --- | --- |
SEQUENCE | len=4 | SEQUENCE | len=12 | objectid | len=8 | --- | --- |
2B | 06 | 01 | 02 | 01 | 01 | 01 | 00 |
1.3 | 6 | 1 | 2 | 1 | 1 | 1 | 0 |
05 | 00 | --- | --- | --- | --- | --- | --- |
null | len=0 | --- | --- | --- | --- | --- | --- |
Как видно из описания, сообщение начинается с кода 30 (все коды шестнадцатеричные), который соответствует ключевому слову SEQUENCE (последовательность). Длина последовательности указывается в следующем байте (41 байт). Далее следует целое число длиной 1 байт — это версия протокола SNMP (в данном случае 0, то есть SNMP v.l, a 1 означала бы SNMP v.2). Поле community имеет тип string (строка символов) длиной в 6 байт со значением public. Остальную часть сообщения составляет блок данных GetRequest-PDU. То, что это операция Get-request, говорит код АО (это значение определено в протоколе SNMP, а не в нотации ASN.1), а общая длина блока данных — 28 байт. В соответствии со структурой блока Getrequest-PDU, далее идет идентификатор запроса (он определен как целое 4-байтовое число). Затем в блоке следуют два однобайтовых целых числа статуса и индекса ошибки, которые в запросе установлены в 0. И наконец, завершает сообщение список объектов, состоящий из одной пары — имени 1.3.6.1.2.1.1.1.0 и значения null.