从零开始精通RTSP之深入理解RTCP协议

embedded/2024/10/18 8:22:55/

概述

        RTCP,即实时控制协议,英文全称为RTP Control Protocol,是RTP的配套协议。与RTP不同,RTCP本身不传输实时数据,而是用于提供有关RTP会话的统计信息和控制功能。RTCP的主要目标是提供数据传输质量的反馈,帮助参与者了解会话状态,并实现会话中的松散控制。

工作机制

        RTCP在RTP会话中以较低的速率定期发送数据包,通常是RTP数据速率的5%至10%。这种低速率传输是为了减少对网络带宽的占用,同时仍然能够提供有效的反馈和控制信息。在多点传输环境中,所有参与方都会定期发送和接收RTCP报文,形成双向的信息交换机制。

        RTCP的一个重要功能是:计算RTP会话的参与者数量。通过RTCP数据包中的信息,每个参与者都能够了解当前会话中的其他参与者数量,从而动态地调整RTCP数据包的发送速率,确保反馈信息的有效性。RTCP还用于估算RTP数据流的往返时间(RTT),这对于拥塞控制和同步至关重要。通过测量RTCP数据包的往返时间,发送者可以调整其发送速率,以避免网络拥塞并保持流畅的传输。

        RTCP与RTP是相辅相成的协议,RTP负责实时数据的传输,而RTCP则提供关于RTP会话的反馈和控制信息。RTCP数据包中的统计信息和控制消息有助于RTP发送者优化其传输策略,比如:通过调整发送速率、改变编码方式等来提高传输质量。同时,RTCP还提供了会话管理的功能,比如:通过BYE消息来优雅地关闭RTP会话。这种协同工作使得RTP和RTCP成为实时流媒体传输中不可或缺的协议组合。

报文格式

        RTCP报文具有统一的二进制格式,用于在实时流媒体传输中提供服务质量监控、反馈控制和同步协调等功能。一般而言,一个RTCP报文包含一个固定的报文头和一个或多个分组。

        报文头是所有RTCP报文共有的部分,它位于报文的起始位置,包含了基本信息以便识别和解析后续的报文内容。RTCP报文头的字段如下。

        Version (V): 占2位,固定为2,表示当前使用的RTCP版本为版本2。

        Padding (P): 占1位,若值为1,表明报文尾部包含填充字节,以确保报文长度为32位的整数倍。填充字节的个数存储在报文最后一个有效字节的最低4位。

        Reception Report Count (RC): 占5位,表示紧跟在报文头后的接收报告块(Reception Report Block)的数量。此字段仅在RR(Receiver Report)报文中有效,其他类型的RTCP报文可能没有接收报告块。

        Packet Type (PT): 占8位,标识RTCP报文的类型。常见的PT值包括:

          200: Sender Report (SR)

          201: Receiver Report (RR)

          202: Source Description (SDES)

          203: Goodbye

          204: Application-Defined (APP)

        Length: 占16位,表示报文长度(不包括报文头),以32位字(4字节)为单位。因此,整个报文(包括报文头)的总长度为4 × (Length + 1)个字节。

        RTCP报文的实际内容由一个或多个RTCP分组组成,每个RTCP分组通常包含以下字段。

        类型(Type):指明该分组的类型,与报文头部的分组类型字段相对应。

        长度(Length):表示该分组的长度,通常以32位字为单位,但某些情况下可能以字节为单位,具体取决于分组类型。

        数据(Data):包含分组的具体数据,其格式和内容根据分组类型而定。

SSRCCSRC列表

        在RTCP报文中,SSRCCSRC列表通常出现在每个RTCP分组的开始部分,用于标识该分组所属的RTP流。接收端可以根据SSRC来区分不同的流,并进行相应的处理。在RTCP分组中,SSRCCSRC列表是重要的组成部分,尤其在SR(发送者报告)和RR(接收者报告)等类型的RTCP分组中。

        SSRC

        SSRC,即同步源标识符,是一个32位的标识符,用于唯一标识RTP流的来源。在同一个RTP会话中,每个同步源都必须有一个唯一的SSRC。这个标识符是随机选择的,通常使用MD5随机算法来生成,以确保其全局唯一性。

        CSRC列表

        CSRC,即贡献源标识符,也是一个32位的标识符,用于标识对一个RTP混合器产生的新包有贡献的所有RTP包的源。当多个RTP流通过一个混合器合并成一个新的RTP流时,混合器会将每个原始流的SSRC添加到CSRC列表中,并生成一个新的SSRC来标识合并后的流。在多点传输(比如:混音会议)中,RTP包可能包含CSRC列表,记录参与混合的同步源。接收端据此识别混合源的身份,实现多路媒体流的正确解码和显示。CSRC列表跟随在SSRC之后,是一个可变长度的列表,包含了所有对该RTP流有贡献的源的SSRC。这种设计使得RTCP能够准确地追踪和报告多媒体会话中的多个源,尤其是在存在混合器或其他流媒体处理设备的复杂网络环境中。

