4. 抽象服务接口 (Abstract Service Interfaces)
4. 抽象服务接口 (Abstract Service Interfaces)
本节描述 SNMP 架构主要组件之间的 abstract service interfaces. 这些接口使用 abstract primitives 定义, abstract primitives 表示必须在组件之间传递的信息, 但不规定这些信息如何传递.
abstract service interfaces 被组织为若干类别:
- Dispatcher Primitives: applications 与 Dispatcher 之间的接口
- Message Processing Subsystem Primitives: Dispatcher 与 Message Processing Models 之间的接口
- Access Control Subsystem Primitives: applications 与 Access Control Subsystem 之间的接口
- Security Subsystem Primitives: Message Processing Models 与 Security Models 之间的接口
4.1. Dispatcher Primitives
Dispatcher 为 applications 提供发送和接收 SNMP messages 的服务. 它充当消息和 PDUs 路由的中心点.
4.1.1. 生成外发请求或通知 (Generate Outgoing Request or Notification)
applications 使用 sendPdu primitive 请求 Dispatcher 发送包含 PDU 的 SNMP message.
Primitive:
statusInformation =
sendPdu(
IN transportDomain
IN transportAddress
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN expectResponse
IN sendPduHandle
OUT destTransportDomain
OUT destTransportAddress
)
参数 (Parameters):
transportDomain: 要使用的传输协议 (例如 UDP)transportAddress: 目的地址messageProcessingModel: 要使用的消息格式securityModel: 要使用的 security modelsecurityName: 代表其发送消息的 principalsecurityLevel: 安全级别 (noAuthNoPriv, authNoPriv, 或 authPriv)contextEngineID: context engine IDcontextName: context namepduVersion: PDU 版本PDU: 要发送的 PDUexpectResponse: 是否预期收到响应sendPduHandle: 用于标识此请求的句柄destTransportDomain: (OUT) 实际使用的 transport domaindestTransportAddress: (OUT) 实际使用的 transport addressstatusInformation: (OUT) 成功或错误指示
4.1.2. 处理入站请求或通知 PDU (Process Incoming Request or Notification PDU)
Dispatcher 使用 processPdu primitive 将入站请求或通知 PDU 交付给 application.
Primitive:
processPdu(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN maxSizeResponseScopedPDU
IN stateReference
)
参数 (Parameters):
messageProcessingModel: 所使用的消息格式securityModel: 所使用的 security modelsecurityName: 代表其发送消息的 principalsecurityLevel: 应用于该消息的安全级别contextEngineID: context engine IDcontextName: context namepduVersion: PDU 版本PDU: 收到的 PDUmaxSizeResponseScopedPDU: 响应的最大大小stateReference: 对缓存状态信息的引用
4.1.3. 生成外发响应 (Generate Outgoing Response)
applications 使用 returnResponsePdu primitive 请求 Dispatcher 发送响应消息.
Primitive:
result =
returnResponsePdu(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN maxSizeResponseScopedPDU
IN stateReference
IN statusInformation
)
参数 (Parameters):
messageProcessingModel: 要使用的消息格式 (来自 processPdu)securityModel: 要使用的 security model (来自 processPdu)securityName: principal (来自 processPdu)securityLevel: 安全级别 (来自 processPdu)contextEngineID: context engine ID (来自 processPdu)contextName: context name (来自 processPdu)pduVersion: PDU 版本 (来自 processPdu)PDU: 要发送的响应 PDUmaxSizeResponseScopedPDU: 响应的最大大小 (来自 processPdu)stateReference: 状态信息 (来自 processPdu)statusInformation: 关于请求处理的状态信息result: (OUT) 成功或错误指示
4.1.4. 处理入站响应 PDU (Process Incoming Response PDU)
Dispatcher 使用 processResponsePdu primitive 将响应 PDU 交付给 application.
Primitive:
processResponsePdu(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN statusInformation
IN sendPduHandle
)
参数 (Parameters):
messageProcessingModel: 所使用的消息格式securityModel: 所使用的 security modelsecurityName: principalsecurityLevel: 所应用的安全级别contextEngineID: context engine IDcontextName: context namepduVersion: PDU 版本PDU: 收到的响应 PDUstatusInformation: 关于 message processing 的状态信息sendPduHandle: 来自原始 sendPdu 请求的句柄
4.1.5. 注册处理 SNMP PDUs 的职责 (Registering Responsibility for Handling SNMP PDUs)
applications 必须向 Dispatcher 注册, 以接收特定类型的 PDUs.
注册 primitive (Primitive for registration):
statusInformation =
registerContextEngineID(
IN contextEngineID
IN pduType
)
注销 primitive (Primitive for unregistration):
unregisterContextEngineID(
IN contextEngineID
IN pduType
)
参数 (Parameters):
contextEngineID: 要为其注册的 context engine IDpduType: 要接收的 PDU 类型 (Get, GetNext, GetBulk, Set, Trap, InformRequest, 等)statusInformation: (OUT) 成功或错误指示
对于给定的 contextEngineID 和 pduType 组合, 同一时间只能有一个 application 注册.
4.2. Message Processing Subsystem Primitives
Message Processing Subsystem 为 Dispatcher 提供服务, 用于准备消息并从消息中提取数据.
4.2.1. 准备外发 SNMP 请求或通知消息 (Prepare Outgoing SNMP Request or Notification Message)
Dispatcher 使用 prepareOutgoingMessage primitive 请求 Message Processing Model 准备待传输的消息.
Primitive:
statusInformation =
prepareOutgoingMessage(
IN transportDomain
IN transportAddress
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN expectResponse
IN sendPduHandle
OUT destTransportDomain
OUT destTransportAddress
OUT outgoingMessage
OUT outgoingMessageLength
)
参数 (Parameters):
- 输入参数与 sendPdu 的输入参数相同
outgoingMessage: (OUT) 已准备好传输的消息outgoingMessageLength: (OUT) 消息长度statusInformation: (OUT) 成功或错误指示
Message Processing Model 执行以下步骤:
- 使用 contextEngineID, contextName, 和 PDU 创建 scopedPDU
- 调用 Security Model 应用 security processing
- 将受保护的消息封装到适当的消息格式中
- 返回已准备好传输的完整消息
4.2.2. 准备外发 SNMP 响应消息 (Prepare an Outgoing SNMP Response Message)
Dispatcher 使用 prepareResponseMessage primitive 请求 Message Processing Model 准备待传输的响应消息.
Primitive:
result =
prepareResponseMessage(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN maxSizeResponseScopedPDU
IN stateReference
IN statusInformation
OUT destTransportDomain
OUT destTransportAddress
OUT outgoingMessage
OUT outgoingMessageLength
)
参数 (Parameters):
- 输入参数包含来自原始请求的状态信息
outgoingMessage: (OUT) 已准备好的响应消息outgoingMessageLength: (OUT) 消息长度result: (OUT) 成功或错误指示
Message Processing Model 执行以下步骤:
- 使用 stateReference 取回缓存信息
- 使用 contextEngineID, contextName, 和 PDU 创建 scopedPDU
- 调用 Security Model 应用 security processing
- 将受保护的消息封装到适当的消息格式中
- 返回已准备好传输的完整消息
- 释放缓存的状态信息
4.2.3. 从入站 SNMP 消息准备数据元素 (Prepare Data Elements from an Incoming SNMP Message)
Dispatcher 使用 prepareDataElements primitive 请求 Message Processing Model 从收到的消息中提取数据.
Primitive:
result =
prepareDataElements(
IN transportDomain
IN transportAddress
IN wholeMsg
IN wholeMsgLength
OUT messageProcessingModel
OUT securityModel
OUT securityName
OUT securityLevel
OUT contextEngineID
OUT contextName
OUT pduVersion
OUT PDU
OUT pduType
OUT sendPduHandle
OUT maxSizeResponseScopedPDU
OUT statusInformation
OUT stateReference
)
参数 (Parameters):
transportDomain: 消息到达时使用的传输协议transportAddress: 源地址wholeMsg: 收到的消息wholeMsgLength: 消息长度- 所有 OUT 参数都包含提取出的数据元素
result: (OUT) 成功或错误指示
Message Processing Model 执行以下步骤:
- 解析消息格式
- 调用 Security Model 处理 security
- 提取 scopedPDU
- 解析 scopedPDU 以提取 contextEngineID, contextName, 和 PDU
- 如果消息需要响应, 则缓存状态信息
- 返回所有提取出的数据元素
4.3. Access Control Subsystem Primitives
Access Control Subsystem 为 applications 提供服务, 用于判定是否应允许访问 managed object.
Primitive:
statusInformation =
isAccessAllowed(
IN securityModel
IN securityName
IN securityLevel
IN viewType
IN contextName
IN variableName
)
参数 (Parameters):
securityModel: 正在使用的 security modelsecurityName: 尝试访问的 principalsecurityLevel: 消息的安全级别viewType: 访问类型 (read, write, 或 notify)contextName: 正在访问的 contextvariableName: managed object 的 OIDstatusInformation: (OUT) 允许或拒绝
Access Control Model 根据其配置的策略判定是否应允许指定操作.
4.4. Security Subsystem Primitives
Security Subsystem 为 Message Processing Models 提供服务, 用于应用和检查 security.
4.4.1. 生成请求或通知消息 (Generate a Request or Notification Message)
Message Processing Models 使用 generateRequestMsg primitive 请求 Security Subsystem 对外发请求或通知消息应用 security processing.
Primitive:
statusInformation =
generateRequestMsg(
IN messageProcessingModel
IN globalData
IN maxMessageSize
IN securityModel
IN securityEngineID
IN securityName
IN securityLevel
IN scopedPDU
OUT securityParameters
OUT wholeMsg
OUT wholeMsgLength
)
参数 (Parameters):
messageProcessingModel: 正在使用的消息格式globalData: 消息格式特定的头部数据maxMessageSize: 支持的最大消息大小securityModel: 要使用的 security modelsecurityEngineID: authoritative engine IDsecurityName: principalsecurityLevel: 期望的安全级别scopedPDU: 要保护的 scoped PDUsecurityParameters: (OUT) security model 特定的参数wholeMsg: (OUT) 完整的受保护消息wholeMsgLength: (OUT) 消息长度statusInformation: (OUT) 成功或错误指示
4.4.2. 处理入站消息 (Process Incoming Message)
Message Processing Models 使用 processIncomingMsg primitive 请求 Security Subsystem 处理入站消息.
Primitive:
statusInformation =
processIncomingMsg(
IN messageProcessingModel
IN maxMessageSize
IN securityParameters
IN securityModel
IN securityLevel
IN wholeMsg
IN wholeMsgLength
OUT securityEngineID
OUT securityName
OUT scopedPDU
OUT maxSizeResponseScopedPDU
OUT securityStateReference
)
参数 (Parameters):
messageProcessingModel: 正在使用的消息格式maxMessageSize: 支持的最大消息大小securityParameters: 来自消息的 security model 特定参数securityModel: 消息中指示的 security modelsecurityLevel: 期望的安全级别wholeMsg: 收到的消息wholeMsgLength: 消息长度securityEngineID: (OUT) authoritative engine IDsecurityName: (OUT) principalscopedPDU: (OUT) 提取并验证后的 scoped PDUmaxSizeResponseScopedPDU: (OUT) 响应的最大大小securityStateReference: (OUT) 对缓存 security state 的引用statusInformation: (OUT) 成功或错误指示
Security Model 执行以下步骤:
- 验证消息真实可信 (如果需要 authentication)
- 解密消息 (如果需要 privacy)
- 检查消息时效性 (以防止 replay attacks)
- 提取 scopedPDU
- 如果可能需要响应, 则缓存 security state
- 返回所有提取出的数据
4.4.3. 生成响应消息 (Generate a Response Message)
Message Processing Models 使用 generateResponseMsg primitive 请求 Security Subsystem 对外发响应消息应用 security processing.
Primitive:
statusInformation =
generateResponseMsg(
IN messageProcessingModel
IN globalData
IN maxMessageSize
IN securityModel
IN securityEngineID
IN securityName
IN securityLevel
IN scopedPDU
IN securityStateReference
OUT securityParameters
OUT wholeMsg
OUT wholeMsgLength
)
参数 (Parameters):
- 与 generateRequestMsg 类似, 但包含 securityStateReference
securityStateReference: 来自原始请求的缓存状态- 其他参数与 generateRequestMsg 类似
Security Model 使用缓存的 security state, 对响应应用与请求所用处理相同的 security processing.
4.5. 通用 Primitives (Common Primitives)
4.5.1. 释放状态引用信息 (Release State Reference Information)
组件使用 stateRelease primitive 释放缓存的状态信息.
Primitive:
stateRelease(
IN stateReference
)
参数 (Parameters):
stateReference: 对要释放的缓存状态的引用
当不再需要缓存状态信息时, 使用该 primitive 释放资源. 它通常在以下情况下调用:
- 响应已发送
- 发生错误且不会发送响应
- 等待响应时发生超时
4.6. 场景图 (Scenario Diagrams)
本节提供场景图, 展示常见操作中的 primitives 流程.
4.6.1. Command Generator 或 Notification Originator
下图展示 application 发起请求或通知时的流程:
Application Dispatcher Message Processing Security
Model Model
sendPdu ----------->
prepareOutgoing
Message -------->
generateRequestMsg -->
(apply security)
<------------------
<--------------
(send message to network)
(later, response arrives)
(receive message from network)
prepareData
Elements ------->
processIncomingMsg -->
(check security)
<------------------
<--------------
processResponsePdu <-
4.6.2. Command Responder Application 的场景图 (Scenario Diagram for a Command Responder Application)
下图展示 application 响应请求时的流程:
Application Dispatcher Message Processing Security
Model Model
(receive message from network)
prepareData
Elements ------->
processIncomingMsg -->
(check security)
<------------------
<--------------
processPdu <--------
(application processes request)
returnResponsePdu ->
prepareResponse
Message -------->
generateResponseMsg ->
(apply security)
<------------------
<--------------
(send message to network)
这些图说明了该架构的模块化设计, 以及不同 subsystems 之间清晰的关注点分离.