跳到主要内容

4. SCTP 关联状态图

在 SCTP 关联的生命周期内, SCTP 端点上的关联会响应各种事件, 从一个状态推进到另一个状态. 可能推动关联状态变化的事件包括:

  • SCTP 用户原语调用, 例如 [ASSOCIATE],[SHUTDOWN],[ABORT]
  • 收到 INIT,COOKIE ECHO,ABORT,SHUTDOWN 等控制 chunk
  • 某些超时事件

下图中的状态图展示状态变化, 以及导致变化的事件和产生的动作. 请注意, 某些错误条件未在状态图中显示. 所有特殊情况的完整说明见正文.

注: Chunk 名称全部使用大写字母, 而参数名称采用首字母大写, 例如 COOKIE ECHO chunk type 与 State Cookie parameter.

如果可能有多个事件/消息导致同一状态转换, 则使用 (A),(B) 等标注.

以下是 SCTP 关联状态图的详细示意:

-----        --------              (from any state)
/ \ / \
/ rcv ABORT [ABORT] rcv INIT | |
| ---------- or ---------- --------------- |
| v v v
\ delete TCB snd ABORT generate Cookie \
+---------+ delete TCB snd INIT ACK ---| CLOSED |
+---------+ / \

[ASSOCIATE] / \
--------------- | |
create TCB | |
snd INIT | |
strt init timer rcv valid |
v | COOKIE ECHO |
+------------+ | (1) ----------------
| COOKIE-WAIT| | create TCB (2)
+------------+ | snd COOKIE ACK
| |
| rcv INIT ACK |
| ----------------- |
| snd COOKIE ECHO |
| stop init timer |
| strt cookie timer |
v |
+--------------+ |
| COOKIE-ECHOED| (3) |
+--------------+ |
| |
| rcv COOKIE ACK |
| ----------------- |
| stop cookie timer v
v v
+---------------+
| ESTABLISHED |
+---------------+

(仅从 ESTABLISHED 状态开始)

|                         /--------+--------\
|    [SHUTDOWN]           /                  \
|  -------------------|                      |
|   check outstanding  |                      |
|   DATA chunks       |                      |
|                      v                      |
|                 +---------+                 |
|                 |SHUTDOWN-|                 |  rcv SHUTDOWN
|                 |PENDING  |                 |------------------
|                 +---------+                 |  check outstanding
|                      |                      |  DATA chunks
|     No more outstanding                    |
|     ---------------------                   |
|     snd SHUTDOWN         |                  |
|     strt shutdown timer  |                  |
|                          v                  v
|                     +---------+       +-----------+
|                     |SHUTDOWN-|  (4)  | SHUTDOWN- |  (5,6)
|                     |SENT     |       | RECEIVED  |
|                     +---------+       +-----------+
|                          |                  \
|    (A) rcv SHUTDOWN ACK  |                   \
|  ----------------------  |                    \rcv:SHUTDOWN
|  stop shutdown timer     |                     \  (B)rcv SHUTDOWN
|  send SHUTDOWN COMPLETE  |                      \----------------------
|  delete TCB              |                       |  send SHUTDOWN ACK
|                          |                       |  start shutdown timer
|                          |                       |  move to SHUTDOWN-
|                          |                       |  ACK-SENT
|                          |                       |
|                          v                       v
|                      +-----------+               |
|                      | SHUTDOWN- |         (7)   |
|                      | ACK-SENT  |               |
|                      +-----------+               |
|                           |                      |
|    (C)rcv SHUTDOWN COMPLETE                     |
|  |----------------- |                            |
|  | stop shutdown timer                          |
|  | delete TCB       |                            |
|  |                                               |
|  | (D)rcv SHUTDOWN ACK                          |
|  |-------------- |                               |
|  | stop shutdown timer                          |
|  | send SHUTDOWN COMPLETE                       |
|  | delete TCB    |                               |
|  |                                               |
|  \                +---------+                   /
|   \-------------->| CLOSED  |<-----------------/
|                   +---------+

注​

注 1) 如果收到的 COOKIE ECHO 中的 State Cookie 无效 (即未通过完整性检查), 接收方必须静默丢弃该分组. 或者, 如果收到的 State Cookie 已过期 (见 Section 5.1.5), 接收方必须返回一个 ERROR chunk. 无论哪种情况, 接收方都保持 CLOSED 状态.

注 2) 如果 T1-init timer 到期, 端点必须重传 INIT 并重新启动 T1-init timer, 且不改变状态. 此操作必须最多重复 'Max.Init.Retransmits' 次. 之后, 端点必须中止初始化过程, 并向 SCTP 用户报告错误.

注 3) 如果 T1-cookie timer 到期, 端点必须重传 COOKIE ECHO 并重新启动 T1-cookie timer, 且不改变状态. 此操作必须最多重复 'Max.Init.Retransmits' 次. 之后, 端点必须中止初始化过程, 并向 SCTP 用户报告错误.

注 4) 在 SHUTDOWN-SENT 状态下, 端点必须立即确认任何收到的 DATA chunk.

注 5) 在 SHUTDOWN-RECEIVED 状态下, 端点不得接受其 SCTP 用户发出的任何新发送请求.

注 6) 在 SHUTDOWN-RECEIVED 状态下, 端点必须发送或重传数据, 并在队列中的所有数据都已发送后离开此状态.

注 7) 在 SHUTDOWN-ACK-SENT 状态下, 端点不得接受其 SCTP 用户发出的任何新发送请求.

使用 CLOSED 状态表示关联未创建 (即不存在).