常见报文类型

        RTCP数据包有几种不同的类型,每种类型都有其特定的用途,常见的RTCP报文类型如下。

        Sender Report (SR) (PT = 200)

        发送者报告报文,由活动的RTP发送者定期发送,提供了关于该发送者所发送数据的统计信息,比如:发送的RTP数据包数量、累积的RTP时间戳、以及发送数据所用的时间间隔等。SR报文还包含了多个接收者报告块(Reception Report Block),每个块描述了发送者接收到其他参与者数据的接收质量情况。

        SR报文的Payload部分包含了一系列关于发送者自身RTP数据传输的统计信息,以及针对其他接收者的接收质量报告,具体结构如下。

        1、NTP Timestamp (Network Time Protocol timestamp): 64位字段,表示发送SR报文时的绝对时间(以NTP时间表示)。这个时间戳通常用于精确的时间同步,使得所有参与方能够对RTP时间戳有一个共同的理解。

        2、RTP Timestamp: 32位字段,与发送者最近发送的RTP数据包的时间戳相对应。这个字段用于RTP流内部的时间同步,确保媒体数据的正确播放顺序和同步。

        3、Sender's Packet Count: 32位字段,表示发送者自会话开始以来发送的RTP数据包总数。这个数值用于计算发送速率、丢包率等统计信息。

        4、Sender's Octet Count: 32位字段,表示发送者自会话开始以来发送的RTP数据总字节数。该值有助于计算平均带宽使用情况。

        5、Reception Report Blocks (RRBs): 一系列接收报告块,每个块描述了发送者对接收到的某个特定同步源(SSRC)数据的接收质量统计。每个RRB包含以下字段:

        SSRC of source: 32位,标识该报告块所描述的源的SSRC

        Fraction Lost: 8位,以1/256的比例表示从上一次发送SR或RR以来丢包的比例。

        Cumulative Number of Packets Lost: 24位,自上次SR或RR以来累计丢失的数据包数量(不包括本次报告期间新丢失的包)。

        Extended Highest Sequence Number Received: 32位,接收到的最大序列号,包括高位扩展位,用于检测并纠正序列号回绕。

        Interarrival Jitter: 32位,表示接收到的数据包间隔的抖动,用于评估网络延迟变化情况。

        Last SR (LSR) Timestamp: 32位,接收者最近一次收到的SR报文的RTP时间戳。

        Delay Since Last SR (DLSR) Interval: 32位,从接收者收到最近一个SR报文到发送此RR报文的时间间隔(以秒为单位,精度为1/65536秒)。

        Receiver Report (RR) (PT = 201)

        接收者报告报文,由非活动发送者(即仅接收RTP数据但不发送数据的参与者)或者作为对SR报文响应的一部分发送。RR报文包含一系列接收者报告块,每个块描述了发送者对某个特定同步源(SSRC)数据的接收统计,比如:接收到的数据包数量、丢包数量、最大延时、抖动等,这些信息有助于评估网络状况和调整传输参数。

        Source Description (SDES) (PT = 202)

        源描述报文,包含了一系列关于参与者的文本性元数据项,比如:用户名称、电子邮件地址、电话号码等。其中最重要的SDES项是CNAME(Canonical Name),它是一个永久且全局唯一的标识符,用于关联同一用户在不同会话或不同网络条件下的不同SSRC

        Goodbye (PT = 203)

        BYE(有时也写作BYB)报文,用于通知所有参与者某个同步源已经离开会话。它包含了要离开的SSRC列表,使得其他参与者能够清理相关状态,并停止向这些SSRC发送数据。

        Application-specific Function (APP) (PT = 204)

        应用特定功能报文,允许在RTCP框架内扩展以支持特定应用的需求。这类报文携带应用程序定义的数据,可能用于传递特定服务质量(QoS)信息、媒体元数据或其他与会话管理相关的控制信息。

        Picture Loss Indication (PLI) 和 Full Intra Request (FIR)

        虽然不是标准的RTCP报文类型,但PLI和FIR是通过RTCP APP报文实现的两种常用的视频流控制机制。PLI用于请求发送方重新发送关键帧(I帧),通常在检测到视频失序或严重错误时发送。FIR则更具体地要求接收方发送一个完整的I帧刷新,以恢复解码器状态或改善视频质量。

        Negative Acknowledgment (NACK)

        NACK报文,同样不是标准RTCP报文类型,而是通过RTCP APP扩展实现的,用于请求重新发送丢失或损坏的RTP数据包。NACK报文中包含丢失数据包的序列号信息,使得发送方能够针对性地重传缺失的内容。

