跳到主要内容

4.1. Loss RLE Report Block (丢包RLE报告块)

4.1. Loss RLE Report Block (丢包RLE报告块)

此块类型允许对单个数据包接收和丢失事件进行详细报告.此类报告可用于例如多播网络特性推断 (MINC) [11].通过MINC, 可以发现用于分发源RTP数据包的多播树拓扑, 以及该树内链路上的丢失率, 或者可以用于向网络管理应用程序提供原始数据.

由于丢失和接收RTP数据包的布尔跟踪可能很长, 因此此块类型允许通过游程长度编码压缩跟踪.为了进一步减小块大小, 可以通过一种称为稀疏化 (thinning) 的机制系统地从跟踪中删除丢失事件报告, 该机制在下面描述并在[13]中进行了研究.

生成Loss RLE Report Block的参与者应尽可能倾向于准确报告观察到的事件, 而不是解释这些事件.解释应留给观察报告块的人.遵循这种方法意味着Loss RLE Report Block的计算将在以下两个方面与RTP规范[9]中描述的SR和RR数据包生成的计算不同: 每发送者计算和每数据包计算.

在其每发送者计算中, RTP会话参与者不应该将接收到阈值最小数量的RTP数据包作为报告这些数据包发送者的条件.这种计算技术不同于RTP规范第6.2.1节和附录A.1中描述的技术, 后者允许使用阈值来确定发送者是否被视为有效.

在其每数据包计算中, RTP会话参与者应该将所有序列号视为有效.这种计算技术不同于RTP规范附录A.1中描述的技术, 后者建议根据序列号与先前接收的数据包的序列号的连续性来判断序列号是有效还是无效.

发送者有效性和序列号有效性是对原始数据的解释.例如, 为了排除来自不相关会话的陈旧数据包对RTCP传输间隔计算的影响, 这种解释是合理的.另一方面, 陈旧数据包的存在可能对网络监控应用程序有用.

仍然需要的一种计算解释是参与者决定16位序列号是否已翻转.在正常情况下这不是一项困难的任务.例如, 如果数据包号65,535 (最高可能的序列号) 之后很快跟随数据包号0, 则可以合理地假设已发生翻转.但是, 该数据包可能是较早的数据包 (来自65,535个数据包之前).序列号也可能已多次翻转, 向前或向后.当序列号之间存在较大间隔时, 即使考虑翻转, 以及接收数据包之间存在较长间隔时, 解释变得更加困难.

此处规定的每数据包计算技术是参与者跟踪从发送者最近接收的数据包的序列号.对于从该发送者到达的下一个数据包, 序列号必须被判断为不超过最近一个数据包前后32,768个数据包, 以较近者为准.如果两个选择距离相等 (仅当距离为32,768时可能), 则必须选择不需要翻转的选择.附录A.1提供了实现此技术的算法.

每个块报告单个RTP数据包源, 由其SSRC标识.提供报告的接收器在RTCP数据包的头部中标识.

跟踪的起始和结束RTP数据包序列号的选择留给应用程序.这些值在块中报告.跟踪中的最后序列号可能与任何伴随的SR或RR报告中报告的序列号不同.

请注意, 由于序列号回绕, 结束序列号可能小于起始序列号.Loss RLE Report Block不得用于报告序列号空间中65,534或更大的范围, 因为无法识别多次回绕.

Loss RLE报告描述的跟踪由一系列布尔值组成, 跟踪的每个序列号对应一个值.值1表示数据包接收, 意味着自序列号最近一次回绕以来 (或者如果判断没有发生回绕则自RTP会话开始以来) 已接收到具有该序列号的一个或多个数据包.值0表示数据包丢失, 意味着截至报告时间, 该序列号尚未接收到数据包.如果在报告该序列号的丢失后接收到具有给定序列号的数据包, 则稍后的Loss RLE报告可能会报告该序列号的数据包接收.

编码本身由一系列称为块 (chunk) 的16位单元组成, 这些单元描述跟踪中数据包接收或丢失的序列.每个块指定游程长度或位向量, 或者是空块.游程长度描述1到16,383个全部相同的事件 (全部接收或全部丢失).位向量描述15个可能混合接收和丢失的事件.空块不描述任何事件, 用于将块舍入到32位字边界.

