SCTP 部分可靠 · 可靠性可调的杀手锏
数据通道能设「最多重传 3 次」或「50ms 内才重传」——这种介于 TCP 和 UDP 之间的部分可靠,是 SCTP 相对两者的杀手锏。这一章读 RFC 3758,讲清部分可靠怎么实现、FORWARD-TSN 如何跳过放弃的数据,以及它对应数据通道的哪些配置。
SCTP 部分可靠 · 可靠性可调的杀手锏
SCTP 默认可靠有序,但数据通道那章说过,它的可靠性可调——能设成“最多重传 3 次”或“50ms 内才重传”。这种介于 TCP(必达)和 UDP(尽力)之间的部分可靠(partial reliability),是 SCTP 独有的杀手锏(RFC 3758)。这一章看它怎么实现。
为什么要“部分”可靠
有些数据“过期作废”——实时游戏的玩家位置、视频会议的某些控制信令,旧的丢了不该重传(重传回来时它已经被更新的取代了,浪费带宽还添延迟)。部分可靠让你说“这条数据,重传几次 / 多久内还有效,过了就放弃”。 想象传玩家坐标,每 50ms 一次:如果第 1 帧的坐标丢了,你根本不想重传它——因为第 2、3 帧的新坐标早就来了,重传旧坐标毫无意义。TCP 却会死磕着重传那个旧坐标、还队头阻塞后面的新坐标——对实时数据是灾难。
部分可靠给了精确的中间档:
maxRetransmits—— 最多重传 N 次,还没成功就放弃(N=0 就是“尽力而为”,像 UDP)。maxPacketLifeTime—— 数据在 T 毫秒内才值得重传,超时就放弃。
这两个旋钮(映射自数据通道的配置),让你按数据的时效性精确选择可靠程度——传文件用完全可靠、传实时位置用不可靠、传偶尔重要的用“重传几次”。一条 association 里,不同流可以有不同的可靠性设置,各取所需。
FORWARD-TSN:告诉对方“这块我不发了”
部分可靠有个技术难点:发送方放弃了某个 TSN(不再重传),可接收方还在等这个 TSN(有序交付要求按序,它等着这个号来才能往下交)——岂不死锁?解决它的是 FORWARD-TSN chunk:
发送方放弃某些 TSN 后,发一个 FORWARD-TSN 告诉接收方“这些 TSN 我不发了,你别等了,把累积确认点往前移”——接收方于是跳过这些放弃的块,继续处理后面的。 这就解开了死锁:没有 FORWARD-TSN,接收方会永远等那个被放弃的 TSN,后面的数据全卡住;有了它,接收方知道“这几个号作废了”,累积点前移,数据流继续。
FORWARD-TSN 是部分可靠的关键机制——它让“放弃某些数据”这件事,能被双方一致地处理,不至于一方放弃、另一方傻等。dcSCTP 的 net/dcsctp/tx/ 在放弃块时生成 FORWARD-TSN,rx/ 处理它并前移接收窗口。这个“显式告知放弃、让对方跳过”的设计,是“优雅地丢弃”在传输层的体现:不是悄悄不发(那会卡死对方),而是明确协商放弃。
一张对比:TCP / SCTP-PR / UDP
部分可靠让 SCTP 覆盖了从 TCP 到 UDP 的整个可靠性谱系:
| TCP | SCTP 部分可靠 | UDP | |
|---|---|---|---|
| 可靠性 | 完全可靠 | 可调(重传次数 / 时限) | 不可靠 |
| 有序性 | 强制有序 | 可选(有序 / 无序) | 无序 |
| 队头阻塞 | 有 | 多流无阻塞 | 无 |
| 适合 | 文件 | 实时 + 可靠混合 | 纯实时 |
SCTP 部分可靠的价值,是一个协议覆盖整个谱系**——你不必在“TCP 太死板”和“UDP 太原始”之间二选一,而能为每种数据精确调档。** 一次通话里:传文件的数据通道用完全可靠有序(像 TCP)、传实时光标的用不可靠无序(像 UDP)、传偶尔重要状态的用“重传 2 次”(中间档)——它们复用同一个 association、同一条加密通路,各按自己的时效性选可靠度。这种灵活,是 TCP/UDP 都给不了的,也是 WebRTC 数据通道能力的根基。
小结与下一章
部分可靠(RFC 3758)是 SCTP 的杀手锏——让可靠性在 TCP 和 UDP 之间可调:maxRetransmits(最多重传 N 次)/ maxPacketLifeTime(T 毫秒内才重传),按数据时效性选档(实时数据旧的丢了不重传)。难点是放弃 TSN 后接收方别傻等——FORWARD-TSN 告知放弃、让对方跳过、前移累积点,解开死锁。一条 association 里不同流可有不同可靠性,一个协议覆盖从 TCP 到 UDP 的整个谱系。
可靠性讲完,还有“发多快”的问题——SCTP 也有流控和拥塞控制。下一章。👉 SCTP 流控与拥塞控制。
参考资料
- [1] libwebrtc 源码.
net/dcsctp/tx/(放弃块、FORWARD-TSN 生成)、net/dcsctp/packet/chunk/forward_tsn_chunk.h。 - [2] IETF RFC 3758「SCTP Partial Reliability Extension (PR-SCTP)」、RFC 8831(数据通道可靠性映射)。
- [3] 关联数据通道可靠性配置。