# SCTP 包与 chunk · 数据的组织

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

- 作者：David（道雾轩）
- 专栏：音视频与 WebRTC 详解（https://daiw.org/manual/webrtc.md）
- 最后更新：2026-07-14
- 原文：https://daiw.org/manual/webrtc/sctp-chunks-packets
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# SCTP 包与 chunk · 数据的组织

[握手建好 association](https://daiw.org/manual/webrtc/sctp-association) 后，数据怎么组织传输？SCTP 的设计很模块化：一个**包（packet）** 里装一个或多个 **chunk（块）**，每个 chunk 是一种功能单元。理解这个“包 + 块”结构，就懂了 SCTP 数据流的骨架。dcSCTP 的 `net/dcsctp/packet/` 就是干这个的。

## 包 = 公共头 + 多个 chunk

<Callout type="info">
  **一个 SCTP 包 = 一个公共头（含[验证标签、校验和](https://daiw.org/manual/webrtc/sctp-chunks-packets)）+ **一个或多个 chunk**。每个 chunk 有自己的类型和内容，可以是数据、确认、控制……不同类型的 chunk 能**捆在同一个包**里一起发。** 这种“一包多块”的设计很灵活：

  - 一个包可以**只装一个 [DATA chunk](https://daiw.org/manual/webrtc/sctp-chunks-packets)**（传数据）。
  - 也可以把一个 [DATA chunk](https://daiw.org/manual/webrtc/sctp-chunks-packets) 和一个 [SACK chunk](https://daiw.org/manual/webrtc/sctp-reliability) **捆一起**（既传数据、又顺带确认对方的数据），一个包干两件事——省包。
  - 握手时，几个[控制 chunk](https://daiw.org/manual/webrtc/sctp-association) 也能捆一起。

  这和 [RTCP 的复合包](https://daiw.org/manual/webrtc/rtcp-reports)是一个思路：**把相关的多个单元捆进一个包，减少包数、提升效率**。SCTP 把这个思想做进了协议的基本结构里——“chunk”就是那个可自由组合的乐高积木。dcSCTP 的 `net/dcsctp/packet/` 负责这些 chunk 的**解析与构造**（[又是读写字节](https://daiw.org/manual/webrtc/rtp-packet)），`net/dcsctp/packet/chunk/` 下每种 chunk 一个类。
</Callout>

## 常见 chunk 类型

SCTP 定义了一堆 chunk 类型，几个关键的：

| chunk | 干什么 | 本教程 |
| --- | --- | --- |
| **DATA** | 载**用户数据**（你 send 的内容），带 [TSN、流 id](https://daiw.org/manual/webrtc/sctp-reliability) | 本章 |
| **SACK** | **选择性确认**——告诉对方“我收到了哪些 [TSN](https://daiw.org/manual/webrtc/sctp-reliability)” | [可靠性章](https://daiw.org/manual/webrtc/sctp-reliability) |
| **INIT / INIT-ACK** | [握手](https://daiw.org/manual/webrtc/sctp-association)第一二步 | [握手章](https://daiw.org/manual/webrtc/sctp-association) |
| **COOKIE-ECHO / -ACK** | [握手](https://daiw.org/manual/webrtc/sctp-association)第三四步 | 握手章 |
| **HEARTBEAT / -ACK** | 保活探测（路径还通吗） | 本章 |
| **FORWARD-TSN** | [部分可靠](https://daiw.org/manual/webrtc/sctp-partial-reliability)：跳过放弃的数据 | [部分可靠章](https://daiw.org/manual/webrtc/sctp-partial-reliability) |
| **SHUTDOWN / ABORT** | 关闭 / 中止 association | 本章 |

<Callout type="info">
  **DATA 和 SACK 是数据传输的主力二人组：DATA 载数据、SACK 确认——一来一回构成 SCTP 的[可靠传输](https://daiw.org/manual/webrtc/sctp-reliability)。** 每个 [DATA chunk](https://daiw.org/manual/webrtc/sctp-chunks-packets) 带一个 **TSN（Transmission Sequence Number，传输序号）** 唯一标识它，和一个 **stream id** 指明它属于[哪条流](https://daiw.org/manual/webrtc/sctp-streams)。接收方收到 DATA，回一个 [SACK](https://daiw.org/manual/webrtc/sctp-reliability) 说“TSN 到 X 我都收到了，另外 Y、Z 也收到了（但中间缺了）”——发送方据此知道[哪些要重传](https://daiw.org/manual/webrtc/sctp-reliability)。**SACK 的“选择性”（能报告不连续收到的块）比 [TCP 的累积确认](https://daiw.org/manual/webrtc/sctp-reliability)更精细**，重传更高效。这对二人组，是下一章[可靠性](https://daiw.org/manual/webrtc/sctp-reliability)的核心。
</Callout>

## 校验：验证标签

SCTP 包头里有个 **验证标签（verification tag）**——[握手时](https://daiw.org/manual/webrtc/sctp-association)双方各自生成一个随机标签给对方，之后每个发给对方的包都带上对方的标签。收到标签不对的包直接丢弃。这防止**旧连接的残包 / 伪造包**混入当前 association（有点像 [ICE 凭据](https://daiw.org/manual/webrtc/stun-protocol)、[DTLS](https://daiw.org/manual/webrtc/dtls-handshake) 的作用）。加上 SCTP 自带的校验和（检错），包的完整性有了双重保障。当然，在 WebRTC 里 SCTP 已经跑在 [DTLS 加密](https://daiw.org/manual/webrtc/srtp-encryption)之上，又多了一层安全。

## 小结与下一章

SCTP **包 = 公共头（验证标签 + 校验和）+ 一个或多个 chunk**，不同 chunk 能**捆一包**（[如 DATA + SACK](https://daiw.org/manual/webrtc/sctp-reliability)，省包，类似 [RTCP 复合包](https://daiw.org/manual/webrtc/rtcp-reports)）。chunk 类型：**DATA**（载数据，带 [TSN + 流 id](https://daiw.org/manual/webrtc/sctp-reliability)）、**SACK**（选择性确认）、[INIT/COOKIE](https://daiw.org/manual/webrtc/sctp-association)（握手）、HEARTBEAT（保活）、[FORWARD-TSN](https://daiw.org/manual/webrtc/sctp-partial-reliability)、SHUTDOWN 等。**DATA + SACK 是可靠传输的主力**。**验证标签**防残包 / 伪造。dcSCTP 的 `packet/` 负责解析构造。

有了 DATA 和 SACK，SCTP 怎么保证**可靠、有序**？下一章讲 TSN、SACK、重传。👉 [SCTP 可靠传输](https://daiw.org/manual/webrtc/sctp-reliability)。

## 参考资料

- [1] libwebrtc 源码.`net/dcsctp/packet/`、`net/dcsctp/packet/chunk/`（各 chunk 类）。
- [2] IETF RFC 9260「SCTP」§ 3（包与 chunk 格式）。
- [3] 关联[RTCP 复合包](https://daiw.org/manual/webrtc/rtcp-reports)——捆绑思想。
