跳到主要内容

6.3. 重传请求 (Retransmission Requests)

接收端 SHOULD 使用 AVPF 概要中定义的 NACK 反馈消息格式发送重传请求. 接收端是否请求某一分组属于实现问题. 实际实现应考虑可容忍的应用时延, 网络环境与媒体类型等因素.

接收端一般应评估在收到重传分组时该分组是否仍有用处. 缺失分组的时间戳可根据原始流中由缺失分组引起的序列号间隙前后分组的时间戳估计. 多数情况下, 对时间戳做某种线性估计即可.

此外, 接收端应计算到发送端的往返时间 (RTT, round-trip time) 估计. 例如, 可在针对某分组发送 NACK 之后测量收到重传分组的时延. 该估计也可来自既往观测, 可用的 RTCP 报告往返时间或其他手段. 接收端估计 RTT 的标准机制见 "RTP 控制协议扩展报告 (RTCP XR)" [11].

接收端不应在检测到缺失序列号后立即发送重传请求, 而应增加额外时延以补偿分组重排. 该额外时延可例如基于对经历的分组重排的既往观测. 应注意, 在分组重排罕见或不发生的环境中, 例如若底层数据链路层保证有序递交, 该时延可以极低甚至为零. 此时, 适当的 "重排时延" 算法可能并非基于定时器, 而是基于分组. 例如, 在检测到间隙后又收到 n 个分组, 则可假定该分组确已丢失而非乱序. 在某些平台上, 与基于定时器的机制相比, 用很短的固定 FIFO 分组缓冲区实现可能容易得多.

为提高 NACK 或重传分组丢失时的鲁棒性, 接收端可对同一分组发送新的 NACK. 这称为多次重传. 在再次对缺失分组发送 NACK 之前, 接收端应依赖定时器, 以有理由确信上一次重传尝试已失败, 从而避免不必要的重传. 定时器取值应基于观测到的往返时间. MAY 使用静态或自适应取值. 例如, 自适应定时器可随对同一分组的每次新请求而改变其取值. 本文档不就如何计算该自适应值提供指南, 因为尚未通过实验确定.

NACK MUST 仅针对原始 RTP 流发送. 否则, 若接收端想通过在重传流中发送 NACK 来执行多次重传, 将无法获知所请求分组的原始序列号与时间戳估计.

附录 A 就如何控制重传次数给出一些指南.