本系列文章将整理各个流媒体传输协议,包括 RTP/RTCP,RTMP,希望通过深入梳理协议的设计细节,能够给流媒体领域的开发者带来一定的启发。
作者:逸殊
审核:泰一
接上篇:《 流媒体传输协议之 RTP(上篇)》
RTP 控制协议 Sender & Receiver 报告RTP 使用 Sender 报告(SR)和 Receiver 报告(RR)来反馈数据的接收质量,如果是媒体数据的发送者那就会发送 SR,否则发送 RR。这两类报文是通过头部的报文类型识别码来做区分的。SR 相对于 RR 来说多了 20byte 的 Sender 相关信息,除此之外其他内容都是一样的。
SR 报文SR 报文包含三个部分,第一个部分是头部,有 8 BYTE,各个字段的含义如下:
version (V): 2 bits,RTP 协议版本。
padding (P): 1 bit,是否包含填充,最后一个填充字节标识了总共需要忽略多少个填充字节(包括自己)。Padding 可能会被一些加密算法使用,因为有些加密算法需要定长的数据块。在复合包中,只有最后一个 RTCP 包需要添加填充。
reception report count (RC): 5 bits,有多少个接收报告。可以为 0。
packet type (PT): 8 bits,200 表示 SR 报文。
length: 16 bits,报文长度(按 32-bit 字统计),包含头部和填充字节。
SSRC: 32 bits,身份定位符。
第二部分是发送者信息,包含 20 BYTE 的数据,总结了这个发送的的传输统计,各个字段的含义如下:
NTP timestamp: 64 bits,Wallclock time,用于计算 RTT。
RTP timestamp: 32 bits,RTP 时间戳,基于 NTP 的某一随机偏移量。用于媒体数据内同步。
sender's packet count: 32 bits,这个 SSRC 总共发送了多少包。
sender's octet count: 32 bits,这个 SSRC 总共发送了多少 BYTE 的数据。
第三部分可能什么都没有,也可能有多个接收报告,这取决的上次报告以后收到了多少个 Sender 的数据。每个报告块统计了一个 SSRC 的包数。具体内容如下:
SSRC_n (source identifier): 32 bits,这个信息块对应的 SSRC。
fraction lost: 8 bits,上次 SR 或 RR 发送后到目前为止的丢包率。
cumulative number of packets lost: 24 bits,整体过程的丢包总数。
extended highest sequence number received: 32 bits,低 16-bit 是收到的最新的 RTP 报文序列号,高 16-bit 是序列号循环的次数。
interarrival jitter: 32 bits,RTP 数据报文抵达时间的抖动。如果 Si 代表 i 包中包含的 RTP 时间戳,Ri 代表 i 包被接收时的 RTP 时间戳,那两个包 i 和 j 的到达时间抖动算法如下::D(i,j) = (Rj - Ri) - (Sj - Si) = (Rj - Sj) - (Ri - Si)。我们在计算这个抖动时,要结合每个包的抖动,来计算一个平均值,计算平均值的方案如下:J(i) = J(i-1) * (15 / 16) + (|D(i-1,i)|)/16。
last SR timestamp (LSR): 32 bits,该 SSRC 最后一个 RTCP 报文(SR)中带的 NTP 时间。
delay since last SR (DLSR): 32 bits,从该 SSSR 最后一个 RTCP 报文(SR)被收到以来经过的时间。
数据的发送者可以通过当前时间 A,接收到 RR 部分中的 LSR 和 DLSR 来计算 RTT,计算示意图如下:
接收报告的格式和发送报文格式一样,只不过它在头部中用 201 表示这是一个 RR 报文。此外 RR 报文中不含有上述 SR 报文中的第二部分。如果 RR 报文是空的那么需要在头部标明 RC=0。
发送 / 接收报文的拓展
一些预设可能根据自己的需求,要在接收报告和发送报告中附加一些信息。那么这些附加内容应该在 SR 或者 RR 的结尾之后。如果这些内容只有发送者相关,那么 RR 中就不包含这些信息。
分析发送报告和接收报告
这些接收质量的报告信息可能不光只有发送者要使用,接收者或者第三方监控器也会使用。发送者可能根据接收质量调整自己的传输策略。接收者可以根据这个信息来确定自己遇到的问题是本地网络的问题还是整个 Session 的问题。网络的管理者可以根据这些信息来评估整个网络环境的情况。
SDES 是一个三级结构,它包含一个头和 0 个或多个数据块,每一个数据块对应了一个 SSRC 或 CSRC,它又由多个描述字段组成。头部的信息如下:
version (V),padding (P),length: 和上面一样。
packet type (PT): 8 bits,202 表示 SDES 类型。
source count (SC): 5 bits,SSRC/CSRC 块的数量。