在SNMP中有两种通告类的消息,用于Agent主动向NMS上报非请求事件。它们分别是:TRAP和INFORM(SNMP v2及后续版本)。TRAP是无须NMS确认的通告消息,而INFORM则需要NMS确认。
SMIv1中使用TRAP-TYPE宏定义TRAP,这个版本中TRAP有0~6共7种,其中前6种为挂靠在某组织或企业OID下并具有通用的TRAP索引(见1.3.3节对TRAP含义的解释),通过该TRAP索引就可以确定TRAP的类型。最后一种TRAP为自定义TRAP,以数字6标识,它作为标准TRAP的扩展,补充了标准TRAP中不能覆盖的情况。它的实现方式是在TRAP-PDU报文的“企业指定域”中加入标识该TRAP的信息和OID。
SMIv2则使用宏NOTIFICATION-TYPE定义了两种非请求事件:TRAP和INFORM通告对象。按SMIv2定义的MIB中都应该使用该宏定义通告类事件。这一版本的TRAP是SNMP v2-MIB模块和RFC1573定义的:coldStart(1)、warmStart(2)、linkDown(3)、linkUp(4)、authenticationFailure(5)。其父节点的OID为1.3.6.1.6.3.1.1.5——iso.org.dod.internet.snmpV2.snmpModules.snmpMIB.snmpMIBObjects.snmpTraps。很明显这些数字是1~5,而不再是SMIv1版的0~5。并且这些TRAP都挂靠在指定的OID树下,具有自己的OID。它们有取代SMIv1中的TRAP-TYPE的原意在里面。
两个版本的TRAP相应的PDU为:SNMP v1 Trap-PDU、SNMP v2-Trap-PDU、Inform-Request-PDU。在实际上传TRAP的PDU中往往绑定更多的变量用于说明该TRAP更为全面的信息。
下面我们看看两者的宏定义。TRAP-TYPE宏的定义:
TRAP-TYPE MACRO ::=
BEGIN
TYPE NOTATION ::= "ENTERPRISE" value (enterprise OBJECT IDENTIFIER)
VarPart
DescrPart
ReferPart
VALUE NOTATION ::= value (VALUE INTEGER)
VarPart ::="VARIABLES" "{" VarTypes "}" | empty
VarTypes ::=VarType | VarTypes "," VarType
VarType ::=value (vartype ObjectName)
DescrPart ::="DESCRIPTION" value (description DisplayString)| empty
ReferPart ::="REFERENCE" value (reference DisplayString)| empty
END
VARIABLES部分,指明了上传该TRAP时应该携带的额外信息。一般来说该信息是某一个定义好的管理对象。通过在报文中绑定这样的管理对象,使得NMS能清晰地确定TRAP发生时的详细情况。该部分可以绑定多个对象,甚至可以把系统TRAP时的快照发送出去。这些绑定的对象按定义的顺序一一打包上传,不过报文长度不要超过484字节。
ENTERPRISE部分则指明了该TRAP是属于哪个已注册OID企业的。当该部分值为“snmp”(snmp OBJECT IDENTIFIER ::= {mib-2 11 })时,也就表明其是标准的TRAP了,且该值取节点sysObjectID的实例值。
NOTIFICATION-TYPE宏的定义:
NOTIFICATION-TYPE MACRO ::=
BEGIN
TYPE NOTATION ::=
ObjectsPart
"STATUS" Status
"DESCRIPTION" Text
ReferPart
VALUE NOTATION ::= value(VALUE Notif?icationName)
ObjectsPart ::= "OBJECTS" "{" Objects "}" | empty
Objects ::= Object| Objects "," Object
Object ::= value(ObjectName)
Status ::= "current" | "deprecated" | "obsolete"
ReferPart ::= "REFERENCE" Text | empty
Text ::= value(IA5String)
END
该宏中的OBJECTS部分代替了SMIv1版的VARIABLES。不过表示的含义基本相同。
上述宏的其他含义相信读者已经掌握,在此不再讲述。
NOTIFICATION-TYPE宏中,OBJECTS子句中定义的管理对象的MAX-ACCESS值不能是“not-accessible”,即至少能获取。其次,我们在定义TRAP时需要注意OID的赋值:往往将倒数第二个OID赋值为0,这主要是为了便于SMIv2版本的通告转化为SMIv1版本的TRAP,以及再次转化回来的内容而不丢失信息,如对于支持多版本的代理来说就有必要了。如果读者完全没有这方面的需求,按照正常定义对象的方式即可。请看下面的例子,它的倒数第二个OID值为0。
myMIBTraps OBJECT IDENTIFIER ::= {myMIB 2}
myMIBTrapPref?ix OBJECT IDENTIFIER ::= {myMIBTraps 0}
myNewTrap NOTIFICATION-TYPE
STATUS current
DESCRIPTION "for example"
::= {myMIBTrapPref?ix 1}
这里的myNewTrap的OID为x.2.0.1。