1. SNMP简要介绍
1.1 SNMP是什么
SNMP是英文Simple Network Management Protocol(简单网络管理协议)的缩写。从狭义上讲,它是一种专门用于网络管理软件和网络设备之间通信的协议,从广义上讲,它是一组为实现网络的自动化管理任务而制定的一系列通行标准,包括了管理信息的表示与命名、通信协议等内容。
简单地说,网络管理就是维护一个网络系统的正常运行。“正常运行”的意思是按照设计的目标,发挥应有的功能。根据功能的不同,将基于OSI参考互联模型的网络管理划分为以下几个部分:
(1)故障管理(fault management)
(2)计费管理(accounting management)
(3)配置管理(configuration management)
(4)性能管理(performance management)
(5)安全管理(security management)
1.2 SNMP结构
SNMP的组成可以分为两大部分:管理信息的定义与标识和SNMP实体之间的通信协议。
管理信息的定义与标识的核心内容是管理信息结构与标识(Structure and Identification of Management Information, SMI)和许多的管理信息库(Management Information Base,MIb)。SMI目前有SMIv1和SMIv2两个版本,它规定如何定义、标识管理信息。MIB遵循SMI规范,定义具体的管理信息。
通信协议主要内容分别在SNMPv1,SNMPv2和SNMPv3等标准定义,不同版本中的通信协议操作和通信协议安全机制不同。
SMI,MIB和SNMP构成了SNMP协议族的基石,堪称为组成SNMP协议族的“三驾马车”。
这三者的关系如下:
NMS <--- (SMI ---> MIB) ----> 代理(Agent)
|<----------------------------------------->|
运行网络管理程序的计算机称为网络管理工作站(Network Management Station, NMS),代理(Agent)是运行在被管理的网络设备上完成SNMP功能的进程。
SNMPv1, SNMPv2c和SNMPv3的区别和各自优缺点
1.3 SNMP相关协议
(1)SNMPv1
SNMPv1简单易于实施,被业界广泛接受并得以实施。但最大的缺点是安全性差,唯一的安全机制是基于共同体字符串(community strings),类似一个普通的字符串密码。
RFC1155 --- 基于TCP/IP的网络管理信息结构与标识
RFC1157 --- 简单网络管理协议
RFC1212 --- 简明MIB定义
RFC1213 --- 基于TCP/IP的网络管理信息库(MIB-II)
RFC1215 --- 定义SNMP陷阱消息宏
(2)SNMPv2c
大部分标称支持SNMPv2的设备,实际上实施的就是这个版本。
RFC1901 --- 介绍基于共同体的SNMPv2
RFC1905 --- SNMPv2协议操作
RFC1906 --- 传输层映射
(3)SNMPv3
RFC3410 --- Internet标准管理架构及适用说明
RFC3411 --- SNMP网络管理框架结构
RFC3412 --- SNMP消息处理与分发
RFC3413 --- SNMP应用
RFC3414 --- SNMPv3基于用户的安全模式
RFC3415 --- SNMPv3基于视图的访问控制模式
2. 抽象语法标记(ASN.1)
2.1 抽象语法标记是什么
在电信和计算机网络领域,ASN.1(Abstract Syntax Notation one)是一套标准,是描述数据的表示、编码、传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。
ASN.1是ISO和ITU-T的联合标准,最初是1984年的CCITT X.409:1984的一部分。ASN.1本身只定义了表示信息的抽象句法,但是没有限定其编码的方法。
ASN.1有严格的BNF(巴科斯范式BNF: Backus-Naur Form.的缩写)定义,具有简洁、精确和无二义性的特点。它有两种用途:一是用于如电子邮件等应用语法;二是用作定义特定协议实体PDU结构的一种手段。
ASN.1的引入,解决了不同网络设备制造商之间通信的问题。因为他是一种标准的、与具体的网络环境无关的语法格式。
2.2 巴克斯范式
巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。
在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。
在双引号外的字(有可能有下划线)代表着语法部分。
< > : 内包含的为必选项。
[ ] : 内包含的为可选项。
{ } : 内包含的为可重复0至无数次的项。
| : 表示在其左右两边任选一项,相当于"OR"的意思。
::= : 是“被定义为”的意思
2.3 ASN.1基础
2.3.1 类型分类
在ASN.1中,类型(type)是可以编码传输值得非空命名集合,值(value)是类型的一个实例,必须属于某个类型。类型可以分为简单类型,结构类型,定义类型和其他类型。
(1)简单类型
INTEGER:整型,BOOLEAN:布尔型,REAL:实型,OCTECT STRING:字节串型,OBJECT IDENTIFIER:标识符型,ENUMERATED:枚举型,NULL:空类型
(2)结构类型
SET:集合结构,SEQUENCE:序列结构,SET OF:元素相同的集合结构,SEQUENCE OF:元素相同的序列结构,
(3)其他类型
CHOICE:选择类型,ANY:可以使任意一种已知类型
(4)定义类型
前面所说的都是ASN.1标准中定义好的,所以又称为ASN.1内置类型,一般使用时,用户可利用这些类型再定义满足自己需求的类型。但是,这里所说的用户定义类型并没有产生新的ASN.1类型,仅仅是为ASN.1类型定义了一个新的类型引用。作用类似于高级程序语言中为数据类型定义别名。例如,C语言中使用typedef为已有类型定义别名。
2.3.2 类型定义和值定义
定义类型的语言如下: <类型名>::=<已有类型>
如下面语句使用内置类型INTEGER定义了一个新类型Age(更确切地说是一个新的类型引用)
Age::=INTEGER
赋值语句的语法如下:<值名><所属类型>::=<值>
例如,将整数赋值给一个属于Age类型的值age: age Age ::= 25
2.3.3 命名约定
在ASN.1中,可以出现的字母符号有以下几种:
(1)26个大写英文字母A~Z
(2)26个小写字母a~z
(3)10个阿拉伯数据0~9
(4)符号:=,{}《.()[]-'">|
除了值名用小写字母开头外,类型名和模块名要用大写字母开头,而宏名和保留关键字则全部要用大写字母。
2.4 ASN.1常用类型
2.4.1 简单类型
简单类型包括整数类型、逻辑类型、空类型、字节串类型和对象标识符类型,是ASN.1中最常用、最基本的类型。
(1)整数类型,包括正或负的任意整数或0
值符号语法: IntegerValue ::= SignedNumber | identifier
(2)逻辑类型
BooleanValue ::= TRUE | FALSE
(3)空类型
NullValue ::= NULL
(4)OCTECT STRING 字节串类型,0个或多个字节组成的序列
OctetStringType ::= OCTECT STRING
(5)OBJECT IDENTIFIER 对象标识符类型,可以用来标识任意的信息实体
Object identifier ::= OBJECT IDENTIFIER
2.4.2 结构类型
结构类型有SET,SET OF, SEQUENCE和SEQUENCE OF几种,其中前两种SNMP没有用到,所以这里只介绍后两种。
(1)SEQUENCE结构类型,组件可以是0个或多个不同类型组成的有序序列。
(2)SEQUENCE OF构造类型,由同一类型组成的有序序列。
2.4.3 其他类型
(1) CHOICE是选择类型,在列举的类型序列中选择一种。
(2)ANY是任意类型,可以是ASN.1或其他标准定义的任意一种类型。
2.4.4 标签类型和字类型
(1)标签类型
标签类型的定义分为直接方式和间接方式两种,而最常用的是间接方式。
间接方式定义: <类型名> ::= [ [类别名] 标志号 ] IMPLICIT<基础类型>
直接方式定义: <类型名> ::= [ [类别名] 标志号 ] EXPLICIT <基础类型>
(2)字类型
如类型A的值集合石另一个类型B的值集合的子集,那么类型A称为类型B的子类型,例如,类型定义语句:
Subint ::= INTEGER (0..25) 定义类型Subint是INTEGER类型的子类型。
复杂的子类型使用以下的关键字:
SIZE --- 大小,长度范围
FROM --- 由限制字符所组成的字符串
INTERSECTION --- 交集
UNION --- 并集,与|相同
EXCEPT --- 除....之外
ALL --- 包括.....的全部
2.5 ASN.1模块
模块的格式如下:
<模块名> DEFINITIONS ::=
BEGIN
EXPORTS 部分(可选)
IMPORTS 部分(可选)
<模块体>
END
注:本文大部分资料都来自《精通SNMP》武孟军 著