9. 关联终止 (Termination of Association)
SCTP提供两种关联终止机制:正常关闭(Shutdown)和强制中止(Abort)。
9.1. 中止关联 (Abort of an Association)
ABORT块用于立即终止关联。这是一种异常终止,不保证数据传递。
9.1.1. 发送ABORT
端点可以 (MAY) 在以下情况下发送ABORT块:
- 检测到协议违规
- 接收到无法处理的错误
- 应用层请求立即终止
- 资源耗尽
ABORT块格式:
ABORT块包含:
- Chunk Type = 6
- T位:指示Verification Tag的使用
- 错误原因(可选):描述中止原因
9.1.2. 接收ABORT
收到ABORT块时,端点必须 (MUST):
1. 停止向该关联发送任何新数据
2. 丢弃所有未发送和未确认的数据
3. 向上层报告关联中止
4. 销毁TCB
5. 不发送任何响应
重要:ABORT是单向的,接收方不得 (MUST NOT) 发送任何响应。
9.1.3. ABORT的原因
常见的ABORT原因包括:
| 原因代码 | 名称 | 描述 |
|---|---|---|
| 1 | Invalid Stream Identifier | 无效的流标识符 |
| 2 | Missing Mandatory Parameter | 缺少强制参数 |
| 3 | Stale Cookie Error | 陈旧的Cookie |
| 4 | Out of Resource | 资源不足 |
| 5 | Unresolvable Address | 无法解析的地址 |
| 6 | Unrecognized Chunk Type | 无法识别的块类型 |
| 7 | Invalid Mandatory Parameter | 无效的强制参数 |
| 8 | Unrecognized Parameters | 无法识别的参数 |
| 9 | No User Data | 没有用户数据 |
| 10 | Cookie Received While Shutting Down | 关闭时收到Cookie |
| 11 | Restart with New Addresses | 使用新地址重启 |
| 12 | User Initiated Abort | 用户发起的中止 |
| 13 | Protocol Violation | 协议违规 |
9.1.4. T位的使用
T位 (T bit) 控制ABORT块中Verification Tag的选择:
T=0:
- 使用正常的Verification Tag
- 用于正常关联中的ABORT
T=1:
- 使用接收数据包中的Verification Tag
- 用于"Out of the Blue"数据包的响应
- 或者在不确定正确Tag时使用
9.2. 关闭关联 (Shutdown of an Association)
SHUTDOWN是正常的、有序的关联终止过程,确保所有数据都被可靠传递。
9.2.1. 关闭过程概述
正常关闭涉及三个块的交换:
终端A 终端Z
(无更多数据发送)
--------[SHUTDOWN]--------->
(传输剩余数据)
<------[SHUTDOWN ACK]-------
-----[SHUTDOWN COMPLETE]---->
双方销毁TCB
9.2.2. 启动SHUTDOWN
当ULP请求关闭关联时:
发送方行为:
1. 停止接受新的用户数据
2. 完成所有未发送数据的传输
3. 等待所有未确认数据被确认
4. 发送SHUTDOWN块,包含累积TSN Ack
5. 启动T2-shutdown定时器
SHUTDOWN块格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 7 | Flags | Length = 8 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cumulative TSN Ack |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9.2.3. 接收SHUTDOWN
收到SHUTDOWN块时,端点必须 (MUST):
1. 停止接受新的用户数据
2. 验证所有数据直到Cumulative TSN Ack都已发送
3. 如果有未发送的数据,继续传输
4. 一旦所有数据被确认,发送SHUTDOWN ACK
5. 启动T2-shutdown定时器
状态转换:
ESTABLISHED -> SHUTDOWN-RECEIVED
9.2.4. 发送SHUTDOWN ACK
SHUTDOWN ACK块格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 8 | Flags | Length = 4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
发送时机:
- 所有接收到的数据都已传递给ULP
- 所有本地数据都已被对等方确认
9.2.5. 接收SHUTDOWN ACK
收到SHUTDOWN ACK时,端点必须 (MUST):
1. 发送SHUTDOWN COMPLETE块
2. 停止T2-shutdown定时器
3. 向ULP报告关联关闭
4. 销毁TCB
状态转换:
SHUTDOWN-SENT -> CLOSED
9.2.6. SHUTDOWN COMPLETE
SHUTDOWN COMPLETE块格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 14 |Reserved |T| Length = 4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
T位使用:
- T=0:正常情况,使用本地Tag
- T=1:响应意外SHUTDOWN ACK时使用
接收SHUTDOWN COMPLETE:
1. 停止T2-shutdown定时器
2. 向ULP报告关联关闭
3. 销毁TCB
状态转换:
SHUTDOWN-ACK-SENT -> CLOSED
9.2.7. T2-shutdown定时器
目的:确保SHUTDOWN过程不会无限期等待。
超时处理:
如果在SHUTDOWN-SENT状态:
- 重传SHUTDOWN块
- 将RTO加倍
- 重启T2-shutdown定时器
如果在SHUTDOWN-ACK-SENT状态:
- 重传SHUTDOWN ACK块
- 将RTO加倍
- 重启T2-shutdown定时器
如果重传次数超过Association.Max.Retrans:
- 向ULP报告错误
- 销毁TCB
9.2.8. 关闭期间的数据处理
在SHUTDOWN-PENDING状态:
- 继续正常传输和接收数据
- 等待所有未确认数据被确认
在SHUTDOWN-SENT状态:
- 不接受新的用户数据
- 可以接收对等方的数据
- 发送SACK确认接收的数据
在SHUTDOWN-RECEIVED状态:
- 不接受新的用户数据
- 继续传输未发送的数据
- 接收并确认对等方的数据
在SHUTDOWN-ACK-SENT状态:
- 不接受新的用户数据
- 不传输新数据
- 重传SHUTDOWN ACK响应重复的SHUTDOWN
9.2.9. SHUTDOWN与ABORT的比较
| 特性 | SHUTDOWN | ABORT |
|---|---|---|
| 数据保证 | 所有已发送数据被确认 | 无数据保证 |
| 终止速度 | 较慢(有握手) | 立即 |
| 资源清理 | 优雅清理 | 立即清理 |
| 使用场景 | 正常关闭 | 错误或紧急情况 |
| 响应要求 | 需要对等方响应 | 单向,无响应 |
总结
SCTP提供灵活的关联终止机制:
- SHUTDOWN:适用于正常关闭,保证数据完整性
- ABORT:适用于异常情况,立即终止
最佳实践:
- 优先使用SHUTDOWN进行正常关闭
- 仅在错误或资源问题时使用ABORT
- 正确处理T2-shutdown定时器超时
- 实现适当的重传机制