RTP/RTCP

RTP real-time transport protocol

【简介】
RTP 提供端对端实时数据传输,如音视频。本身不确保传输的有序性或者提供QoS保证。依赖底层服务去做。
RTCP RTP control protocol,监控Qos,传输参与者的会话信息。
profile specification document,定义负载类型编码集合,并将之映射到负载格式(如媒体编码)。同时根据特定类别的应用定义RTP扩展和修改。
payload format specification document,定义特定负载如音频或视频编码是如何被RTP搭载的。

【使用场景】
一,简单多播音频会议
使用IP多播服务,多播地址和一对端口。一个端口传输音频数据,一个端口传输RTCP包
音频会议应用发送的音频数据比较小,20ms的延时。
存储音频数据块的RTP包包含在UDP包中。RTP头标识音频编码(如PCM,ADPCM,LPC等),每个包头都有,方便实时改变编码类型。如低带宽的加入者。
RTP头包含时间信息和序列号,允许接收者重建时钟。如音频数据块每隔20ms顺序播放。接收者也可以用序列号估计丢包数。
每个应用实例使用RTCP端口周期性的多播一个包含用户名字的响应包。表明当前说话者接收状况,被用来控制自适应编码。亦可包含其他用来控制
带宽限制的信息。离开会议会发送RTCP BYE 包

二,音视频会议
使用不同的RTP会话传输音频和视频。使用两个不同的UDP端口对及/或多播地址传输RTP和RTCP包。两个会话不直接相关,RTCP中用户名相同可以表明关联
会话间可以使用RTCP包中的时间信息来确保音视频同步

三,混和器和转换器 mixer translator
低带宽区域放置mixer,mixer重新同步发送者产生的20ms音频包,并将之混合成一路流,转码为低带宽流并通过低速网络传输。
这些包可能被单播到一个接收者,或多播到不同地址的多个接收者。RTP头包含了混合方法,区别各个贡献的源。
在防火墙的两端放置两个translator,外端通过安全连接接收所有的多播包,并传递给内端的translator,然后再转发

四,层编码
多媒体应用应该能够调整传输码率来适应接收者的能力,或者适应网络拥塞。
结合层传输系统的层编码,接收者可以负责码率自适应。如IP多播的RTP,源可以在多个RTP会话中对分层表示的信号的渐进层进行分条,
每个会话都在自己的多播组中进行。接收者可以自适应网络,通过只加入多播组合适的子集来控制它们的响应带宽。

【定义】
RTP payload:音频采样或视频压缩数据。
RTP packet:包含头和payload数据。通常一个下层协议包包含一个RTP包,也可以包含多个RTP包
RTCP packet:包含固定头部,包含与RTCP包类型相关的结构化元素。多个RTCP包可以在一个底层协议包中。每个RTCP包头部的length域使能
RTP session
Synchronization source(SSRC):定义在RTP头中的32位数值SSRC标识符。一个同步源的所有包组成部分时序和序列号空间。
接收者收集同步源的包播放。在一个特定的RTP session中,SSRC是全局唯一的随机值。同一个multimedia session中的所有RTP session 中SSRC唯一
SSRC通过RTCP提供绑定。如果一个参与者在一个RTP session中生产了多个流,则每个流必须标识不同的SSRC。
Contributing source(CSRC):RTP mixer 组成的一个流中对流具有贡献的源。mixer将这些源的SSRC标识符列表插入到RTP包的头部。列表称为
CSRC 表。确保接收者能够分辨发送者,即使所有的RTP包包含相同的SSRC标识符(mixer的)。
Monitor:在一个RTP session中接收参与者发送的RTCP包,如报告、估计QoS、错误诊断、长期分析等。
Non-RTP means:提供可用服务除了RTP的其他协议和机制。如,提供多播地址、加密密钥、协商加密算法、定义RTP payload type 和
payload format的动态映射。SIP(RFC 3261),SDP(RFC 2327)

