Skip to main content

8. 故障管理 (Fault Management)

SCTP提供了强大的故障检测和恢复机制,以确保在网络故障情况下的可靠通信。

8.1. 端点故障检测 (Endpoint Failure Detection)

SCTP端点必须能够检测其对等端点的完全故障。

8.1.1. 关联级别的错误计数

每个SCTP关联维护一个关联错误计数器 (Association Error Counter)

  • 当任何目的地址的错误计数器达到阈值时,关联被视为失败
  • 当关联失败时,端点应该 (SHOULD) 向上层报告

8.1.2. 端点故障条件

端点被视为失败当:

  1. 所有目的地址都被标记为不活动
  2. 关联的总错误计数超过Association.Max.Retrans阈值

Association.Max.Retrans: 推荐默认值为10次重传尝试。

8.1.3. 故障响应

当检测到端点故障时:

1. 停止向该端点发送新数据
2. 向上层报告关联失败
3. 销毁传输控制块 (TCB)
4. 可选:发送ABORT块通知对等方

8.2. 路径故障检测 (Path Failure Detection)

SCTP可以检测单个传输路径的故障,而不影响整个关联(如果有其他活动路径可用)。

8.2.1. 路径级别的错误计数

每个目的传输地址维护一个路径错误计数器 (Path Error Counter)

  • 每次传输失败时递增
  • 成功传输或收到HEARTBEAT ACK时重置为0

8.2.2. 路径故障条件

路径被视为不活动当:

  1. 连续传输失败次数达到Path.Max.Retrans
  2. 连续HEARTBEAT失败次数达到Path.Max.Retrans

Path.Max.Retrans: 推荐默认值为5次重传尝试。

8.2.3. 路径状态管理

路径状态

  • Active (活动): 路径可用于数据传输
  • Inactive (不活动): 路径暂时不可用

状态转换

Active -> Inactive: 
- 连续失败达到Path.Max.Retrans

Inactive -> Active:
- 收到有效的HEARTBEAT ACK
- 成功传输数据并收到确认

8.2.4. 路径故障响应

当主路径失败时:

1. 将路径标记为不活动
2. 选择另一个活动路径作为新的主路径
3. 在新主路径上重传未确认的数据
4. 继续使用HEARTBEAT监控不活动路径

路径选择策略

  • 优先选择最近成功的路径
  • 考虑路径的RTT和拥塞状态
  • 轮询可用路径以分散负载(可选)

8.3. 路径心跳 (Path Heartbeat)

HEARTBEAT机制用于主动监控目的地址的可达性。

8.3.1. HEARTBEAT发送规则

端点应该 (SHOULD) 定期向每个空闲目的地址发送HEARTBEAT:

发送间隔

HB.interval: 推荐默认值为30秒
可配置范围: 1秒到数分钟

发送条件

  • 目的地在HB.interval时间内未发送任何数据
  • 目的地当前处于不活动状态(更频繁地探测)

HEARTBEAT内容

- Heartbeat Information TLV
- 发送时间戳
- 目的地址信息
- 可选:发送方特定信息

8.3.2. HEARTBEAT ACK处理

收到HEARTBEAT ACK时:

1. 计算RTT = 当前时间 - 发送时间戳
2. 更新目的地的RTO
3. 将目的地标记为活动
4. 重置路径错误计数器为0

8.3.3. HEARTBEAT超时处理

如果HEARTBEAT在RTO时间内未收到ACK:

1. 递增路径错误计数器
2. 如果错误计数 >= Path.Max.Retrans:
- 将路径标记为不活动
- 如果是主路径,选择新的主路径
3. 继续发送HEARTBEAT以探测恢复

8.3.4. 按需HEARTBEAT

除了定期HEARTBEAT,端点可以 (MAY) 在以下情况下发送按需HEARTBEAT:

  • 收到对等方的地址列表更新
  • 怀疑路径可能已恢复
  • 需要快速验证路径可达性

8.4. 处理"意外"数据包 (Handle "Out of the Blue" Packets)

"意外"数据包是指端点收到的与任何已知关联不匹配的SCTP数据包。

8.4.1. 识别意外数据包

数据包被视为"意外"当:

  1. Verification Tag不匹配任何现有关联
  2. 源地址和端口不匹配任何现有关联
  3. 目的端口匹配,但没有对应的关联

8.4.2. 意外数据包处理规则

收到意外INIT块

如果端点处于CLOSED状态:
- 按正常流程响应INIT ACK
否则:
- 静默丢弃

收到意外ABORT块

- 如果T位设置:
- 使用数据包的Verification Tag验证
- 静默接受并丢弃

收到意外SHUTDOWN COMPLETE块

- 验证T位
- 静默接受并丢弃

收到其他意外块

发送ABORT块:
- 使用接收数据包的Verification Tag
- 错误原因: "Out of the Blue"
- T位设置为1

8.4.3. ABORT块发送

发送ABORT块响应意外数据包时:

ABORT块格式:
- Chunk Type = 6
- T bit = 1
- Verification Tag = 接收数据包中的Verification Tag
- 错误原因 (可选):
- Cause Code = 8 (Out of the Blue)
- Cause Info = 接收数据包的副本

8.4.4. 安全考虑

处理意外数据包时的安全措施:

  1. 限制响应速率: 避免被用于放大攻击
  2. 验证源地址: 可能的情况下验证源地址的合法性
  3. 记录异常: 记录频繁的意外数据包以检测攻击

8.5. 验证标签使用 (Verification Tag Usage)

Verification Tag是SCTP的关键安全机制,用于防止数据包伪造和注入攻击。

8.5.1. Verification Tag规则

发送数据包时

- 使用对等方在INIT或INIT ACK中提供的Initiate Tag
- 作为SCTP通用头中的Verification Tag字段

接收数据包时

- 验证Verification Tag是否匹配本地的Tag
- 不匹配则丢弃数据包(特殊情况除外)

特殊情况

  • INIT块:Verification Tag必须为0
  • SHUTDOWN COMPLETE和ABORT:可以使用T位指示使用哪个Tag

8.5.2. 验证失败处理

收到Verification Tag不正确的数据包时:

如果是INIT块:
- 按8.4节处理
如果是ABORT或SHUTDOWN COMPLETE且T位=1:
- 使用数据包中的Verification Tag验证
否则:
- 静默丢弃数据包
- 不发送任何响应

总结

SCTP的故障管理机制提供了多层次的健壮性:

  1. 多路径冗余: 单个路径故障不影响关联
  2. 主动监控: HEARTBEAT机制主动检测路径状态
  3. 快速故障切换: 检测到故障后立即切换到备用路径
  4. 防御机制: Verification Tag防止恶意数据包注入
  5. 可配置阈值: 允许根据网络条件调整故障检测灵敏度

这些机制共同确保了SCTP在各种网络故障场景下的可靠性和可用性。