本文目录导读:

SCTP(流控制传输协议)的流控制机制与TCP类似,但由于其多流(Multi-Streaming)特性,在细节上有所不同,SCTP的流控制主要依赖接收端窗口和发送端窗口的结合,同时引入了慢启动和拥塞避免算法,以下是SCTP流控制的核心机制:
基本流控机制:接收窗口(rwnd)
与TCP一样,SCTP使用接收窗口(Receiver Window, rwnd) 来控制发送端的数据量,防止接收端缓冲区溢出。
- 工作方式:接收端在SCTP的SACK块中通告自己的
a_rwnd(Advertised Receiver Window),告诉发送端自己还有多少可用缓冲区。 - 发送限制:发送端未确认的数据总量不能超过接收端的
rwnd。 - 动态调整:当接收端缓冲区变满,
rwnd减小;当数据被应用层读取,rwnd增大。
注意:由于SCTP支持多流,但
rwnd是关联级别的(per association),不是每个流独立的,一个关联内的所有流共享同一个接收窗口。
与TCP不同的流控细节
(1)消息边界与部分确认
- SCTP是面向消息的(对应TCP的字节流),接收端必须完全接收一个完整的消息(chunk)后才能递交给应用层。
- 即使接收窗口非零,但如果下一条消息的前几个字节(chunk)还没到,接收端可能无法处理后续数据,导致接收窗口阻塞。
(2)多流不影响流控窗口
- SCTP的多流(stream)可以独立保证消息的顺序交付(比如Stream 1和Stream 2的消息可以乱序到达,但各自有序)。
- 但流控制窗口是关联级别共享的,一个流发送速度太快,会占用整个关联的窗口,影响其他流。
(3)SACK与流控
- SCTP的SACK(Selective Acknowledgment)不仅可以确认已收到的chunk,还能报告接收端当前的可用窗口大小(
a_rwnd)。 - 发送端收到SACK后,会更新自己的
cur_rwnd(当前接收窗口),并据此调整发送速率。
流控与拥塞控制的配合
SCTP将流控(防止接收端过载)与拥塞控制(防止网络过载)分开处理:
- 流控窗口(rwnd):由接收端控制,通过SACK通告。
- 拥塞窗口(cwnd):由发送端根据网络拥塞情况动态调整(使用类似TCP的慢启动、拥塞避免、快速重传)。
- 实际发送窗口 = min(
rwnd,cwnd)
流控相关的特殊场景处理
(1)接收窗口为0时的探测
当接收端通告 rwnd=0时,发送端会停止发送数据,但会启动零窗口探测(Zero Window Probe,ZWP):
- 发送端每隔RTO(Retransmission Timeout)发送一个小的探测chunk。
- 接收端收到后,回复SACK并通告当前
rwnd(如果已有可用空间)。
(2)接收窗口的更新
- 当接收端应用层读取数据后,接收端会立即发送一个SACK给发送端,告知新的更大的
rwnd(称为窗口更新)。 - 发送端收到窗口更新后,可以恢复发送。
(3)多流下的窗口饥饿问题
- 由于窗口是关联共享的,如果某个流发送了大量低优先级数据,可能占用所有窗口,导致其他高优先级流无法发送。
- 解决方案:应用层可以自行对多流进行优先级调度,或SCTP选择使用部分可靠SCTP(PR-SCTP)来丢弃超时未发送的消息。
流控制的关键参数
| 参数 | 描述 | 影响 |
|---|---|---|
a_rwnd |
接收端在SACK中通告的可用窗口大小 | 限制发送端未确认数据量 |
cur_rwnd |
发送端维护的当前接收窗口估计值 | 决定实际发送数据量 |
cwnd |
发送端拥塞窗口 | 与网络拥塞相关,叠加于流控 |
flight_size |
已发送但未确认的数据量 | 发送端必须保证 flight_size ≤ cur_rwnd |
SCTP的流控制是基于接收端窗口(rwnd)+ 拥塞窗口(cwnd)的联合控制,
- rwnd 保护接收端缓冲区不溢出(端到端流控)。
- cwnd 保护网络不会过载(拥塞控制)。
- 多流 不影响窗口计算(窗口是关联级别共享),但可能导致低优先级流抢占资源。
实际应用中,SCTP的流控通常比TCP更灵活,因为SCTP支持部分确认(SACK)、消息边界保护以及多流并行处理,但开发者需要理解其共享窗口特性对多流可能造成的干扰。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。