7. 错误处理
7. 错误处理 (Error Handling)
Diameter 中存在两类不同的错误: 协议错误 (protocol errors) 与应用错误 (application errors)。协议错误发生在基础协议层, 可能需要逐跳 (per-hop) 关注 (例如, 消息路由错误)。另一方面, 应用错误通常由 Diameter 应用中规定的功能出现问题而引起 (例如, 用户认证失败, 缺少 AVP)。
用于报告协议错误的 Result-Code AVP 取值必须仅出现在设置了 'E' 位的应答消息中。当收到导致协议错误的请求消息时, 返回的应答消息必须设置 'E' 位, 并将 Result-Code AVP 设为相应的协议错误值。当该应答沿请求发起方方向回传时, 每个代理 (proxy) 或中继 (relay) 代理可以对消息采取行动。
1. Request +---------+ Link Broken
+-------------------------->|Diameter |----///----+
| +---------------------| | v
+------+--+ | 2. answer + 'E' set | Relay 2 | +--------+
|Diameter |<-+ (Unable to Forward) +---------+ |Diameter|
| | | Home |
| Relay 1 |--+ +---------+ | Server |
+---------+ | 3. Request |Diameter | +--------+
+-------------------->| | ^
| Relay 3 |-----------+
+---------+
图 7: 协议错误导致应答消息的示例
图 7 展示了由 Diameter 中继向上游转发消息的示例。当 Relay 2 收到该消息并检测到无法将请求转发到归属服务器时, 返回的应答消息设置 'E' 位, 且 Result-Code AVP 设为 DIAMETER_UNABLE_TO_DELIVER。由于该错误属于协议错误类别, Relay 1 会采取特殊动作, 并据此尝试通过备用 Relay 3 路由消息。
+---------+ 1. Request +---------+ 2. Request +---------+
| Access |------------>|Diameter |------------>|Diameter |
| | | | | Home |
| Device |<------------| Relay |<------------| Server |
+---------+ 4. Answer +---------+ 3. Answer +---------+
(Missing AVP) (Missing AVP)
图 8: 应用错误应答消息示例
图 8 展示了导致应用错误的 Diameter 消息示例。发生应用错误时, 报告错误的 Diameter 实体清除命令标志 (Command Flags) 中的 'R' 位, 并添加带有适当取值的 Result-Code AVP。应用错误不需要任何代理或中继代理参与; 因此, 消息将回传给请求的发起方。
若应答消息本身含有错误, 应当通过发送 STR 或 ASR 消息终止相关会话。STR 中的 Termination-Cause AVP 可以填入适当取值以表明错误原因。在未维护状态或需要与对应 Diameter 实体进行某种错误恢复的情况下, 应用也可以发送应用专用请求, 以代替 STR 或 ASR 来指示错误。
某些 Result-Code AVP 应用错误要求在应答中额外携带 AVP。此时, 将 Result-Code AVP 设为指示该错误的 Diameter 节点必须添加这些 AVP。示例如下:
-
收到带有未识别 AVP 且其 'M' 位 (Mandatory bit, 强制位) 已置位的请求时, 发送应答, 其中 Result-Code AVP 设为 DIAMETER_AVP_UNSUPPORTED, Failed-AVP AVP 中包含违规 AVP。
-
收到某 AVP 的取值无法识别的请求时, 返回应答, Result-Code AVP 设为 DIAMETER_INVALID_AVP_VALUE, Failed-AVP AVP 中包含导致错误的 AVP。
-
收到的命令缺少在命令 CCF (Command Code Format) 中定义为必需的 AVP; 例如标记为 {AVP} 的 AVP。接收方发出应答, Result-Code 设为 DIAMETER_MISSING_AVP, 并构造一个 AVP, 其 AVP Code 及其他字段按所缺 AVP 的预期设置, 再将该构造的 AVP 加入 Failed-AVP AVP。
Result-Code AVP 描述 Diameter 节点在处理过程中遇到的错误。若存在多个错误, Diameter 节点必须仅报告其遇到的第一个错误 (检测顺序可由实现决定)。本 AVP 可描述的具体错误见下一节。