10. 与上层接口 (Interface with Upper Layer)
本章定义SCTP与上层协议(ULP)之间的接口服务。这些是抽象接口,具体实现可能因操作系统而异。
10.1. ULP到SCTP (ULP-to-SCTP)
ULP使用以下原语向SCTP发送命令和数据:
10.1.1. Initialize
格式:INITIALIZE([local port], [local eligible address list])
用途:初始化SCTP端点。
参数:
- local port:本地端口号(可选)
- local eligible address list:本地合格地址列表(可选)
结果:
- 成功:返回本地端点句柄
- 失败:返回错误代码
描述:
- 为SCTP端点分配资源
- 绑定到指定的本地端口和地址
- 如果未指定端口,系统自动分配
- 如果未指定地址,使用所有可用的本地地址
10.1.2. Associate
格式:ASSOCIATE(local SCTP instance name, destination transport addr, outbound stream count)
用途:请求与远程SCTP端点建立新的关联。
必需参数:
- local SCTP instance name:本地SCTP实例名称
- destination transport addr:目标传输地址(IP地址和端口)
- outbound stream count:请求的出站流数量
可选参数:
- destination transport addr list:目标传输地址列表(用于多宿主)
- stream payload protocol identifier:流有效载荷协议标识符
结果:
- COMMUNICATION UP:关联成功建立
- COMMUNICATION LOST:关联建立失败
描述:
1. 生成INIT块
2. 启动T1-init定时器
3. 发送INIT到目标地址
4. 等待INIT ACK
5. 发送COOKIE ECHO
6. 等待COOKIE ACK
7. 进入ESTABLISHED状态
10.1.3. Send
格式:SEND(association id, buffer address, byte count [,context] [,stream id] [,life time] [,destination transport address] [,unordered flag] [,no-bundle flag] [,payload protocol-id])
用途:将用户消息传递给SCTP进行传输。
必需参数:
- association id:关联标识符
- buffer address:缓冲区地址
- byte count:字节数
可选参数:
- context:用户上下文(用于错误报告)
- stream id:流标识符(默认0)
- life time:消息生存时间(毫秒)
- destination transport address:目标传输地址
- unordered flag:无序传递标志
- no-bundle flag:禁止捆绑标志
- payload protocol-id:有效载荷协议ID
结果:
- 成功:消息已接受传输
- 失败:返回错误代码
描述:
- 将用户数据分段为DATA块
- 根据流ID和SSN分配
- 如果指定了生存时间,超时则丢弃
- 默认使用主要目标地址
10.1.4. Shutdown
格式:SHUTDOWN(association id)
用途:优雅地关闭关联。
必需参数:
- association id:关联标识符
结果:
- SHUTDOWN COMPLETE:关闭成功
- COMMUNICATION LOST:关闭失败
描述:
1. 停止接受新的用户数据
2. 完成所有未发送数据的传输
3. 等待所有数据被确认
4. 发送SHUTDOWN块
5. 等待SHUTDOWN ACK
6. 发送SHUTDOWN COMPLETE
7. 销毁TCB
10.1.5. Abort
格式:ABORT(association id [,Upper Layer Abort Reason])
用途:立即终止关联。
必需参数:
- association id:关联标识符
可选参数:
- Upper Layer Abort Reason:上层中止原因
结果:
- COMMUNICATION LOST:关联已中止
描述:
1. 发送ABORT块(包含原因)
2. 丢弃所有未发送和未确认数据
3. 销毁TCB
4. 向ULP报告COMMUNICATION LOST
10.1.6. Set Primary
格式:SET PRIMARY(association id, destination transport address)
用途:设置主要目标地址。
必需参数:
- association id:关联标识符
- destination transport address:目标传输地址
结果:
- 成功:主要地址已更新
- 失败:地址不在关联的对等地址列表中
描述:
- 更改当前主要目标地址
- 用于流量工程或故障恢复
- 地址必须是关联的有效对等地址
10.1.7. Receive
格式:RECEIVE(association id, buffer address, buffer size)
用途:从SCTP接收数据。
必需参数:
- association id:关联标识符
- buffer address:接收缓冲区地址
- buffer size:缓冲区大小
返回值:
- byte count:接收的字节数
- stream id:流标识符
- stream sequence number:流序列号
- partial flag:部分传递标志
- delivery number:传递编号
- transport address:源传输地址
描述:
- 从接收队列中提取用户消息
- 如果没有数据,可能阻塞(取决于实现)
- 按流ID和SSN的顺序传递(除非无序)
10.1.8. Status
格式:STATUS(association id)
用途:查询关联的当前状态。
必需参数:
- association id:关联标识符
返回值:
- association connection state:关联连接状态
- destination transport address list:目标传输地址列表
- destination transport address reachability states:目标传输地址可达性状态
- current receiver window size:当前接收器窗口大小
- current congestion window sizes:当前拥塞窗口大小
- number of outbound streams:出站流数量
- number of inbound streams:入站流数量
- primary path:主要路径
10.1.9. Change Heartbeat
格式:CHANGE HEARTBEAT(association id, destination transport address, new state [,interval])
用途:启用或禁用特定目标地址的心跳。
必需参数:
- association id:关联标识符
- destination transport address:目标传输地址
- new state:新状态(启用/禁用)
可选参数:
- interval:心跳间隔(毫秒)
10.1.10. Request Heartbeat
格式:REQUEST HEARTBEAT(association id, destination transport address)
用途:请求向特定目标地址发送心跳。
必需参数:
- association id:关联标识符
- destination transport address:目标传输地址
用途:
- 测试特定路径的可达性
- 更新路径的RTT估计
10.1.11. Get SRTT Report
格式:GET SRTT REPORT(association id, destination transport address)
用途:获取特定目标地址的SRTT(平滑往返时间)。
返回值:
- srtt:当前SRTT值
- last update time:最后更新时间
10.1.12. Set Failure Threshold
格式:SET FAILURE THRESHOLD(association id, destination transport address, failure threshold)
用途:设置路径故障阈值。
参数:
- association id:关联标识符
- destination transport address:目标传输地址
- failure threshold:故障阈值
10.1.13. Set Protocol Parameters
格式:SET PROTOCOL PARAMETERS(association id, [,destination transport address,] protocol parameter list)
用途:设置SCTP协议参数。
可设置的参数:
- RTO.Initial:初始重传超时
- RTO.Min:最小重传超时
- RTO.Max:最大重传超时
- RTO.Alpha:SRTT估计器的alpha值
- RTO.Beta:SRTT估计器的beta值
- Max.Burst:最大突发大小
- Association.Max.Retrans:关联最大重传次数
- Path.Max.Retrans:路径最大重传次数
- Valid.Cookie.Life:有效Cookie生存时间
- SACK.Delay:SACK延迟
10.1.14. Destroy SCTP Instance
格式:DESTROY(local SCTP instance name)
用途:销毁SCTP实例。
描述:
1. 中止所有活动关联
2. 释放所有资源
3. 解除端口和地址绑定
10.2. SCTP到ULP (SCTP-to-ULP)
SCTP使用以下原语向ULP报告事件:
10.2.1. COMMUNICATION UP
格式:COMMUNICATION UP(association id, destination transport address list, outbound stream count, inbound stream count)
触发条件:
- 新关联已成功建立(ASSOCIATE完成)
- 作为被动侧接受新关联(收到INIT并完成四次握手)
参数:
- association id:新建立的关联标识符
- destination transport address list:对等地址列表
- outbound stream count:协商的出站流数量
- inbound stream count:协商的入站流数量
10.2.2. DATA ARRIVE
格式:DATA ARRIVE(association id, stream id, stream sequence number, flags, payload protocol identifier, user data)
触发条件:
- 从对等方接收到用户数据
参数:
- association id:关联标识符
- stream id:流标识符
- stream sequence number:流序列号
- flags:标志(例如无序标志)
- payload protocol identifier:有效载荷协议标识符
- user data:用户数据
描述:
- 通知ULP有新数据可用
- ULP应使用RECEIVE原语检索数据
- 数据按流ID和SSN的顺序传递(除非无序)
10.2.3. COMMUNICATION LOST
格式:COMMUNICATION LOST(association id, status)
触发条件:
- 关联失败或被中止
- 检测到对等端点故障
- 收到ABORT块
- SHUTDOWN失败
参数:
- association id:关联标识符
- status:失败原因
- Association exceeded maximum retransmissions:超过最大重传次数
- Peer sent ABORT:对等方发送ABORT
- Peer unexpectedly closed:对等方意外关闭
- Resources unavailable:资源不可用
10.2.4. COMMUNICATION ERROR
格式:COMMUNICATION ERROR(association id, error info)
触发条件:
- 检测到可恢复的通信错误
- 收到ERROR块
- 路径故障(但关联仍然活动)
参数:
- association id:关联标识符
- error info:错误信息
10.2.5. RESTART
格式:RESTART(association id, peer's new tag)
触发条件:
- 检测到对等端点已重启
参数:
- association id:关联标识符
- peer's new tag:对等方的新标签
描述:
- 通知ULP对等方已重启
- ULP应决定如何处理(重新建立或终止)
- 可能需要重新同步应用层状态
10.2.6. SHUTDOWN COMPLETE
格式:SHUTDOWN COMPLETE(association id)
触发条件:
- 优雅关闭过程成功完成
参数:
- association id:关联标识符
描述:
- 关联已成功关闭
- 所有数据已可靠传递
- TCB已销毁
10.2.7. SEND FAILURE
格式:SEND FAILURE(association id, data retrieval id, cause code, context)
触发条件:
- 数据由于某种原因未能传输
- 达到最大重传次数
- 消息生存时间已过期
参数:
- association id:关联标识符
- data retrieval id:数据检索标识符
- cause code:失败原因代码
- context:用户上下文(来自SEND原语)
原因代码:
- Message expired:消息已过期
- Association aborted:关联已中止
- Send failed:发送失败
10.2.8. NETWORK STATUS CHANGE
格式:NETWORK STATUS CHANGE(association id, destination transport address, new status)
触发条件:
- 目标传输地址的状态改变
- 路径变为活动或非活动
参数:
- association id:关联标识符
- destination transport address:目标传输地址
- new status:新状态
- Active:路径现在可用
- Inactive:路径现在不可用
- Unconfirmed:路径未确认
总结
SCTP的ULP接口提供:
- 完整的关联管理:初始化、建立、关闭、中止
- 灵活的数据传输:支持多流、有序/无序、生存时间
- 路径管理:心跳、故障检测、主要路径选择
- 状态监控:查询关联状态、网络状态变化通知
- 参数配置:运行时调整协议参数
最佳实践:
- 正确处理所有SCTP到ULP的通知
- 使用流ID进行逻辑数据分离
- 合理设置消息生存时间
- 监控网络状态变化并做出响应
- 优雅关闭优于强制中止