Skip to main content

6. RTP 控制协议 -- RTCP (RTP Control Protocol -- RTCP)

RTP 控制协议 (RTCP) 基于向会话中所有参与者定期传输控制数据包, 使用与数据包相同的分发机制。底层协议必须 (MUST) 提供数据和控制数据包的复用, 例如使用 UDP 的不同端口号。RTCP 执行四个功能:

  1. 质量反馈: 主要功能是提供有关数据分发质量的反馈。这是 RTP 作为传输协议的角色的组成部分, 与其他传输协议的流量和拥塞控制功能相关 (参见第 10 节关于拥塞控制的要求)。反馈可以直接用于控制自适应编码 [18,19], 但 IP 组播的实验表明, 从接收者获得反馈以诊断分发中的故障也至关重要。

  2. 持久标识符: RTCP 携带 RTP 源的持久传输级别标识符, 称为规范名称或 CNAME, 第 6.5.1 节。由于 SSRC 标识符可能会在发现冲突或重新启动程序时更改, 因此接收者需要 CNAME 来跟踪每个参与者。接收者还可能需要 CNAME 来关联给定参与者在一组相关 RTP 会话中的多个数据流, 例如同步音频和视频。

  3. 速率控制: 前两个功能要求所有参与者发送 RTCP 数据包, 因此必须控制速率以便 RTP 扩展到大量参与者。通过让每个参与者向所有其他参与者发送其控制数据包, 每个参与者都可以独立观察参与者的数量。此数字用于计算发送数据包的速率, 如第 6.2 节所述。

  4. 会话控制: 第四个可选 (OPTIONAL) 功能是传达最小的会话控制信息, 例如在用户界面中显示的参与者标识。这在"松散控制"的会话中最有用, 其中参与者进出而没有成员控制或参数协商。

功能 1-3 应当 (SHOULD) 在所有环境中使用, 特别是在 IP 组播环境中。RTP 应用程序设计者应当 (SHOULD) 避免只能在单播模式下工作且无法扩展到更大数量的机制。

6.1 RTCP 数据包格式 (RTCP Packet Format)

本规范定义了几种 RTCP 数据包类型以携带各种控制信息:

  • SR (Sender Report): 来自活动发送者的传输和接收统计信息
  • RR (Receiver Report): 来自非活动发送者的接收统计信息
  • SDES (Source Description): 源描述项, 包括 CNAME
  • BYE: 表示结束参与
  • APP: 应用特定功能

每个 RTCP 数据包都以类似于 RTP 数据包的固定部分开始, 后跟可能根据数据包类型而变化的结构化元素, 但必须 (MUST) 在 32 位边界上结束。对齐要求和每个数据包固定部分中的长度字段使 RTCP 数据包"可堆叠"。可以连接多个 RTCP 数据包而无需任何中间分隔符, 形成在底层协议 (例如 UDP) 的单个数据包中发送的复合 RTCP 数据包。

RTCP 复合数据包规则

所有 RTCP 数据包必须 (MUST) 在至少两个独立数据包的复合数据包中发送, 格式如下:

  • 加密前缀: 如果且仅当要根据第 9.1 节中的方法加密复合数据包时, 它必须 (MUST) 以为每个传输的复合数据包重新绘制的随机 32 位量作为前缀。

  • SR 或 RR: 复合数据包中的第一个 RTCP 数据包必须 (MUST) 始终是报告数据包, 以便于如附录 A.2 中所述的头部验证。即使没有发送或接收数据, 也必须 (MUST) 发送空的 RR。

  • SDES: 包含 CNAME 项的 SDES 数据包必须 (MUST) 包含在每个复合 RTCP 数据包中, 除非第 9.1 节中注明的情况。

  • BYE 或 APP: 其他 RTCP 数据包类型可以按任何顺序跟随, 但 BYE 应当 (SHOULD) 是使用给定 SSRC/CSRC 发送的最后一个数据包。

6.2 RTCP 传输间隔 (RTCP Transmission Interval)

RTP 设计为允许应用程序在从几个参与者到数千个参与者的会话大小范围内自动扩展。但是, 控制流量不是自限制的。如果来自每个参与者的接收报告以恒定速率发送, 则控制流量将随参与者数量线性增长。因此, 必须通过动态计算 RTCP 数据包传输之间的间隔来缩小速率。

对于每个会话, 假定数据流量受制于称为"会话带宽"的总限制, 该限制将在参与者之间分配。此带宽可能已被预留, 并由网络强制执行限制。控制流量应限制为会话带宽的一小部分且已知的分数: 小以使传输协议承载数据的主要功能不受损害; 已知以便控制流量可以包含在提供给资源预留协议的带宽规范中。

