跳到主要内容

附录 A. 如何控制每包重传次数 (How to Control the Number of Rtxs. per Packet)

确定为实现最佳传输每包应进行的重传次数 (rtxs.) 是一项困难任务. 当然, 绝对最小值应为 1; 否则请勿使用本载荷格式. 此外, 截至本文发布之日, 作者未了解到有关为获得最佳性能每包应使用多少次重传的研究. 为帮助实现者与研究人员, 本节描述为实现给定重传次数所需的缓冲时间估计. 计算出该时间后, 可通过本文档定义的 SDP 参数 "rtx-time" 告知客户端.

A.1. 场景与假设 (Scenario and Assumptions)

  • 流式场景, 时延约束较宽松. 客户端与服务器按 SDP 中 "rtx-time" 参数指示提供缓冲空间.

  • 使用 RTP AVPF 概要及 SSRC 复用重传方案: 原始分组 1 个 SSRC, 重传分组 1 个 SSRC.

  • SR 与 RR 的默认 RTCP 带宽份额, 即 SR+RR = 0.05. 发送端 (2) 与接收端 (1). 接收端与发送端平等分得 RTCP 带宽份额的 1/3, 因为发送端占会话成员比例大于 1/4.

  • avg-rtcp-size 近似为 120 字节. 这是对每个 SSRC 各 1 个 SR 的向上取整平均, 每个含 IPv6/UDP/SR/带 CNAME 的 SDES 的 40/8/28/32 字节, 共 105 字节; 以及一个 RR, 含 IPv6/UDP/2*RR/SDES 的 40/8/64/32 字节, 共 157 字节. 由于发送端与接收端平等共享 RTCP 带宽, avg-rtcp-size = (157+105+105)/3 = 117.3 ≈ 120 字节. 该值的重要特征为超过 100 字节, 对典型配置似乎具有代表性.

  • 所使用概要 AVPF [1], 并用通用 NACK 请求重传. 1 个 NACK 增加 16 字节开销, 每增加一个 NACK 反馈控制信息 (FCI, Feedback Control Information) 字段再增加 4 字节.

  • 假设最坏情况: 每个分组在被收到之前用尽可用的 N 次重传. 即, 若某分组最多请求重传 2 次, 则请求该特定分组的通用 NACK 报告块在连续两个 RTCP 复合中发送; 同理, 若请求重传 10 次, 则通用 NACK 发送 10 次. 该假设使 RTCP 分组大小在 N*RTCP 间隔 (秒) 后近似恒定, 即 avg-rtcp-size = 120 + (receiver-RTCP-bw-share)*(12 + 4*N). 本例中接收端 RTCP 带宽份额为 1/3; 因而 avg-rtcp-size = 124 + 4*N/3.

  • 两个时延参数难以近似且可能依赖实现. 因此在此明确列出而不赋值: 其一为丢包检测时间 (T2), 其二为反馈处理与重传排队时间 (T5). 实现者应为这两个参数分配合适取值.

图示如下:

        Sender
