8. 故障管理 (Fault Management)
SCTP提供了强大的故障检测和恢复机制,以确保在网络故障情况下的可靠通信。
8.1. 端点故障检测 (Endpoint Failure Detection)
SCTP端点必须能够检测其对等端点的完全故障。
8.1.1. 关联级别的错误计数
每个SCTP关联维护一个关联错误计数器 (Association Error Counter):
- 当任何目的地址的错误计数器达到阈值时,关联被视为失败
- 当关联失败时,端点应该 (SHOULD) 向上层报告
8.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. 路径故障条件
路径被视为不活动当:
- 连续传输失败次数达到Path.Max.Retrans
- 连续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. 识别意外数据包
数据包被视为"意外"当:
- Verification Tag不匹配任何现有关联
- 源地址和端口不匹配任何现有关联
- 目的端口匹配,但没有对应的关联
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. 安全考虑
处理意外数据包时的安全措施:
- 限制响应速率: 避免被用于放大攻击
- 验证源地址: 可能的情况下验证源地址的合法性
- 记录异常: 记录频繁的意外数据包以检测攻击
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的故障管理机制提供了多层次的健壮性:
- 多路径冗余: 单个路径故障不影响关联
- 主动监控: HEARTBEAT机制主动检测路径状态
- 快速故障切换: 检测到故障后立即切换到备用路径
- 防御机制: Verification Tag防止恶意数据包注入
- 可配置阈值: 允许根据网络条件调整故障检测灵敏度
这些机制共同确保了SCTP在各种网络故障场景下的可靠性和可用性。