总结

        RTCP作为RTP的配套协议,在实时流媒体传输中发挥着至关重要的作用。它通过提供统计信息和控制功能,帮助RTP发送者优化传输策略、管理会话状态,并确保实时数据在复杂的网络环境中能够高效、可靠地传输。通过深入理解RTCP协议,我们可以更好地掌握实时流媒体技术,并开发出更加稳定、高效的实时通信和流媒体应用。


http://www.ppmy.cn/embedded/10111.html

相关文章

加速大数据分析:Apache Kylin使用心得与最佳实践详解

Apache Kylin 是一个开源的分布式分析引擎,提供了Hadoop之上的SQL接口和多维分析(OLAP)能力以支持大规模数据。它擅长处理互联网级别的超大规模数据集,并能够进行亚秒级的查询响应时间。Kylin 的主要使用场景包括大数据分析、交互…

DDP、pytorch的分布式 torch.distributed.launch 训练说明

0、DDP的运行原理 执行步骤: 将data分为多个不同的batch,每个gpu得到batch都是不一样的然后将每个batch放在每个gpu上独立的执行最后得到的梯度求平均将平均梯度平分给每个gpu执行下一次迭代 这也就意味着你有多少个gpu,训练的速度也会提升…

level2行情+在线金融数据库

jvQuant:一站式金融量化服务平台 jvQuant作为一个领先的金融量化服务平台,为广大投资者和量化分析师提供了全面、高效、稳定的数据接入和量化分析服务。该平台涵盖了多个关键功能,包括交易接入、WebSocket行情接入、历史行情查询、在线数据库…

E-MapReduce极客挑战赛季军方案

前一段时间我参加了E-MapReduce极客挑战赛,很幸运的获得了季军。在这把我的比赛攻略给大家分享一下,希望可以抛砖引玉。 赛题分析与理解 赛题背景: 大数据时代,上云已成为越来越多终端客户大数据方案的落地选择,阿里…

milvus 相似度检索的底层原理

Milvus作为一款专为向量相似度检索设计的开源搜索引擎,其底层原理涉及高效的向量索引结构、并行计算优化、分布式架构设计等多个关键技术点。以下是对Milvus进行相似度检索时底层原理的简要概述: ### 1. **向量索引结构** #### **近似最近邻搜索 (Appr…

LSB隐写是什么?

LSB隐写是什么? 所需知识二进制位LSB的概念LSB在数值中的作用LSB在量化中的应用小结 LSB隐写原理应用威胁与挑战改进补充资料 所需知识 二进制数 位(bit) LSB概念 二进制 在计算机科学中,二进制数是一种数制,使用两…

ESP32与SD卡交互实现:文件读写实战与初始化详解及引脚定义

本代码实现ESP32与SD卡的交互,包括定义SPI引脚、创建自定义SPI类实例、编写WriteFile与ReadFile函数进行文件读写。setup函数初始化串口、SPI、SD卡,向“/test.txt”写入“myfirstmessage”,读取并打印其内容。loop函数留空待扩展。 1. 需要…

MongoDB聚合运算符:$setIntersection

MongoDB聚合运算符:$setIntersection 文章目录 MongoDB聚合运算符:$setIntersection语法使用举例元素数组举例检索授予当前用户角色的文档创建角色创建用户创建集合使用John登录检索文档检查文档使用Jane登录检索文档验证文档 $setIntersection聚合运算符…