SCTP 包与 chunk · 数据的组织

SCTP 的一个包里可以装多个「chunk」,每个 chunk 是一种功能单元——DATA 载数据、SACK 确认、INIT 握手……这一章讲清 SCTP 包与 chunk 的结构、常见 chunk 类型、以及「一包多块」的捆绑如何提升效率。

作者 David更新于 第 80 篇(共 112 篇)

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本章

DATA 和 SACK 是数据传输的主力二人组:DATA 载数据、SACK 确认——一来一回构成 SCTP 的可靠传输。 每个 DATA chunk 带一个 TSN(Transmission Sequence Number,传输序号) 唯一标识它,和一个 stream id 指明它属于哪条流。接收方收到 DATA,回一个 SACK 说“TSN 到 X 我都收到了,另外 Y、Z 也收到了(但中间缺了)”——发送方据此知道哪些要重传。SACK 的“选择性”(能报告不连续收到的块)比 TCP 的累积确认更精细,重传更高效。这对二人组,是下一章可靠性的核心。

校验:验证标签

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 复合包——捆绑思想。

本页目录