Especificação do Protocolo


Formato SNMP

Em SNMP, informações são trocadas entre uma estação de gerenciamento e um agente na forma de uma mensagem SNMP. Cada mensagem inclui o número da versão SNMP, o nome da comunidade para ser usado para esta troca e um de cinco tipos do Protocolo de Unidade de Dados (PDUs).

 	Campo			Descrição			

version Versão SNMP; RFC 1157 é versão 1.

community Uma PAIring de um agente SNMP com alguns conjuntos

arbitrários de entidades de aplicação SNMP.

request-id Usados para distinguir entre requests OUStanding provendo

cada request com um ID único.

error-status Usados para indicar que uma exceção ocorreu

enquanto processava um request.

error-index Quando um error-status é não 0, error-index pode

prover informações adicionais indicando qual

variável na lista causou a exceção.

variable-bindings Uma lista de nomes de variáveis e valores correspondentes.

enterprise Tipo do objeto gerador do trap.

generic-trap Tipo genérico do trap.

specific-trap Código específico do trap.

time-stamp Tempo ocorrido entre a última (re)inicialização da entidade da rede e a geração do trap.


Tabela 2 -Campos de Mensagem SNMP



Figura 1 - Formatos SNMP

A estrutura é descrita na figura 1 e os campos que a constituem estão definidos na Tabela 2. Nota-se que o GetRequest, GetNextRequest e SetRequest PDU tem o mesmo formato que o GetResponse PDU.

Transmissão de uma Mensagem SNMP

Uma entidade SNMP realiza as seguintes ações para transmitir um de cinco tipos de PDU para outra entidade SNMP.

RFC1157-SNMP DEFINITIONS ::= BEGIN

IMPORTS

ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks

FROM RFC1155-SMI;

--top-level message

Message = SEQUENCE{version INTEGER{version-1 (0)}, -- for this RFC

community OCTET STRING, -- community name

data ANY} --e.g., PDUs if trivial authentications is being used

--protocol data units

PDUs ::= CHOICE {get-request-PDU GetRequest-PDU,

get-next-request GetNextRequest-PDU,

get-response GetResponse-PDU,

set-request SetRequest-PDU,

trap Trap-PDU}

--PDUs

GetRequest-PDU, [0]IMPLICIT PDU

GetNextRequest-PDU [1] IMPLICIT PDU

GetResponse-PDU [2] IMPLICIT PDU

SetRequest-PDU [3] IMPLICIT PDU

