专栏首页用户1692782的专栏手撕RTSP协议系列(13)——RTCP协议

手撕RTSP协议系列(13)——RTCP协议

RTCP简介

之前的文章,介绍了RTSP和RTP协议,RTSP用于建立连接及发送请求等,RTP用于实际的媒体数据传输。整个RTSP的流程中,还有一种不可或缺的协议, 那就是RTCP。RTCP的全称是RTP Control Protocol,从英文名称可以看出,其是针对RTP的控制协议!RTCP主要用于提供数据分发质量反馈信息,本文详细介绍一下RTCP协议!

数据包格式

首先,让我们来看一下RTCP的数据包格式,如下图:

对照示意图,可以看到如下字段,下面做详细解释:

V(2bit):Version,表示RTCP版本号,当前规范定义的版本号为2,需要注意的是RTP数据包中的版本号与RTCP数据包的中的版本号是一致的

P(1bit):填充位,表示是否需要填充,0表示不填充,其不属于控制信息。在某些情况下(如加密)需要进行填充,在填充的情况下,Padding的最后一个字节用于计算应该忽略多少个字节!

RC(5bit) : 接收方报告计数,表示在该数据包中的接收方报告块的数量,该字段0值是有效的,但没有实际意义!

PT(8bit) : RTCP的数据包的分组类型,RTCP包含的分组类型如下:

类型

缩写表示

意义

200

SR(Sender Report)

发送端报告

201

RR(Receiver Roport)

接收端报告

202

SDES(Source Descripition Items)

源点

203

BYE

结束

204

APP(Application)

特定应用

length(16bit):RTCP数据包的大小。该字段中大小的表示比较有意思,使用4个字节为1组,长度共有几个4个字节的组,然后用该长度减去1,即为RTCP包中的长度!举个栗子:假设RTCP数据包的长度为32个字节,32/4=8,总共有8组4个字节,8-1=7,此时RTCP数据包中length的值为7。

SSRC(32bit): 同步源标识

RR:Recevier Report,接受端报告。

SS:Source Description,源描述。

这样,我们对RTCP报文的整体结构就比较了解了!上一个抓包文件,我们就会更直观的感受了!

通过抓包文件我们可以看到,RTCP包是应用层协议,截图中的RTCP包是基于UDP协议的!抓包中红色部分为RTCP数据包的头部分,蓝色部分为Receive Report的具体内容,绿色部分为源描述的具体内容!


下面,我们来详细看一下Send Report,Recive Report和Source Description的结构,首先来看Send Report!

SS(Send Report)

通过结构图,可以看到Sender Report有以下字段:

NTP时标:NTP时间戳

RTP时标:RTP时间戳

发送者包计数:从开始传输到当前SR包生成的时间段内,发送端发送的RTP数据包的总个数!如果发送者更改其SSRC,则该计数要被重置

发送者数据8位组计数:从开始传输到当前SR包生成的时间段内,发送端发送的总的数据的大小的八位组计数,不包含头信息以及填充信息!如果发送者更改可SSRC,需要重置该值!该字段可以用来估计平均码率!

来看一个抓包


RR(Receiver report)

继续看一下Receiver Report的结构:

通过结构,可以看到如下信息:

SSRC(32bit): 发送端的信源标识符,与发送端的SSRC一致。

丢包数8(8bit):前一个SR或RR包发送后,到当前的SR包或RR包的间隔内,来自源(用源SSRC标识)发送的数据包的丢失个数

累积丢包数(24bit): 自开始接受源(用源SSRC标识)发送的数据开始,累积丢失的数据包的个数

扩展包序号(32bit):低16位为当前接收到的来自源的(用源SSRC标识)数据包的最大序列号;高16位表示RT包序列号的循环计数!我们都知道RTP数据包中,表示序列号的长度为2个字节,即最大的RTP序列号为65536,如果序列号超了65536,假设为655537,这个时候RTCP在扩展包序号中对其说明,如果没有超过65536,则高16位为0,如果超过65536,则为1,如果再来一圈,则为3。做个不恰当的比喻,我们跑步一圈为65536,高16位表示我们当前正在跑第几圈,从0开始计数!

间隔抖动(32bit):RTP数据包间隔时间的统计估计,以时间戳为单位,用无符号整数表示!

LSR(32bit):last SR timestamp,表示上一个SR数据包的NTP时间戳!由于NTP时间戳为64bit,LSR为32bit,LSR取上一个SR的NTP时间戳的中间32位:如上一个SR数据包的NTP时间戳为“0x 00 01 7d 6e 3b 64 5a 1c ”,则LSR为0x 7d 6e 3b 64!

