SCTP 包与 chunk · 数据的组织
SCTP 的一个包里可以装多个「chunk」,每个 chunk 是一种功能单元——DATA 载数据、SACK 确认、INIT 握手……这一章讲清 SCTP 包与 chunk 的结构、常见 chunk 类型、以及「一包多块」的捆绑如何提升效率。
SCTP 包与 chunk · 数据的组织
握手建好 association 后,数据怎么组织传输?SCTP 的设计很模块化:一个包(packet) 里装一个或多个 chunk(块),每个 chunk 是一种功能单元。理解这个“包 + 块”结构,就懂了 SCTP 数据流的骨架。dcSCTP 的 net/dcsctp/packet/ 就是干这个的。
包 = 公共头 + 多个 chunk
一个 SCTP 包 = 一个公共头(含验证标签、校验和)+ 一个或多个 chunk。每个 chunk 有自己的类型和内容,可以是数据、确认、控制……不同类型的 chunk 能捆在同一个包里一起发。 这种“一包多块”的设计很灵活:
- 一个包可以只装一个 DATA chunk(传数据)。
- 也可以把一个 DATA chunk 和一个 SACK chunk 捆一起(既传数据、又顺带确认对方的数据),一个包干两件事——省包。
- 握手时,几个控制 chunk 也能捆一起。
这和 RTCP 的复合包是一个思路:把相关的多个单元捆进一个包,减少包数、提升效率。SCTP 把这个思想做进了协议的基本结构里——“chunk”就是那个可自由组合的乐高积木。dcSCTP 的 net/dcsctp/packet/ 负责这些 chunk 的解析与构造(又是读写字节),net/dcsctp/packet/chunk/ 下每种 chunk 一个类。
常见 chunk 类型
SCTP 定义了一堆 chunk 类型,几个关键的:
| chunk | 干什么 | 本教程 |
|---|---|---|
| DATA | 载用户数据(你 send 的内容),带 TSN、流 id | 本章 |
| SACK | 选择性确认——告诉对方“我收到了哪些 TSN” | 可靠性章 |
| INIT / INIT-ACK | 握手第一二步 | 握手章 |
| COOKIE-ECHO / -ACK | 握手第三四步 | 握手章 |
| HEARTBEAT / -ACK | 保活探测(路径还通吗) | 本章 |
| FORWARD-TSN | 部分可靠:跳过放弃的数据 | 部分可靠章 |
| SHUTDOWN / ABORT | 关闭 / 中止 association | 本章 |
校验:验证标签
SCTP 包头里有个 验证标签(verification tag)——握手时双方各自生成一个随机标签给对方,之后每个发给对方的包都带上对方的标签。收到标签不对的包直接丢弃。这防止旧连接的残包 / 伪造包混入当前 association(有点像 ICE 凭据、DTLS 的作用)。加上 SCTP 自带的校验和(检错),包的完整性有了双重保障。当然,在 WebRTC 里 SCTP 已经跑在 DTLS 加密之上,又多了一层安全。
小结与下一章
SCTP 包 = 公共头(验证标签 + 校验和)+ 一个或多个 chunk,不同 chunk 能捆一包(如 DATA + SACK,省包,类似 RTCP 复合包)。chunk 类型:DATA(载数据,带 TSN + 流 id)、SACK(选择性确认)、INIT/COOKIE(握手)、HEARTBEAT(保活)、FORWARD-TSN、SHUTDOWN 等。DATA + SACK 是可靠传输的主力。验证标签防残包 / 伪造。dcSCTP 的 packet/ 负责解析构造。
有了 DATA 和 SACK,SCTP 怎么保证可靠、有序?下一章讲 TSN、SACK、重传。👉 SCTP 可靠传输。
参考资料
- [1] libwebrtc 源码.
net/dcsctp/packet/、net/dcsctp/packet/chunk/(各 chunk 类)。 - [2] IETF RFC 9260「SCTP」§ 3(包与 chunk 格式)。
- [3] 关联RTCP 复合包——捆绑思想。