建议 (RECOMMENDED) 将为 RTCP 添加的会话带宽分数固定为 5%。还建议 (RECOMMENDED) 将 RTCP 带宽的 1/4 专用于正在发送数据的参与者, 以便在接收者数量众多但发送者数量较少的会话中, 新加入的参与者将更快地接收到发送站点的 CNAME。

最小间隔

计算的复合 RTCP 数据包传输之间的间隔还应当 (SHOULD) 有一个下限, 以避免当参与者数量很少时出现超过允许带宽的数据包突发。建议 (RECOMMENDED) 固定最小间隔的值为 5 秒。

实现可以 (MAY) 将最小 RTCP 间隔缩放为与会话带宽参数成反比的较小值, 但有以下限制:

  • 对于组播会话, 只有活动数据发送者可以 (MAY) 使用减小的最小值来计算传输复合 RTCP 数据包的间隔。
  • 对于单播会话, 非活动数据发送者的参与者也可以 (MAY) 使用减小的值, 并且在发送初始复合 RTCP 数据包之前的延迟可以 (MAY) 为零。
  • 建议 (RECOMMENDED) 的减小最小值(以秒为单位)为 360 除以会话带宽(以千比特/秒为单位)。

6.3 RTCP 数据包发送和接收规则 (RTCP Packet Send and Receive Rules)

第 6.3 节中描述的规则管理 RTCP 数据包的发送和接收, 以实现第 6.2 节中概述的目标。这些规则确保:

  • 所有参与者定期发送 RTCP 数据包
  • 传输速率随参与者数量缩放
  • 新参与者快速学习会话状态

计算 RTCP 传输间隔

参与者维护会话成员数量的估计, 用于计算 RTCP 传输间隔。详细算法在附录 A.7 中描述。

6.4 发送者和接收者报告 (Sender and Receiver Reports)

RTP 接收者为它们从中接收 RTP 数据包的每个源提供接收质量反馈。反馈信息包括:

  • 丢包数和累积丢包数
  • 最高接收序列号
  • 到达间隔抖动
  • 上次 SR 时间戳

6.4.1 SR: 发送者报告 RTCP 数据包

发送者报告数据包由正在发送数据的 RTP 会话的活动参与者定期发送。它包含三个部分:

  1. 头部: 标准 RTCP 头部
  2. 发送者信息: NTP 和 RTP 时间戳, 发送者的数据包计数和八位字节计数
  3. 接收者报告块: 零个或多个接收者报告块(最多 31 个)

发送者信息字段:

  • NTP timestamp (64 bits): 此报告发送时的绝对时间, 使用 NTP 格式
  • RTP timestamp (32 bits): 与 NTP 时间戳对应的 RTP 时间戳
  • sender's packet count (32 bits): 从传输开始到生成此 SR 数据包时发送的 RTP 数据包总数
  • sender's octet count (32 bits): 发送的有效载荷八位字节总数

6.4.2 RR: 接收者报告 RTCP 数据包

接收者报告数据包的格式与 SR 相同, 只是数据包类型字段包含常量 201, 并且省略了五个发送者信息的字(NTP 和 RTP 时间戳以及发送者的数据包和八位字节计数)。

6.5 SDES: 源描述 RTCP 数据包 (Source Description RTCP Packet)

SDES 数据包是由三个 32 位字组成的头部后跟零个或多个块的复合数据包, 每个块描述一个同步源 (SSRC) 或贡献源 (CSRC)。

6.5.1 CNAME: 规范端点标识符 SDES 项

CNAME 标识符应当 (SHOULD) 对每个用户是唯一的, 并且在每次重新启动后保持不变, 例如使用 "user@host" 格式或 UUID。

6.5.2-6.5.8 其他 SDES 项

  • NAME: 用户名称
  • EMAIL: 电子邮件地址
  • PHONE: 电话号码
  • LOC: 地理位置
  • TOOL: 应用程序或工具名称
  • NOTE: 关于源的临时通知
  • PRIV: 私有扩展

6.6 BYE: 告别 RTCP 数据包 (Goodbye RTCP Packet)

BYE 数据包表示一个或多个源不再活动。它包含一个或多个 SSRC/CSRC 标识符列表, 可选地后跟一个指示离开原因的文本字符串。

6.7 APP: 应用定义的 RTCP 数据包 (Application-Defined RTCP Packet)

APP 数据包用于实验性用途, 允许新应用程序和新功能的开发, 而无需数据包类型值注册。具有未识别名称的 APP 数据包应当 (SHOULD) 被忽略。


: 本章提供了 RTCP 协议的核心概念和主要数据包类型。完整的技术细节、算法实现和示例代码请参考 RFC 3550 完整文档。