【字节序、对齐、时间格式】
网络字节序(大端)
绝对日期和时间使用NTP(Network Time Protocol)协议的时间戳格式。起始点1900.1.1 0h。

【RTP 数据传输协议】
一,RTP 固定头部域
前12字节包含在所有RTP包中,4字节的CSRC标识符可选,使用mixer时插入。
V:version 2bits,RTP版本,默认位2。
P:padding,1bit,置位时包可能包含额外字节。这些额外字节位于不是payload的前面位置。最后一个额外字节表明忽略多少额外字节,包括自己。
用于一些需要特定块大小的加密算法或用于底层协议数据单元装载多个RTP包
X:extension,1bit,置位后,固定头部必须跟随一个头扩展。
CC:CSRC count,4bit
M:marker,1bit,profile定义,重要事件如标记包流中帧边缘。profile可能定义额外的marker bits或通过改变payload type 域。
PT:payload type,7bits,定义RTP payload格式, 决定如何被应用解释。
sequence number:16bits,每次递增1,接收者判断是否丢包、恢复包序。初始包序号随机。
timestamp:32bits,反映RTP 数据包第一个字节的采样时机。采样时钟必须线性单调递增,用来同步和抖动校正。
初始值随机。不同的源的时间时间戳可能没关系,无法用来同步,使用参考时钟同步
SSRC: 32bits
CSRC list:0~15个,每个32bits

二,多路复用RTP会话
三,profile 定义的RTP头修改
四,RTP 头扩展

【RTCP】
周期性的发送控制包给会话中的参与者。应用与数据包相同的分发机制,低层协议提供数据与控制包的复用,如使用单独的UDP端口号
(1) 主要是提供数据发布的质量反馈。RTCP是作为RTP传输协议的一部分,与其他传输协议的流和阻塞控制有关。反馈对自适应编码控制
直接起作用,但IP多播经验表明,从发送者收到反馈对诊断发送错误是至关重要的。给所有参加者发送接收反馈报告允许问题观察者估计
那些问题是局部的,还是全局的。诸如IP多播等发布机制使网络服务提供商之类的团体可能接收反馈信息,充当第三方监控者来诊断网络
问题。反馈功能由RTCP发送者和接收者报告执行。
(2)RTCP带有称作规范名字(CNAME)的RTP源持久传输层标识。如发现冲突,或程序重新启动,既然SSRC标识可改变,接收者需要CNAME
跟踪参加者。接收者也需要CNAME与相关RTP连接中给定的几个数据流联系。
(3)前两种功能要求所有参加者发送RTCP包,因此,为了RTP扩展到大规模数量,速率必须受到控制。让每个参加者给其他参加者发送
控制包,就加大独立观察参加者数量。该数量用于计算包发送的速率。
(4)可选功能是传送最小连接控制信息,如辨识参加者。最可能用在“松散控制”连接,那里参加者自由进入或离开,没有成员控制
或参数协调,RTCP充当通往所有参加者的方便通道,但不必支持应用的所有控制通讯要求。

在IP多播场合应用RTP时,前三个功能是必须的,推荐用于所有情形。RTP应用设计人员必须避免使用仅在单播模式下工作的机制,
那将导致无法扩展规模。

【RTCP包格式】
下面定义几个携带不同控制信息的RTCP包类型:
SR(SenderReport):发送者报告,当前活动发送者发送、接收统计。
RR(ReceiverReport):接收者报告,非活动发送者接收统计。
SDES(SourceDescription):源描述项,包括CNAME, NAME, EMAIL,PHONE等。
BYE:表示结束。
APP(application):应用特定函数。

类似于RTP数据包,每个RTCP包以固定部分开始,紧接着的是可变长结构元素,但以一个32位边界结束。包含对齐要求和固定部分中长度域,
使RTCP包可堆叠。不需要插入任何分隔符将多个RTCP包连接起来形成一个RTCP组合包,以低层协议用单一包发送出去。由于低层协议
提供整体长度来决定组合包的结尾,在组合包中没有单个RTCP包显式计数。

