Skip to main content

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原因包括:

原因代码名称描述
1Invalid Stream Identifier无效的流标识符
2Missing Mandatory Parameter缺少强制参数
3Stale Cookie Error陈旧的Cookie
4Out of Resource资源不足
5Unresolvable Address无法解析的地址
6Unrecognized Chunk Type无法识别的块类型
7Invalid Mandatory Parameter无效的强制参数
8Unrecognized Parameters无法识别的参数
9No User Data没有用户数据
10Cookie Received While Shutting Down关闭时收到Cookie
11Restart with New Addresses使用新地址重启
12User Initiated Abort用户发起的中止
13Protocol 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的比较

特性SHUTDOWNABORT
数据保证所有已发送数据被确认无数据保证
终止速度较慢(有握手)立即
资源清理优雅清理立即清理
使用场景正常关闭错误或紧急情况
响应要求需要对等方响应单向,无响应

总结

SCTP提供灵活的关联终止机制:

  1. SHUTDOWN:适用于正常关闭,保证数据完整性
  2. ABORT:适用于异常情况,立即终止

最佳实践

  • 优先使用SHUTDOWN进行正常关闭
  • 仅在错误或资源问题时使用ABORT
  • 正确处理T2-shutdown定时器超时
  • 实现适当的重传机制