跳到主要内容

3.5. AVPF RTCP 调度算法 (AVPF RTCP Scheduling Algorithm)

令 S0 为 S 个发送端中的某一活跃发送端, N 为接收端数量, R 为其中之一.

假定 R 已确认在当前星座 (constellation) 下使用反馈机制是合理的 (高度依赖具体应用, 本文档不予规定).

再假定若不强制 Regular RTCP 分组之间的最小间隔则 T_rr_interval 为 0, 否则 T_rr_interval 取应用给定的有意义数值, 表示 Regular RTCP 分组之间的最小间隔.

在此前提下, 接收端 R MUST 使用以下规则, 以最小或完整复合 RTCP 分组传输一个或多个 FB 消息.

3.5.1. 初始化

初始时 R MUST 设 allow_early = TRUE, t_rr_last = NaN (非数, 即可与有效时刻区分的无效值).

此外, RTCP 变量按 [1] 初始化, 但 Tmin 初值例外: 点对点会话初始 Tmin 为 0; 多方会话 Tmin 初始化为 1.0 秒.

3.5.2. Early 反馈传输

假定 R 已在 tp 调度 (并于 tp 发送或抑制) 上一 Regular RTCP RR, 且已将下一次传输 (含 [1] 中的可能重考虑) 调度在 tn = tp + T_rr. 并假定最近一次 Regular RTCP 传输发生在 t_rr_last.

Early 反馈算法包含以下步骤:

  1. 在时刻 t0, R 发现需要传输一个或多个 FB 消息, 例如因媒体 "单元" 需 ACK 或 NACK, 并认为提供该反馈对发送端可能有用.

  2. R 首先检查是否已有含一个或多个 FB 消息的复合 RTCP 分组被调度传输 (Early 或 Regular).

    2a) 若有, 新 FB 消息 MUST 并入已调度的分组; 等待中的复合 RTCP 分组的调度 MUST 保持不变. 此时 SHOULD 合并可用反馈信息以尽量少产生 FB 消息. 立即动作到此结束.

    2b) 若尚无复合 RTCP 分组被调度, MUST 新建 (最小或完整) 复合 RTCP 分组, 并按如下选择 T_dither_max 的最小值:

    i) 若会话为点对点, 则

    T_dither_max = 0.

    ii) 若会话为多方, 则

    T_dither_max = l * T_rr

    其中 l=0.5.

    T_dither_max MAY 以其他方式计算 (例如基于 RTT), 但 MUST 在将来文档中规定; 且该将来规范 MUST 确保所有 RTP 接收端使用同一 T_dither_max 计算机制.

    上文给出的 T_dither_max 为最小值. 应用相关的反馈考虑可能使增大 T_dither_max 有意义, 由实现者裁量.

  3. 然后 R MUST 检查: 在 t0 触发的 Early RTCP 分组的时间范围内, 其下一次 Regular RTCP 是否已临近, 即是否 t0 + T_dither_max > tn.

    3a) 若是, MUST NOT 调度 Early RTCP; FB 消息 MUST 暂存, 纳入计划在 tn 发送的 Regular RTCP 分组. 立即动作到此结束.

    3b) 否则执行后续步骤.

  4. R MUST 检查是否允许发 Early RTCP, 即 allow_early == TRUE 与否.

    4a) 若 allow_early == FALSE, R MUST 检查下一次 Regular RTCP 的时刻:

    1. tn - t0 < T_max_fb_delay, 反馈尽管偏晚仍可能对发送端有用. 故 R MAY 创建 RTCP FB 消息, 纳入计划在 tn 的 Regular RTCP 分组.

    2. 否则 R MUST 丢弃该 RTCP FB 消息.

    立即动作到此结束.

    4b) 若 allow_early == TRUE, R MUST 将 Early RTCP 计划在 te = t0 + RND * T_dither_max, RND 为 0 到 1 上均匀分布的伪随机数.

  5. R MUST 检测来自 RTP 会话其他成员的 FB 与自身欲发送的 FB 是否重叠. 因此, 作为会话成员期间, R MUST 持续监视 (最小) 复合 RTCP 分组的到达, 并将其中每个 FB 消息至少保存 T_retention. 在按步骤 1--4 调度自身 FB 时, R MUST 检查在区间 [t0 - T_retention ; te] 内收到并存储及新到的 FB 消息, 并如下处理:

    5a) 若 R 理解所收 FB 语义且其内容为 R 欲发送反馈的超集, R MUST 丢弃自身 FB, MUST 将下一次 Regular RTCP 传输按原计算的 tn 重新调度.

    5b) 若 R 理解语义但所收内容不是超集, R SHOULD 按原计划发送自身 FB. 若待发送与已收反馈有重叠, 实际发送量由 R 决定: R MAY 原样发送, MAY 去除与已收反馈的冗余.

    5c) 若 R 不理解所收 FB 语义, R MAY 仍将自身 FB 作为 Early RTCP 调度, 或 MAY 按原 tn 重调度下一次 Regular RTCP, MAY 将 FB 附加到该 Regular 消息.

    注: 依 5c), 收到未知 FB 未必在某接收端触发抑制. 于是单一事件可能调度 M 种互不理解但各自合理的 FB, 大接收端组在效果上最多分成 M 个子组. 各子组内依 5a/5b 仍会抑制, 子组间不抑制, 发送端可能收到 O(M) 条 RTCP FB, 存在有限反馈内爆风险. 但发送端与接收端通常同属一应用且编解码集合相同, 可假定语义分歧小, 故一般 M 较小.

    再考虑到 O(M) 条 FB 随机分布在 T_dither_max 时间窗内, 额外复合 RTCP 数量有限, (a) 假定不会压垮发送端, (b) 且应传输因其信息互补.

  6. 若依步骤 5 未被其他接收端 FB 抑制, 当到达 te 时, R MUST 发送含其 FB 的 (最小) 复合 RTCP 分组. 然后 MUST 设 allow_early = FALSE, MUST 重算 tn = tp + 2*T_rr, MUST 将 tp 设为原先的 tn. 一旦新 tn 到达, 无论 R 是否发送下一 Regular RTCP 或因 T_rr_interval 抑制, MUST 再将 allow_early = TRUE.

