跳到主要内容

6. SNMPv3 消息格式

本节定义 SNMPv3 消息格式以及对应的版本特定 Message Processing Model (v3MP).

SNMPv3 消息定义如下:

SNMPv3Message ::= SEQUENCE {
msgVersion INTEGER ( 0 .. 2147483647 ),
msgGlobalData HeaderData,
msgSecurityParameters OCTET STRING,
msgData ScopedPduData
}

HeaderData ::= SEQUENCE {
msgID INTEGER (0..2147483647),
msgMaxSize INTEGER (484..2147483647),
msgFlags OCTET STRING (SIZE(1)),
msgSecurityModel INTEGER (1..2147483647)
}

ScopedPduData ::= CHOICE {
plaintext ScopedPDU,
encryptedPDU OCTET STRING -- encrypted scopedPDU value
}

ScopedPDU ::= SEQUENCE {
contextEngineID OCTET STRING,
contextName OCTET STRING,
data ANY -- e.g., PDUs as defined in [RFC3416]
}

6.1. msgVersion

msgVersion 字段设置为 snmpv3(3), 并将该消息标识为 SNMP version 3 消息.

msgVersion 字段由 Dispatcher 用于选择 Message Processing Model. 某个特定版本的 Message Processing Model 只能处理一种消息形式.

6.2. msgID

msgID 在两个 SNMP 实体之间用于协调请求消息和响应, 并由 v3MP 用于协调架构内不同子系统模型对消息的处理.

该字段范围为 0 到 2147483647. 在发送 SNMP 实体处, msgID 值由 Message Processing Model 选择, 选择方式应使其尽可能不同于最近一次交换中使用的值. 请求消息的 msgID 由发送 SNMP 实体处的 v3MP 用于协调原始请求与响应消息.

在接收 SNMP 实体处, 传入消息的 msgID 字段用于协调架构内不同子系统模型对消息的处理.

6.3. msgMaxSize

消息的 msgMaxSize 字段传达消息发送者支持的最大消息大小, 最小值为 484 个八位字节. 该字段在 SNMPv3 架构中用于确定可发送给该消息发送者的最大消息大小.

msgMaxSize 的值不传达发送 SNMP 实体可用于接收消息的缓冲区空间数量的任何信息.

6.4. msgFlags

消息的 msgFlags 字段包含若干控制消息处理的位字段:

+---------+---------+------------+
| auth | priv | reportable |
+---------+---------+------------+

auth 和 priv 字段用于选择安全级别:

  • auth = 0 且 priv = 0: noAuthNoPriv
  • auth = 1 且 priv = 0: authNoPriv
  • auth = 1 且 priv = 1: authPriv

priv 位指示 scopedPDU 是否加密. 如果设置了 priv 位, 消息中使用 scopedPduData 的 encryptedPDU 形式. 如果未设置 priv 位, 消息中使用 scopedPduData 的明文形式.

reportable 位是确定是否应发送 Report PDU 的辅助信息. 它只在无法解码消息的 PDU 部分时使用, 例如由于加密密钥不正确. 如果设置了 reportable 位, 可以发送 Report PDU. 如果未设置 reportable 位, 不应发送 Report PDU.

reportable 位应在请求消息中设置. reportable 位不应在响应消息中设置.

msgFlags 字段中的所有其他位均为保留位, 发送消息时 MUST 设置为零, 接收消息时 SHOULD 忽略.

6.5. msgSecurityModel

消息中的 msgSecurityModel 字段标识发送者使用哪个 Security Model 生成该消息. 接收者应使用该 Security Model 对消息执行安全处理.

msgSecurityModel 值也由 Dispatcher 用于选择处理该消息的 Security Model.

6.6. msgSecurityParameters

消息的 msgSecurityParameters 字段包含安全参数. 该字段中数据的内容和格式由 msgSecurityModel 字段标识的 Security Model 定义.

6.7. scopedPduData

scopedPduData 字段表示明文或加密的 ScopedPDU. 选择明文还是加密由 msgFlags 字段中的 priv 位决定.

如果 priv 位为 0, 则 scopedPduData 是明文 ScopedPDU. 如果 priv 位为 1, 则 scopedPduData 是包含加密 ScopedPDU 的 OCTET STRING.

6.8. scopedPDU

scopedPDU 包含用于标识管理上下文和 PDU 数据的信息.

6.8.1. contextEngineID

contextEngineID 字段唯一标识一个 SNMP 实体, 该实体可以实现具有特定名称的特定上下文.

contextEngineID 与 SNMP-FRAMEWORK-MIB [RFC3411] 中定义的 snmpEngineID 具有相同格式.

6.8.2. contextName

contextName 字段与 contextEngineID 结合, 标识特定上下文. contextName 是 OCTET STRING, 其含义由管理方定义. 它用于命名由 contextEngineID 标识的 SNMP 实体处的特定上下文.

6.8.3. data

data 字段包含 PDU. PDU 格式由 SNMP 版本决定. SNMPv3 使用 [RFC3416] 中的 PDU 定义.