![[Page Précédente]](images/hnolast.gif)
Echanges de données ![[Sommaire]](images/sommaire.gif)
Commandes
Dans cette page, nous allons voir la forme des trames de type set, get, getnext et response.
La trame du trap est légèrement différente et est traitée à
la page suivante.
Avant de donner la description de la trame SNMP, il est nécessaire de faire quelques précisions :
La syntaxe abstraite ASN.1 permet de décrire les objets
manipulés.
Pour transférer l'information entre deux machines et ce
indépendamment de l'architecture des machines, on utilise
actuellement un codage : le BER (Basic Encoding Rules).
Le BER poursuit le même objectif que le protocole XDR de
Sun (eXternal Data Representation), mais il est plus complexe,
donc plus goumand en CPU et n'offre pas de fonction de compactage
de l'information.
Le codage BER
Exemple
Codage d'une instance d'objet
Tout type ASN.1 est codé de la manière suivante :

Ou plus synthétiquement :
Type(1 octet) | Longueur | Valeur |
Type se décompose ainsi :
Classe (2 bits) | Forme (1 bit) | indicateur (5 bits) |
avec
Classe | Forme |
Universal | 00 | Primitive | 0 |
Application | 01 | Constructed | 1 |
Context specific | 10 |
|
|
Private | 11 |
|
|
Identificateur de classe Universal |
Integer | 2 |
Bilstring | 3 |
Octetsring | 4 |
Null | 5 |
Object identifier | 6 |
Object descriptor | 7 |
Sequence and Sequence-of | 16 |
Identificateur de classe Application |
IpAdress | 0 |
Counter | 1 |
Gauge | 2 |
Time Ticks | 3 |
Opaque | 4 |
Identificateur de classe Context Specific |
GetRequest-PDU | 0 |
GetNextRequest-PDU | 1 |
GetResponse-PDU | 2 |
SetRequest-PDU | 3 |
Trap-PDU | 4 |
Trame
La trame SNMP suit le modèle TLV :

où le PDU se décompose comme suit (toujours suivant le modèle TLV) :

Description des champs :
Version indique la version de SNMP utilisée. 0 correspond à SNMPv1.
Community Name sert à faire de l'authentification. En fait on peut définir plusieurs groupes qui auront des droits
différents sur les objets de la MIB (lecture seule, lecture/écriture). Cette authentification est la seule option de
sécurité observée dans SNMPv1. Malheureusement la chaîne de caractère correspondante transite en
clair sur le réseau !!!
PDU Tag Type du PDU : get, set ... Voir tableau ci-dessus
Request ID Identité du message
Error Status Indication d'erreur
Error Index Pointeur sur l'erreur
Le tableau suivant récapitule les erreurs rencontrées :