+-+---------------------------------^-----\-----------------
\ \ / \
\ \ | |
SN=0 \ \ SN=1 / \ RTX(SN=0)
\ \ / \
X \ / \
`. / \
\ / \
\ | |
\ / \ ......
\ / \
-------------V----D--------/-----------------------V--------
T1 T2 T3 T4 T5 T1 ........
Receiver

图例 (Legend):

  • DL: 下行 (client->server)
  • UL: 上行 (server->client)
  • 时间单位为秒, s.
  • 比特率单位为比特每秒, bps.

下行传输时间: T1 = physical-delay-DL + tx-delay-DL (=avg-pkt-size/DL-bitrate) + interarrival-delay-jitter

丢包检测时间: T2 = pkt-loss-detect-time

丢包报告时间: T3 = time-to-next-rtcp-report

上行传输时间: T4 = physical-delay-UL + transmission-delay-UL + interarrival-delay-jitter

重传处理时间: T5 = feedback-processing-time + rtx-queuing-time

A.2. 目标 (Goal)

求流式服务器为使每个分组可进行 N 次重传所应使用的缓冲时间 T() 的估计值. 若认为客户端晚 T1 秒开始缓冲, 则该时间在服务器与客户端近似相等.

A.3. 解法 (Solution)

首先求 1 次重传的估计值 T(1)=T:

T = T1 + T2 + T3 + T4 + T5

由于 T1 + T4 ≈ RTT,

T = RTT + T2 + T3 + T5

T3 的最坏情况是假定报告必须等待整个 RTCP 间隔并应用最大随机化因子 1.5. 因此, 在应用为避免流量突发而进行的后续补偿后 (见 RTP [3] 附录 A.7), T3 = 1.5/1.21828*RTCP-Interval. 因而

T = RTT + 1.2312*RTCP-Interval + T2 + T5

另一方面, RTCP-Interval = avg-rtcp-size*8*(senders + receivers)/(RR+RS). 本场景中: sender + receivers = 3; RR+RS 为接收报告加发送报告带宽份额, 本例等于会话带宽 bw 的默认 5%. 假定平均 RTCP 分组大小 avg-rtcp-size = 120 字节. 因而:

T = RTT + 1.2312*avg-rtcp-size*8*3/(0.05*bw) + T2 + T5

对应 1 次重传.

为支持 N 次重传, 流式服务器或客户端的可用缓冲时间近似为:

T(N) = N*(RTT+1.2312*avg-rtcp-size*8*3/(0.05*bw) + T2 + T5)

其中, 如上所述,

avg-rtcp-size = 120 + (receiver-RTCP-bw-share)*(12 + 4*N)
= 120 + (1/3)*(12 + 4*N)
= 124 + 4*N/3.

A.4. 数值 (Numbers)

若忽略 T2 与 T5 的影响, 即假定所有丢包立即检测到且反馈处理或重传排队无额外时延, 则不同 N 值对应的缓冲时间如下:

含多个通用 NACK 的 RTCP; 可变分组大小 = 124 + 4*N/3 字节

|============|=====|======================================|
| RTP BW | RTT | N value |
|============|=====| 1 2 5 7 10 |
|======================================|

64000 0,05 1,21 2,44 6,28 8,97 13,18
128000 0,05 0,63 1,27 3,27 4,66 6,84
256000 0,05 0,34 0,68 1,76 2,50 3,67
512000 0,05 0,19 0,39 1,00 1,43 2,09
1024000 0,05 0,12 0,25 0,63 0,89 1,29
5000000 0,05 0,06 0,13 0,33 0,46 0,66
10000000 0,05 0,06 0,11 0,29 0,41 0,58

64000 0,2 1,36 2,74 7,03 10,02 14,68
128000 0,2 0,78 1,57 4,02 5,71 8,34
256000 0,2 0,49 0,98 2,51 3,55 5,17
512000 0,2 0,34 0,69 1,75 2,48 3,59
1024000 0,2 0,27 0,55 1,38 1,94 2,79
5000000 0,2 0,21 0,43 1,08 1,51 2,16
10000000 0,2 0,21 0,41 1,04 1,46 2,08

64000 1 2,16 4,34 11,03 15,62 22,68
128000 1 1,58 3,17 8,02 11,31 16,34
256000 1 1,29 2,58 6,51 9,15 13,17
512000 1 1,14 2,29 5,75 8,08 11,59
1024000 1 1,07 2,15 5,38 7,54 10,79
5000000 1 1,01 2,03 5,08 7,11 10,16
10000000 1 1,01 2,01 5,04 7,06 10,08

为量化未计入通用 NACK 的误差, 可忽略通用 NACK 贡献, 取 avg-rtcp-size ≈ 120 字节重复计算. 由下表可见, 在较低带宽与较高重传次数时, 缓冲估计误差可达约 1–1.5 秒 (5–10%). 本例中该影响较小. 尽管如此, 仍应针对具体场景仔细评估; 因此公式中包含该项.

不含通用 NACK 的 RTCP, 固定分组大小 ≈ 120 字节

|============|=====|======================================|
| RTP BW | RTT | N value |
|============|=====| 1 2 5 7 10 |
|======================================|

64000 0,05 1,16 2,32 5,79 8,11 11,58
128000 0,05 0,60 1,21 3,02 4,23 6,04
256000 0,05 0,33 0,65 1,64 2,29 3,27
512000 0,05 0,19 0,38 0,94 1,32 1,89
1024000 0,05 0,12 0,24 0,60 0,83 1,19
5000000 0,05 0,06 0,13 0,32 0,45 0,64
10000000 0,05 0,06 0,11 0,29 0,40 0,57

64000 0,2 1,31 2,62 6,54 9,16 13,08
128000 0,2 0,75 1,51 3,77 5,28 7,54
256000 0,2 0,48 0,95 2,39 3,34 4,77
512000 0,2 0,34 0,68 1,69 2,37 3,39
1024000 0,2 0,27 0,54 1,35 1,88 2,69
5000000 0,2 0,21 0,43 1,07 1,50 2,14
10000000 0,2 0,21 0,41 1,04 1,45 2,07

64000 1 2,11 4,22 10,54 14,76 21,08
128000 1 1,55 3,11 7,77 10,88 15,54
256000 1 1,28 2,55 6,39 8,94 12,77
512000 1 1,14 2,28 5,69 7,97 11,39
1024000 1 1,07 2,14 5,35 7,48 10,69
5000000 1 1,01 2,03 5,07 7,10 10,14
10000000 1 1,01 2,01 5,04 7,05 10,07