组合包中每个RTCP包可独立处理,不需要根据包组合顺序。但为了执行协议功能,强加如下约束:
(1) 接收统计(在SR或RR中)应该经常发送,只要带宽允许,因此每个周期发送的组合RTCP包应包含报告包。
(2) 新接收者需要接收CNAME,并尽快识别源,开始联系媒介进行同步,因此每个包应该包含SDES CNAME。
(3) 出现在组合包前面的是包类型数量,其增长应该受到限制,以提高常数位数量,提高成功确认RTCP包对地址错误RTP数据包或其他无关包的概率。

因此,所有RTCP包至少必须以两个包组合形式发送,推荐格式如下:
①加密前辍(Encryption prefix)
仅当组合包被加密,才加上一个32位随机数用于每个组合包发送。
②SR或RR
组合包中第一个RTCP包必须总为一个报告包,方便头的确认。即使没有数据发送,也没有接收到数据,也要发送一个空RR,即避免组合包中RTCP包为BYE(终止标识)。
③附加RR
如报告统计源数目超过31,在初始报告包后应该有附加RR包。
④SDES
包含CNAME项的SDES包必须包含在每个组合RTCP包中。如应用要求,其他源描述项可选,但受到带宽限制。
⑤BYE或APP
其他RTCP包类型可以任意顺序排列,除了BYE应作为最后一个包发送,包类型出现可不止一次。
建议转换器或混合器从多个源组合单个RTCP包。如组合包整体长度超过网络路径量最大传输单元,可分成多个较短组合包用低层协议以
单个包形式发送。注意,每个组合包必须以SR或RR包开始。附加RTCP包类型可在因特网分配号码
机构(IANA,InternetAssighnedd Numbers Authority)处注册。

【RTCP传输间隔】
【SR包】
包类型 200

  1. 第一部分为头,8个八位组长,内容如下。
    ① 版本(V):2位,标识RTP版本。
    ② 填充(P):1位,如设置于此位,RTCP包结尾包含一些附加填充八位组,它们不属于控制信息。最后一个八位组填充表示应忽略多少个填充。
    有些加密算法需要填充,块大小固定。在组合RTCP包内,填充仅在最后一个包中需要,因为组合包加密成一个整体。
    ③ 接收报告计数(RC):5位,包含在包内的接收报告块数目,0值为有效。
    ④ 包类型(PT):8位,包含常数200标识此包为RTCP的SR包。
    ⑤ 长度:16位,以32位字为单位的RTCP包长减一。
    ⑥ SSRC:32位,同步源标识。

  2. 第二部分为发送者信息,20个八位组,20个字节,出现在每个发送者报告包中。含义如下。
    ① NTP时标:64位,表示报告发送时的时钟时间,它可以与从其它接收者返回的接收报告块中的时间标志结合起来,测量到这些接收者的环路时延
    ② RTP时标:32位,与上述NTP时标同一时间有关,但与RTP时标有着相同的时间单位和同样的随机偏移。
    ③ 发送者包计数:32位,自开始发送来,直到SR包产生时刻,发送者发送RTP数据包总数。如改变SSRC标识符,此计数重置。
    ④ 发送者八位组计数:32位,发送者在RTP数据包中发送的载荷八位组总数。从发送开始,直到产生SR包,如发送者改变SSRC标识,重置此计数。
    这部分可用于估计载荷数据平均速率。

  3. 第三部分包含接收报告块,大小不固定。每个接收报告块传送单个同步源接收RTP包的统计。发生冲突,当源改变SSRC标识时,接收者并不继续统计。
    这些统计包括:
    ① SSRC_n(源标识):32位,接收报告块中信息所属源的SSRC标识。
    ② 丢失包率:8位,前一个SR或RR包发送以来所丢失的源SSRC_n的RTP数据包中一部分,定义成所丢失包的数目比率。
    以固定点小数表示,小数点位于左侧。等于将丢包率乘以256取整。损失包数/期望接收包数
    ③ 丢失包累积数:24位,自接收以来所丢失的源SSRC_n的RTP数据包总数,定义成小于实际所接收包的数量,该数量包括迟到或复制的包。
    因此,迟到的包不计为丢失,如有复制,此数量可能为负数。
    ④ 收到已扩展的最高系列号:32位,低16位包含从SSRC_n源RTP数据包中收到的最高系列号,最高16位以序列号循环相应计数扩展序列号。
    如开始时间明显不同,同一连接内不同接收者将对系列号产生不同扩展。
    ⑤ 间隔抖动:32位,RTP数据包间隔时间的统计估计,以时标为单位,是一个无符号整数。
    ⑥ 最后SR时标(LSR):32位,NTP时标的中间32位,如还没有收到SR,此段设为零。
    ⑦ 自最后一个SR来的延迟(DLSR):32位,延迟以1/65536秒为单位,表示源SSRC_n收到的最后一个SR包与发送此接收块之间的时间,如还没有收到SR,此段设为零。