3.5.3. Regular RTCP 传输

完整复合 RTCP 分组 MUST 按常规间隔发送. 其中 MAY 含一个或多个 FB 消息. Regular RTCP 调度如下:

T_rr_interval == 0, 传输 MUST 遵循本文档第 3.2 与 3.4 节, 并遵守 3.5.2 节对 tn 的调整 (即若已发 Early RTCP 则跳过一次常规传输). 到达 tn 时按 [1] 进行定时器重考虑, 之后再发 Regular RTCP. 每当 Regular RTCP 发送或抑制后, allow_early MUST 设为 TRUE, tp, tn 按 [1] 更新. 首次 Regular RTCP 发送后, Tmin MUST 设为 0.

T_rr_interval != 0, 传输时刻计算 MUST 仍遵循 3.2 与 3.4 节及 3.5.2 对 tn 的调整. 到达 tn 时按 [1] 重考虑后执行:

  1. 若此前从未发送 Regular RTCP (即 t_rr_last == NaN), MUST 调度 Regular RTCP. 暂存的 FB 消息 MAY 纳入. 分组发出后 t_rr_last MUST 设为 tn. Tmin MUST 设为 0.

  2. 否则计算临时值

    T_rr_current_interval = RND*T_rr_interval

    RND 为 0.5 到 1.5 上均匀分布的伪随机数. 据此选择:

    2a) 若 t_rr_last + T_rr_current_interval <= tn, MUST 调度 Regular RTCP. 暂存 RTCP FB MAY 纳入. 发出后 t_rr_last MUST 设为 tn.

    2b) 若 t_rr_last + T_rr_current_interval > tn 且有暂存 RTCP FB, MUST 在 tn 调度 RTCP 传输. 可为最小或 Regular 复合分组 (实现裁量), 复合分组 MUST 含暂存 FB. t_rr_last MUST 不变.

    2c) 否则 (t_rr_last + T_rr_current_interval > tn 且无暂存 FB), MUST 抑制该复合 RTCP (MUST NOT 调度). t_rr_last MUST 不变.

以上 (1, 2a, 2b, 2c) 四种情形中, allow_early MUST 设为 TRUE (可能在发送 Regular 之后), tptn MUST 按 [1] 更新, 但不适用五秒最小间隔.

3.5.4. 其他考虑

T_rr_interval != 0, RTP/AVPF 实体的超时计算 ([1] 第 6.3.5 节) MUST 改为用 T_rr_interval 替代 Tmin 计算 TdM*Td, 以对 RTP 实体超时.

每当发送或收到复合 RTCP (最小或完整, Early 或 Regular), MUST 按 [1] 更新 avg_rtcp_size, 后续 tn 计算 MUST 使用新 avg_rtcp_size.