Tipos de dados no SNMP
Continuando a série (veja também os posts anteriores, I e II), se você pretende criar um equipamento que tenha suporte a SNMP, vai ter que descrever “a sua parte da árvore”. Isto significa ter que aprender a linguagem que descreve uma MIB, chamada de ASN.1, ou Abstract Syntax Notation One, em inglês. O primeiro passo, neste caso, é entender os tipos de dados que podem ser usados. Felizmente, a lista não é grande, sendo resumida logo a seguir (ver RFC 1155 para detalhes):
Tipos primitivos:
- OCTET STRING: uma string, de zero ou mais octetos. Lembrando que um octeto é um byte de 8 bits. O octet string é usado como uma forma geral de descrição já que pode conter textos legíveis (pelo menos em codificações ocidentais). O nome do equipamento, do responsável ou mesmo o modelo se encaixam muito bem em octect string.
- COUNTER: um número de 32 bits, na faixa de [0,2^32-1] e que deve ser inicializado com zero. Caso este número ultrapasse o limite superior, ele deve continuar à partir do zero. Ele deve ser sempre crescente, até que o limite superior seja alcançado e o contador reinicie. Este tipo de dado é usado geralmente para contar eventos, como número de bytes transmitidos, frames recebidos, etc.
- INTEGER: apesar de ser também um número de 32 bits, o integer é geralmente usado para se criar enumerações, isto é, um conjunto de valores numéricos finito que descrevem estados, características, etc. Por exemplo, um LED poderia ter uma enumeração com dois valores: (1) para APAGADO e (2) para ACESO. O valor zero não deve ser usado na enumeração, por norma. Todos os valores usados na enumeração são documentados na MIB e existem testes para verificar a faixa.
- OBJECT IDENTIFIER: um tipo de dado que descreve um OID, aquela sequência de números separados por pontos, visto no post anterior.
- NULL: Indica um valor nulo. Não é usado na descrição da MIB, geralmente apenas na comunicação.
Tipos compostos também existem:
- SEQUENCE: um tipo de dado que especifica uma lista de elementos formados por tipos primitivos. Usado para descrever listas de valores e ajuda na formação de tabelas.
- SEQUENCE OF: Geralmente usado para a descrição de tabelas, onde cada coluna é de um determinado tipo de dado primitivo e precisa-se enviar uma linha dessa tabela por vez. Neste caso, sequence of irá se referir a uma lista, ou seja, um dado do tipo sequence. Uma situação comum é quando se envia uma tabela de interfaces de rede de um roteador, com colunas como “nome”, “estado”, “frames recebidos”. Cada linha desta tabela pode ser descrita por uma lista (sequence) de octect string (nome), Integer (estado) e Counter (frames recebidos) e a tabela como uma sequência de sequências (sequence of). Sim, é um pouco confuso, vale a pena reler este últimos dois tipos.
- IpAddress: um endereço IP de 32 bits, isto é, IP versão 4 (IPv4).
- NetwordAddress: um endereço de rede de 32 bits, isto é, IP versão 4 (IPv4).
- Gauge: apesar de ser um número de 32 bits como o counter, o gauge não precisa ser sempre crescente, basta obedecer a faixa [0,2^32-1]. Se você tiver que especificar, por exemplo, o uso de banda instantâneo, este seria um bom candidato.
- TimeTicks: este tipo de dado, também de 32 bits, representa um valor de tempo. Cada unidade representa um centésimo de segundo. Poderia ser usado para indicar, por exemplo, por quanto tempo um determinado servidor está em execução.
- Opaque: um tipo de dado especial que permite que outros tipos possam ser representados para uma sequências de bytes, isto é, como um octect string. Imagine, por exemplo, que você precise enviar um número de dupla precisão (ponto flutuante). Seria possível fazer isto com o tipo opaque, ficando a decodificação/decodificação na responsabilidade dos agentes e gerentes. Dá para perceber que é possível colocar qualquer coisa aqui, não é ?
Com estes tipos já é possível pensar na representação dos dados da MIB. Como você deve ter percebido, cada um deles tem um propósito bem específico, não são simplesmente números com faixas diferentes. Tentei mostrar isso ao dar exemplos de uso de cada um deles.
Por exemplo, usar um Gauge no lugar de um Counter é um erro grave já que o Counter precisa ser crescente. No fundo, o SNMP poderia trabalhar apenas a com diferença entre o valor atual e o anterior, o que faz sentido para o Counter mas não para o Gauge.
Continuaremos com o assunto MIBs personalizadas no próximo post. Até lá !