【RR包】
接收报告包格式与SR包类似,但包类型包含常数201,并删除发送者信息的五个字。当没有数据传输或接收报告时,则将一个空RR包(RC=O)放在组合RTCP包的前头。

【SDES】
源描述RTCP包(SDES)为三层结构,由头与数据块组成,数据块可以没有,也可有多个,组成项描述块所表明的源

  1. 项描述如下:

    (1)版本(V)、填充(P)、长度:如SR包中所描述。

    (2)包类型(PT):8位,包含常数202,标识RTCP SDES包。

    (3)源计数(X):1位,包含在SDES包中的SSRC/CSRC块数量,零值有效,但没有意义。

    1. 源描述项
      【BYE包】
      包头类似,类型为203

对于UDP及类似协议,RTP使用偶数目的端口,RTCP使用大1的奇数目的端口。
单播会话中,两个参与者都需要定义一个端口对来接收RTP和RTCP包

【丢包率计算】
initRTPSeqNo:本端收到的第一个RTP报文序列号
extRTPSeqNo1:本端在采样点收到的RTP报文中最大的序列号
preExpRcvRTPPkt:期望收包数,= extRTPSeqNo1 - initRTPSeqNo
rcvRTPPkt1:本端在采样点1处实际收包数 preRcvRTPPkt
extRTPSeqNo2:本端在采样点2收到的RTP包中最大的序列号
rcvRTPPkt2:本端在采样点2的实际收包数

receivedInterval:实际间隔收包数 rcvRTPPkt2 - rcvRTPPkt1
expectedInterval:预期间隔收包数 extRTPSeqNo2 - extRTPSeqNo1

lostInterval = (expectedInterval - receivedInterval)/expectedInterval;

【RR间隔抖动计算】
int transit = arrival - r->ts; ///<传输间隔 = 当前时间 - 接收包时间戳
int d = transit - s->transit; ///<传输间隔 - 上次传输间隔
s->transit = transit;
if (d < 0) d = -d;
s->jitter += (1./16.) * ((double)d - s->jitter); ///<计算期望抖动

rr->jitter = (u_int32) s->jitter;
///< 或者
s->jitter += d - ((s->jitter + 8) >> 4);
rr->jitter = s->jitter >> 4;

【环路时延计算】

![20170718134634553.png](https://upload-images.jianshu.io/upload_images/3454662-95903703c675be69.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
rtp_rtcp发送者报告包.png
rtp_rtcp接收者报告包.png
rtp_rtcp源描述包.png
rtp_rtcp组合包结构.png
rtp_丢包率估算.png
rtp_环路时延计算.png
rtp_头域定义.png
rtp_头域扩展.png

你可能感兴趣的:(RTP/RTCP)