从丢失和接收数据包序列到块序列的映射不一定是唯一的.例如, 以下跟踪覆盖45个数据包, 其中第22和24个已丢失, 其他已接收:

1111 1111 1111 1111 1111 1010 1111 1111 1111 1111 1111 1

一种编码方式是:

bit vector 1111 1111 1111 111
bit vector 1111 1101 0111 111
bit vector 1111 1111 1111 111
null chunk

另一种编码方式是:

run of 21 receipts
bit vector 0101 1111 1111 111
run of 9 receipts
null chunk

编码的选择留给应用程序.作为这种选择自由的一部分, 应用程序可以用超出报告块描述的序列号空间的位向量块终止一系列游程长度和位向量块.例如, 如果同一序列中的第44个数据包丢失:

1111 1111 1111 1111 1111 1010 1111 1111 1111 1111 1110 1

这可以编码为:

run of 21 receipts
bit vector 0101 1111 1111 111
bit vector 1111 1110 1000 000
null chunk

在此示例中, 第二个位向量的最后五位描述了超出跟踪中最后序列号的序列号空间的一部分.这些位已设置为零.

位向量块中描述超出跟踪中最后序列号的序列号空间部分的所有位必须设置为零, 并且必须被接收器忽略.

如果游程长度加位向量块的数量为奇数, 则空数据包必须出现在Loss RLE Report Block的末尾.空块不得出现在任何其他上下文中.

发送Loss RLE Report Block时应谨慎使用, 因为即使使用游程长度编码提供的压缩, 它们也很容易消耗与正常RTCP数据包不成比例的带宽.块类型包括一种称为稀疏化 (thinning) 的机制, 允许应用程序限制报告大小.

稀疏化值T选择序列号空间内的数据包子集: 序列号为2^T的倍数的数据包.数据包接收和丢失报告仅适用于这些数据包.T可以在0到15之间变化.如果T为零, 则报告序列号空间中的每个数据包.如果T为15, 则每32,768个数据包中有一个被报告.

假设刚才描述的跟踪从序列号13,821开始.跟踪中的最后序列号是13,865.如果使用稀疏化值T=2对跟踪进行稀疏化, 则将报告以下序列号: 13,824, 13,828, 13,832, 13,836, 13,840, 13,844, 13,848, 13,852, 13,856, 13,860, 13,864.稀疏化跟踪如下:

1    1    1    1    1    0    1    1    1    1    0

这可以编码如下:

bit vector 1111 1011 1100 000
null chunk

位向量中的最后四位, 表示序列号13,868, 13,872, 13,876和13,880, 超出跟踪范围, 因此设置为零并被接收器忽略.通过稀疏化, 第22个数据包的丢失未被报告, 因为其序列号13,842不是4的倍数.所有不是4的倍数的序列号的数据包接收也未被报告.但是, 在此示例中, 稀疏化允许Loss RLE Report Block缩短一个32位字.

稀疏化值的选择留给应用程序.

Loss RLE Report Block具有以下格式:

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| BT=1 | rsvd. | T | block length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of source |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| begin_seq | end_seq |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| chunk 1 | chunk 2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: ... :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| chunk n-1 | chunk n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

block type (BT): 8位

  • Loss RLE Report Block由常量1标识.

rsvd.: 4位

  • 此字段保留用于将来定义.在没有此类定义的情况下, 此字段中的位必须设置为零, 并且必须被接收器忽略.

thinning (T): 4位

  • 对序列号空间执行的稀疏化量.此块仅报告序列号为0 mod 2^T的数据包.值0表示没有稀疏化, 报告所有数据包.最大稀疏化是每32,768个数据包中有一个 (相当于每个16位序列空间内两个数据包).

block length: 16位

  • 在第3节中定义.

SSRC of source: 32位

  • 此报告块报告的RTP数据包源的SSRC.

begin_seq: 16位

  • 此块报告的第一个序列号.

end_seq: 16位

  • 此块报告的最后序列号加1.

chunk i: 16位

  • 有三种块类型: 游程长度, 位向量和终止空, 在以下部分中定义.如果块全为零, 则它是终止空块.否则, 块的最左位确定其类型: 0表示游程长度, 1表示位向量.