跳到主要内容

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