DLSR(32bit):发送当前RR包的时间与上一个SR之间的时间间隔,以1/65536为单位,如,本次RR包与上一次SR的时间间隔为264ms,则本字段的值为0.264*65536=17301.54。

来看一个抓包文件:

该抓包文件中的丢包数为0,累积丢包数为57,扩展的包序号为7070,间隔抖动为26,SR和DLSR均为0。


SS(source description)

接下来,我们看下Source Description:

通过结构图,我们可以看到Source Description分组,也可以叫做SDES的组织结构是按照KLV的格式组织的,key表示具体的类型,length为长度,value为具体的值, key占用1个字节, length占用1个字节!RTCP中可选的KEY如结构图中所列,有如下几种:

CNAME(值为1): 规范终端标识,像SSRC标识,CNAME标识在RTP连接的所有参加者中应是唯一的;

NAME(值为2): 用户名称,用于描述源的用户名;

E-mail(值为3): 电子邮件地址,用于描述源的邮件地址,格式如 John.Deo@megacorp.com;

PHONE(值为4): 用于描述源的电话号码;

LOC(值为5): 用于描述源的地理位置;

TOOL(值为6): 用于描述应用或工具的名称,表示产生流的应用的名称与版本,如"videotool 1.2";

NOTE(值为7): 用于描述源当前状态的过渡信息;

PRIV(值为8): 用于描述针对源的扩展项;

看一个抓包:

通过抓包,我们可以看到该描述中包含一个CNAME的字段,长度为7,值为“DELL-PC”。


RTCP中通过Sender Report和Receive Report在RTP数据传输中提供当前连接中RTP包发送的情况,RTP包接收的情况,RTP包丢失的情况,通过这些信息反馈,我们可以实现对网络传输做一些调整和控制!这就是RTCP的主要功能!

结语

写到这里,关于RTSP传输的三大协议就都熟悉了!RTSP发起或停止连接,以及在连接的过程中控制流媒体数据的行为,如play,scale等,RTP负责数据传输,RTCP负责信息反馈!如此,基于RTSP的流媒体传输就完整建立起来了!那么关于rtsp的专题也可以告一段落了!期待下一个专题吧!感谢朋友们的支持!

本文分享自微信公众号 - 视界音你而不同(WorldOfVideoAndAudio),作者:马龙飞

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手撕RTSP协议系列(6)——SETUP

    SETUP请求的作用是指明媒体流该以什么方式传输;每个流PLAY之前必须执行SETUP操作;发送SETUP请求时,客户端会指定两个端口,一个端口用于接收RTP数...

    视界音你而不同
  • 手撕RTSP协议系列(1)——Rtsp基本流程

    哈喽,久违的小伙伴们!之前开了一个专辑手撕了rtmp协议!对于流媒体协议,rtsp协议也是很常见的,接下来我们继续手撕,手撕rtsp协议!本篇我们首先来简单了解...

    视界音你而不同
  • 手撕RTSP协议系列(7)——PLAY

    上一篇我们熟悉了RTSP_SETUP消息,SETUP可以说是PLAY的准备流程,只有SETUP请求被成功回复之后,客户端才可以发起PLAY请求。本篇我们就来看一...

    视界音你而不同
  • 手撕RTSP协议系列(8)——PAUSE

    上一篇我们讲解了RTSP PLAY消息,PLAY请求成功之后,RTSP server就会一直向客户端发送RTP数据包!开始“播放”之后,我们相应的就会有暂停,停...

    视界音你而不同
  • 手撕RTSP协议系列(9)——TEARDOWN

    上一篇我们讲了RTSP PAUSE消息,本篇我们来看下RTSP TEARDOWN消息!

    视界音你而不同
  • 手撕RTSP协议系列(10)——GET_PARAMETER

    上一篇我们介绍了RTSP的TEARDOWN指令,用于结束一个RTSP的会话!本篇我们来介绍RTSP GET_PARAMETER!

    视界音你而不同
  • 手撕RTSP协议系列(11)——RTSP_SET_PARAMETER

    上一篇介绍了RTSP的GET_PARAMETER消息,看到这个消息类型,我们很容易习惯性的想到应该还要有一个RTSP_SET_PARAMETER消息,如我我们所...

    视界音你而不同
  • 手撕RTSP协议系列(4)——OPTION

    上一篇,我们介绍了sdp相关信息,接下来开始我们介绍RTSP相关的选项,本篇我们首先来看一下OTPION选项。

    视界音你而不同
  • 手撕RTSP协议系列(5)——DESCRIBE

    上一篇我们介绍了RTSP的OPTION指令,客户端发起OPTION请求后,得到了RTSP服务器支持的指令。在此之后,客户端会继续向服务器发送DESCRIBE消息...

    视界音你而不同

扫码关注云+社区

领取腾讯云代金券