5.6. 对等状态机 (Peer State Machine)
本节给出所有 Diameter 实现必须遵守的有限状态机 (finite state machine). 与各对等端通信时, 每个 Diameter 节点必须遵循下文状态机. 多个动作用逗号分隔, 必要时可续行. 状态与下一状态同理, 必要时可跨行.
本状态机与 [RFC3539] 中的状态机紧密耦合, 后者用于打开, 关闭, 故障转移, 探测与重新打开传输连接. 特别地, [RFC3539] 要求使用监视消息探测连接; 对 Diameter 而言应使用 DWR 与 DWA 消息.
前缀 I- 表示发起方 (连接方) 连接, 前缀 R- 表示响应方 (监听方) 连接. 无前缀时表示无论事件发生在哪条连接上, 事件或动作相同.
状态机的稳定状态为 Closed, I-Open 与 R-Open, 其余均为中间状态. I-Open 与 R-Open 除使用的传输连接是发起方还是响应方外, 语义等价.
CER 消息总是在发起连接上, 于连接请求成功完成后立即发送. 若发生选举 (election), 两条连接之一将关闭. 若本地 Diameter 实体的 Origin-Host 字典序高于对等端, 则保留响应方连接; 若对等端 Origin-Host 更高, 则保留发起方连接. 后续所有消息都在保留的连接上发送. 注意, 一侧对等端选举结果与另一侧保证相反.
对 TLS/TCP 与 DTLS/SCTP, 建议在双方仍处于关闭 (closed) 状态, 尚未交换任何 Diameter 消息之前就开始 TLS/TCP 与 DTLS/SCTP 握手. 应在发送任何 CER 或 CEA 之前建立 TLS/TCP 与 DTLS/SCTP 连接, 以保护双方能力信息. 状态机进入关闭状态时, 应断开 TLS/TCP 与 DTLS/SCTP 连接. 若连接的响应方不符合本文档 (即旧实现未准备在关闭状态接受 TLS/TCP 与 DTLS/SCTP 连接), 初次 TLS/TCP 与 DTLS/SCTP 连接尝试将失败. 发起方随后可经 TCP 或 SCTP 连接, 并在双方处于打开 (open) 状态时再发起 TLS/TCP 与 DTLS/SCTP 握手. 若握手成功, 之后所有消息经 TLS/TCP 与 DTLS/SCTP 发送. 若握手失败, 双方进入关闭状态.
该状态机仅约束 Diameter 实现从线上事件呈现给对等端的行为.
产生等价结果的任何实现均视为合规.
状态转换表 (State transition table)
state event action next state
-----------------------------------------------------------------
Closed Start I-Snd-Conn-Req Wait-Conn-Ack
R-Conn-CER R-Accept, R-Open
Process-CER,
R-Snd-CEA
Wait-Conn-Ack I-Rcv-Conn-Ack I-Snd-CER Wait-I-CEA
I-Rcv-Conn-Nack Cleanup Closed
R-Conn-CER R-Accept, Wait-Conn-Ack/Elect
Process-CER,
Elect
Timeout Error Closed
Wait-I-CEA I-Rcv-CEA Process-CEA I-Open
R-Conn-CER R-Accept, Wait-Returns
Process-CER,
Elect
I-Peer-Disc I-Disc Closed
I-Rcv-Non-CEA Error Closed
Timeout Error Closed
Wait-Conn-Ack/ I-Rcv-Conn-Ack I-Snd-CER,Elect Wait-Returns
Elect I-Rcv-Conn-Nack R-Snd-CEA R-Open
R-Peer-Disc R-Disc Wait-Conn-Ack
R-Conn-CER R-Reject Wait-Conn-Ack/Elect
Timeout Error Closed
Wait-Returns Win-Election I-Disc,R-Snd-CEA R-Open
I-Peer-Disc I-Disc, R-Snd-CEA R-Open
I-Rcv-CEA R-Disc I-Open
R-Peer-Disc R-Disc Wait-I-CEA
R-Conn-CER R-Reject Wait-Returns
Timeout Error Closed
R-Open Send-Message R-Snd-Message R-Open
R-Rcv-Message Process R-Open
R-Rcv-DWR Process-DWR, R-Open
R-Snd-DWA
R-Rcv-DWA Process-DWA R-Open
R-Conn-CER R-Reject R-Open
Stop R-Snd-DPR Closing
R-Rcv-DPR R-Snd-DPA Closing
R-Peer-Disc R-Disc Closed
I-Open Send-Message I-Snd-Message I-Open
I-Rcv-Message Process I-Open
I-Rcv-DWR Process-DWR, I-Open
I-Snd-DWA
I-Rcv-DWA Process-DWA I-Open
R-Conn-CER R-Reject I-Open
Stop I-Snd-DPR Closing
I-Rcv-DPR I-Snd-DPA Closing
I-Peer-Disc I-Disc Closed
Closing I-Rcv-DPA I-Disc Closed
R-Rcv-DPA R-Disc Closed
Timeout Error Closed
I-Peer-Disc I-Disc Closed
R-Peer-Disc R-Disc Closed