0 : noError, 1 : tooBig, 2 : noSuchName, 3 : badValue, 4 : readOnly, 5 : genError.
Exemples
retour à BER
Dans ce paragraphe, nous allons voir un exemple de requête get-response
La syntaxe utilisée est la suivante : snmpget -h host -p port -c community OID
snmpget -h 139.124.26.111 -p 161 -c public 1.3.6.1.2.1.1.1.0
En fait, nous demandons des renseigenments (en l'occurence le sysDescr) d'une sonde
qui a pour adresse IP 139.124.26.111. Et la réponse obtenue est :
Request Id: 0
Error: noError
Index: 0
Count: 1
Name: 1.3.6.1.2.1.1.1.0
Kind: OctetString
Value: "HP LanProbe III SNMP 1.0 (A.00.05), (Boot ROM A.00.01 8M)"
Nous allons maintenant décomposer la trame grâce au codage TLV
LANWatch ethernet trace file: get_resp.bin - created Tue Oct 08 05:19:04 1996.
#******* Receive time: 360.303 (0.000) packet length:82 received length:82
Ethernet: ( HP b1e4a1 -> Cisco 467a32) type: IP(0x800)
Internet: 139.124.33.249 -> 139.124.26.111 hl: 5 ver: 4 tos: 0
len: 68 id: 0x2c35 fragoff: 0 flags: 00 ttl: 64 prot: UDP(17)
xsum: 0xfb13
UDP: 1424 -> SNMP(161) len: 48 xsum: 0x72c4
SNMP: len: 38 version: int(1) 0x00 comm: string(6) "public" type: GET
req-id: int(1) 0x00 error: int(1) 0x00 error-index: int(1) 0x00
var: obj(8) 1 3 6 1 2 1 1 1 0 val: string(0) ""
==============================================================+=======++=======.
0000: 00 00 0c 46 7a 32 08 00 - 09 b1 e4 a1 08 00 45 00 | .Fz2. ..... E |
0010: 00 44 2c 35 00 00 40 11 - fb 13 8b 7c 21 f9 8b 7c | D,5 @....|!..||
0020: 1a 6f 05 90 00 a1 00 30 - 72 c4 30 26 02 01 00 04 |.o.. . 0r.0&.. .|
0030: 06 70 75 62 6c 69 63 a0 - 19 02 01 00 02 01 00 02 |.public.... .. .|
0040: 01 00 30 0e 30 0c 06 08 - 2b 06 01 02 01 01 01 00 |. 0.0...+...... |
0050: 04 00 |. |
T : 0x02
Classe | Forme | Identificateur |
00 | 0 | 00010 |
Universal | Primitive | Integer |
L : 0x01 = 1 octet
V : 0x00 = 0 correspond à un paquet SNMPv1
T : 0x04
Classe | Forme | Identificateur |
00 | 0 | 00100 |
Universal | Primitive | OctetString |
L : 0x06 = 6 octets
V :
0x70 | 0x75 | 0x62 | 0x6c | 0x69 | 0x63 |
p | u | b | l | i | c |
T : 0xA0
Classe | Forme | Identificateur |
10 | 1 | 00000 |
Context Specific | Constructed | GetRequest-PDU |
L : 0x19 = 25 octet
V :
T : 0x02
Classe | Forme | Identificateur |
00 | 0 | 00010 |
Universal | Primitive | Integer |
L : 0x01 = 1 octet
V : 0x00 = 0 correspond à Request ID.
T : 0x02
Classe | Forme | Identificateur |
00 | 0 | 00010 |
Universal | Primitive | Integer |
L : 0x01 = 1 octet
V : 0x00 = 0 correspond à Error Status.
T : 0x02
Classe | Forme | Identificateur |
00 | 0 | 00010 |
Universal | Primitive | Integer |
L : 0x01 = 1 octet
V : 0x00 = 0 correspond à Error Index.
T : 0x30
Classe | Forme | Identificateur |
00 | 1 | 10000 |
Universal | Costructed | Sequence of |
L : 0x0E = 14 octets
V :
T : 0x30
Classe | Forme | Identificateur |
00 | 1 | 10000 |
Universal | Costructed | Sequence of |
L : 0x0C = 12 octets
V :
T : 0x06
Classe | Forme | Identificateur |
00 | 0 | 00110 |
Universal | Primitive | OID |
L : 0x08 = 8 octets
V :
0x2B | 0x06 | 0x01 | 0x02 | 0x01 | 0x01 | 0x01 | 0x00 |
1.3 | 6 | 1 | 2 | 1 | 1 | 1 | 0 |
Remarque : 0x2B=43=40*1+3 correspond à 1.3
T : 0x04
Classe | Forme | Identificateur |
00 | 0 | 00100 |
Universal | Primitive | String |
L : 0x00 = 0 octet
Et sa réponse :
#0 Receive time: 360.306 (0.003) packet length:139 received length:139
Ethernet: (Cisco 467a32 -> HP b1e4a1) type: IP(0x800)
Internet: 139.124.26.111 -> 139.124.33.249 hl: 5 ver: 4 tos: 0
len: 125 id: 0xf4b fragoff: 0 flags: 00 ttl: 252 prot: UDP(17)
xsum: 0x5bc4
UDP: SNMP(161) -> 1424 len: 105 xsum: 0xc9c4
SNMP: len: 95 version: int(1) 0x00 comm: string(6) "public" type: RESPONSE
req-id: int(1) 0x00 error: int(1) 0x00 error-index: int(1) 0x00
var: obj(8) 1 3 6 1 2 1 1 1 0
val: string(57) "HP LanProbe III SNMP 1.0 (A.00.05), (Boot ROM A.00.01 8M)"
==============================================================+=======++=======.
0000: 08 00 09 b1 e4 a1 00 00 - 0c 46 7a 32 08 00 45 00 |. .... .Fz2. E |
0010: 00 7d 0f 4b 00 00 fc 11 - 5b c4 8b 7c 1a 6f 8b 7c | }.K ..[..|.o.||
0020: 21 f9 00 a1 05 90 00 69 - c9 c4 30 5f 02 01 00 04 |!. ... i..0_.. .|
0030: 06 70 75 62 6c 69 63 a2 - 52 02 01 00 02 01 00 02 |.public.R.. .. .|
0040: 01 00 30 47 30 45 06 08 - 2b 06 01 02 01 01 01 00 |. 0G0E..+...... |
0050: 04 39 48 50 20 4c 61 6e - 50 72 6f 62 65 20 49 49 |.9HP LanProbe II|
0060: 49 20 53 4e 4d 50 20 31 - 2e 30 20 28 41 2e 30 30 |I SNMP 1.0 (A.00|
0070: 2e 30 35 29 2c 20 28 42 - 6f 6f 74 20 52 4f 4d 20 |.05), (Boot ROM |
0080: 41 2e 30 30 2e 30 31 20 - 38 4d 29 |A.00.01 8M) |
Voici un autre exemple avec une requête getnext-response
snmpnext -h 139.124.26.111 -p 161 -c public 1.3.6.1.2.1.1
Request Id: 0
Error: noError
Index: 0
Count: 1
Name: 1.3.6.1.2.1.1.1.0
Kind: OctetString
Value: "HP LanProbe III SNMP 1.0 (A.00.05), (Boot ROM A.00.01 8M)"
Request Id: 1
Error: noError
Index: 0
Count: 1
Name: 1.3.6.1.2.1.1.2.0
Kind: ObjectId
Value: 1.3.6.1.4.1.11.2.3.7.6.3.3
Request Id: 2
Error: noError
Index: 0
Count: 1
Name: 1.3.6.1.2.1.1.3.0
Kind: TimeTicks
Value: 319562062
Request Id: 3
Error: noError
Index: 0
Count: 1
Name: 1.3.6.1.2.1.1.4.0
Kind: OctetString
Value: ""
Request Id: 4
Error: noError
Index: 0
Count: 1
Name: 1.3.6.1.2.1.1.5.0
Kind: OctetString
Value: "gfhhf"
Request Id: 5
Error: noError
Index: 0
Count: 1
Name: 1.3.6.1.2.1.1.6.0
Kind: OctetString
Value: "hhhhhh"
Request Id: 6
Error: noError
Index: 0
Count: 1
Name: 1.3.6.1.2.1.1.7.0
Kind: Integer
Value: 15
Request Id: 7
Error: noError
Index: 0
Count: 1
Name: 1.3.6.1.2.1.2.1.0
Kind: Integer
Value: 2
![[Page Précédente]](images/bnolast.gif)