PDU ::= SEQUENCE {request-id INTEGER,

error-status INTEGER { --sometimes ignored

noError (0),

tooBig (1),

noSuchName (2),

badValue (3),

readOnly (4),

genError (5),

error-index INTEGER, --sometimes ignored

variable-binding VarBindList} --values are sometimes ignored

Trap-PDU ::= [4] IMPLICIT SEQUENCE {

enterprise OBJECT IDENTIFIER, --type of object generating trap

agent-addr NetwokAddress, --address of object generating trap

generic-trap INTEGER { --generic trap type

coldStart (0),

warmStart (1),

linkDown (2),

lindUp (3),

authenticationFailure (4),

egpNeighborLoss (5),

enterpriseSpecific (6)},

specific-trap INTEGER,

time-stamp TimeTicks,

variable-bindings VarBindList}

--variable binding

VarBind ::= SEQUENCE {name ObjectName,

value ObjectSyntax}

VarBindList ::= SEQUENCE OF VarBind

END


Figura 2 Formatos SNMP (RFC 1157)

Recebimento de Uma Mensagem SNMP

Em princípio, uma entidade SNMP realiza as seguintes ações assim que recebe uma mensagem SNMP:

Variable-bindings

Toda operação envolve acesso à uma instância de objeto. Recordar que somente objetos folhas na árvore de instância de objetos podem ser acessados, isto é, somente objetos escalares. Entretanto, é possível em um grupo SNMP um número de operações do mesmo tipo(Get, Set, Trap) em uma mensagem simples. Assim, se uma estação de gerenciamento quer receber os valores de todos objetos escalares em um grupo particular para um agente particular, ele pode enviar uma mensagem simples requerendo todos valores e recebendo uma resposta, listando os valores. Para implementar trocas de múltiplos objetos, todos da PDU SNMP inclui um campo de ligação de variáveis. Estes campos consistem de uma seqüência de referências à instâncias de objetos, junto com o valor destes objetos.

GetRequest PDU

O GetRequest PDU é emitido por uma entidade SNMP é de interesse de uma estação de gerenciamento de rede de uma aplicação. A entidade de transmissão incluem os seguintes campos na PDU:

Tipo PDU: indicando que este é um GetRequest PDU;

A entidade de recebimento SNMP responde ao GetRequest PDU com um GetResponse PDU contendo o mesmo Request-id. A operação GetRequest é atômica: todos os outros valores são recuperados ou nenhum é. As seguintes condições de erro podem ocorrer:

Um objeto especializado no campo ligação de variáveis podem não igualar um identificador de objetos na MIB, ou um objeto especificado pode ser de um tipo agregado e portanto não ter um valor de instância apropriado.

A entidade de resposta pode estar habilitada para fornecer valores para todas as variáveis na lista, mas o tamanho do resultado GetResponse PDU podem exceder a limitação local. Neste caso, a entidade de resposta retorna o GetResponse PDU com um erro de status.

A entidade de resposta pode estar habilitada para fornecer um valor para o último dos objetos por algum motivo. Neste caso, a entidade de reposta retorna um GetResponse PDU com um status de erro de genErr e um valor no campo índice de erro.

Uma estação de gerenciamento pode recuperar toda linha de uma tabela em certo momento simplesmente incluindo cada instância de objeto da tabela da lista de ligação de variáveis.

GetNextRequest PDU

O GetNextRequest PDU é quase idêntico para todos GetRequest PDU. Ele tem o mesmo módulo de troca e o mesmo formato que o GetRequest PDU. A única diferença é a seguinte: no GetRequest PDU, cada variável na lista de ligação de variáveis referencia à uma instância de objetos de quem o valor é retornado. No GetResponse PDU, para cada variável, a resposta retorna o valor da instância do objeto que é a seguinte na ordem lexicográfica.

Recuperando o Valor de um Objeto Simples

Considerando que uma estação de gerenciamento de rede requerida para recuperar os valores de um objeto simples no grupo UDP(User Datagram Protocol) de um agente. A estação de gerência poderia enviar o GetRequest PDU da seguinte forma:


	GetRequest ((udpInDatagrams.0, udpNoPorts.0, udpInError.0, udpOutDatagrams.0)

Se a MIB VIEW para esta comunidade suporta todos esses objetos, então o GetResponse PDU deveria ser retornado com valores para todos os quatro objetos:

	GetResponse ((udpInDatagrams.0 = 100), (udpNoPorts.0 = 1), (udpInError.0 = 2),
	             (udpOutDatagrams.0 = 200))

onde 100, 1, 2 e 200 são os valores corretos para as quatro instâncias de objetos. Porém, se um dos objetos não for suportado, então o GetResponse PDU com um código de erro de noSuchName seria retornado, mas não seriam retornados valores. Na ordem para assegurar a obtenção de todos valores com o GetRequest PDU, a estação de gerenciamento deveria ter para emitir quatro PDUs separados.

Consideremos o uso de GetNextRequest PDU:

	GetNextRequest (udpInDatagrams, udpNoPorts, udpOutDatagrams)

Neste caso, o agente retornará o valor lexicográfico da próxima instância de objetos para cada identificador na lista. Suponha agora que todos os quatro objetos são suportados. O identificador para UDP InDatagrams é 1.3.4.1.2.1.7.1. O próximo identificador de instância na ordem lexicográfica é udpInDatagrams.0, ou 1.3.4.1.2.1.7.1.0. Similarmente, o próximo identificador após udpNoPorts.0 e assim por diante. Desta maneira, se todos valores estão disponíveis, o agente retorna um GetResponse PDU, desta forma:

	GetResponse ((udpInDatagrams.0 = 100), (udpNoPorts.0 = 1),  (udpInError.0 =2), 	
		     (udpOutDatagrams.0 = 200))

Agora supondo que udpNoPorts não é visível , e o mesmo GetNextRequest PDU é emitido, a resposta é:

	GetResponse ((udpInDatagrams.0 = 100), (udpNoPorts.0 = 2), (udpInError.0 = 2),
		     (udpOutDatagrams.0 = 200))

Quando um agente emite um GetNextRequest PDU com o identificador de objeto de um conjunto de objetos, o resultado inclui o valor da requerida instância de objetos que estão disponíveis. Para aqueles que não estão, o próximo valor da instância de objetos em ordem é retornado.

Retornando Objetos Desconhecidos

As regras para o uso do GetNextRequest PDU requer que um agente retorne a próxima instância de objetos que ocorre lexicograficamente após do identificador fornecido.

Uma estação de gerenciamento pode usar o GetNextRequest PDU para sondar uma MIB e descobrir sua estrutura. Se a estação de gerenciamento emitir um GetNextRequest, a resposta será o GetResponse (udpInDatagrams.0=100).

Acessando Valores de Tabelas

O GetNext Request PDU pode ser usado para pesquisar numa tabela. Considerando o exemplo da figura 3, nota-se que a tabela tem três linhas com os seguintes valores:

    ipRouteDest        ipRouteMetric1       ipRouteNextHop

9.1.2.3 3 99.0.0.3

10.0.0.51 5 89.1.1.42

10.0.0.99 5 89.1.1.42

Supondo que a estação de gerenciamento queira retornar a tabela inteira e não conhece seu conteúdo ou mesmo o número de linhas da tabela. A estação de gerenciamento poderia emitir um GetNextRequest com os nomes de todos objetos colunares:

	GetNextRequest (ipRouteDest, ipRouteMetric1, ipRouteNextHop)

A figura 3 revela que o agente quer responder com os valores da primeira linha da tabela:


	GetResponse ((ipRouteDest.9.1.2.3 = 9.1.2.3), (ipRouteMetric1.9.1.2.3 = 3),
		    (ipRouteNextHop.9.1.2.3 = 99.0.0.3))

A estação de gerenciamento pode então armazenar estes valores e retornar a segunda linha com:

	GetNextRequest (ipRouteDest.9.1.2.3, ipRouteMetric1.9.1.2.3, ipRouteNextHop.9.1.2.3)

O agente SNMP responde:

	GetResponse ((ipRouteDest.10.0.0.51 = 10.0.0.51), (ipRouteMetric1.10.0.0.51 = 5),  
		     (ipRouteNextHop.10.0.0.51 = 89.1.1.42))

Então, a seguinte troca ocorre:

GetResponse (ipRouteDest.10.0.0.51), (ipRouteMetric1.10.0.0.51),(ipRouteNextHop.10.0.0.51)

GetResponse ((ipRouteDest.10.0.0.99=10.0.0.99), (ipRouteMetric1.10.0.0.99 = 5), (ipRouteNextHop.10.0.0.99 = 89.1.1.42))

A estação de gerenciamento não conhece que este é o fim da tabela e procede assim com:


	GetNextRequest (ipRouteDest.10.0.0.99, ipRouteMetric1.10.0.0.99,
		       (ipRouteNextHop.10.0.0.99)

Entretanto, não há novas linhas na tabela, assim que o agente responda com aqueles objetos são

os próximos na ordem lexicográfica dos objetos na MIB:

          GetResponse(((ipRouteMetric1.9.1.2.3 = 1.9.2.3),(ipRouteNextHop.9.1.2.3 =  3), 

(ipNetMediaIfIndex.1.3 = 1))

Onde o exemplo assume que a próxima instância do objeto é a mesma mostrada na terceira entrada da resposta. Uma vez que os objetos estão listados na resposta(Figura 3).

SetRequest PDU

O SetRequest PDU é emitido por uma entidade SNMP sob interesse de uma aplicação da estação de gerenciamento. Tem o mesmo padrão de troca PDU e o mesmo formato que o GetRequest PDU. A diferença é que o SetRequest é usado para gravar um valor de objeto, mais propriamente para lê-lo. Assim, a lista de ligação de variáveis no SetRequest PDU inclui ambos identificadores da instância de objetos e um valor para ser definido para cada instância da lista.

A entidade SNMP de recebimento responde a um SetRequest PDU com um GetResponse PDU contendo o mesmo request-id. Se a entidade de resposta é capaz de estabelecer valores para todas as variáveis listadas na entrada da lista de variáveis, então o GetResponse PDU inclui o campo variáveis de ligação com um valor são fornecidos para cada variável.

Atualizando uma Tabela

No caso de um objeto que não é um objeto INDEX, a semântica dos objetos são obvias. Considerando o exemplo mostrado na Figura 3:



Figura 3 Um exemplo de Sub-árvores de Objetos eInstância de Objetos

O efeito desta troca é a atualização do valor de ipRouteMetric, na primeira linha. Supondo que a estação de gerência pede para adicionar uma nova linha na tabela, com valores para ipRouteDest, ipRouteMetric1 e ipRouteNextHop de 11.3.12, 9 e 91.0.0.5. A estação de gerenciamento emitiria o seguinte:

   	SetRequest ((ipRouteDest.11.3.3.12 = 11.3.3.12), (ipRouteMetric1.11.3.3.12 = 9),
             	    (ipRouteNextHop.11.3.3.12 = 91.0.0.5))

O objeto colunar ipRouteDest x é sempre x uma vez que o valor de ipRouteDest é o índice APPENED para todos identificadores de objetos colunares. Se o valor de 11.3.12 é determinado por um objeto colunar ipRouteDest, então o nome do objeto é ipRouteDest 11.3.12. O RFC1212 indica três maneiras nas quais o agente poderia manobrar este pedido. O agente poderia:

No último caso, o agente deveria retornar:

SetResponse ((ipRouteDest.11.3.3.12 = 11.3.3.12), (ipRouteMetric1.11.3.3.12 = 9), (ipRouteNextHop.11.3.3.12 = 91.0.0.5))

Deletando Linhas

O comando set pode também ser usado para deletar uma linha de uma tabela. No caso da ipRouteTable, um valor objeto é fornecido para este propósito. A estação de gerência emite:

SetRequest (ipRouteType.7.3.5.3 = invalid)

A resposta apropriada seria:

GetResponse (ipRouteDest.7.3.5.3 = invalid)

Esta troca elimina a linhada tabela indexada por um valor ipRouteDest de 7.3.5.3.

Realizando uma Ação:

SNMP não provê um mecanismo específico para a emissão de um comando a um agente, para realizar uma ação. SNMP lê e seta valores de objetos dentro da MIB. Um objeto pode ser usado para representar um comando assim que uma ação específica é pega se um objeto está setado para um valor específico.

O Caso de Read-only

Um dos valores de status de erro que pode ser retornado em um GetResponse PDU é read-only. A definição de um SetRequest PDU, que está no RFC1157, inclui as seguintes regras:

- Se para um objeto mencionado no campo variable-bindings não está disponível para operações set na MIB relevante, então a entidade receptora envia para o originador da mensagem recebida, o GetResponse PDU de forma idêntica, exceto que o valor do campo status de erro é noSuchName, e o valor do campo índice do mencionado.

Esta regra significa o seguinte:

Trap PDU

O trap PDU é emitido por uma entidade SNMP como representante de uma aplicação do agente de gerenciamento da rede. Ele é usado para prover a estação de gerenciamento com uma notificação assíncrona de alguns eventos significantes. Seu formato é completamente diferente dos outros PDUs SNMP. Os campos são: