从WebRtc学习RTCP协议
文章目录
- RTCP支持的消息类型
- RTCP协议头
- WebRTC的反馈报文
- RTPFB支持的报文类型:
- PSFB支持的报文类型:
- 参考
RTCP是RTP的控制协议.
那么RTCP能对RTP做哪些控制呢?其中最为大家熟知的就是 丢包控制。
发送端发送数据后,接收端如果发现有RTP包丢失了,可以使用RTCP的 NACK报文通知发送方,告诉对方具体是哪些包丢失了,然后让发送方重发前面丢失的包。
此外,接收端还可以使用RTCP的 RR报文向发送端发送接收报告,报告中记录着从上一次报告到本次报告之间丢失了多少包、丢包率是多少、延时是多少等一系列信息。
同理,发送端也可以向接收端发送 SR报文,报告一段时间内一共发送了多少包等。
RTCP支持的消息非常多,在此我们将一些最常见的RTCP报文消息整理了出来.
SR和RR报文。这两个报文在WebRTC中至关重要,因为网络质量评估与控制需要的大量参数都是从这两个报文中获得的。
下面介绍一下RTCP支持的其他的消息类型:
RTCP支持的消息类型
SDES报文是用来描述(音视频)媒体源的。它可以描述的内容包括媒体源的名称、Email地址,电话等。但实际上,这些描述项都没太大价值。唯一有价值的是CNAME项,其作用是将不同的源(SSRC)绑定到同一个CNAME上。举个例子,当SSRC有冲突时,可以通过CNAME将旧的SSRC更换成新的SSRC,从而保证在通信的每个SSRC都是唯一的。
BYE报文用于说明哪些(音视频)媒体源现在不可用了。当WebRTC收到该报文后,应该将SSRC所对应的通道删除。
APP报文是给应用预留的RTCP报文,应用可以根据自己的需要自定义一些应用层可以解析的报文。
RTPFB报文,即RTP的反馈报文,是指RTP传输层面的报文。该报文可以装入不同类型的子报文。
与RTPFB对应的是PSFB,即RTP中与负载相关的反馈报文。同样,该报文也可以装入不同类型的子报文。
RTCP协议头
RTCP协议头如下:
Version即协议版本,固定值为2。P字段为填充位标识。PT字段即Payload Type,与RTP中的PT字段类似。
RTCP中的Count字段是RTP中所没有的,该值针对RTCP中不同的报文有不同的含义:
对于RR/SR报文而言,Count表示它们所携带的接收报告的个数;
对SDES报文而言,Count表示SDES报文中item的个数;
对于BYE报文而言,Count表示BYE报文中SSRC/CSRC的个数;
而对于APP报文来说变化就比较大了,Count用于标识应用自定义的子消息类型。
Length字段表示整个RTCP包的大小,包括RTCP头、RTCP负载以及填充字节。需要注意的是,Length字段是以4字节为单位的,即(N−1)个4字节。
WebRTC的反馈报文
已知PT为205和206的报文类型属于反馈报文。报文中可以包含多个子报文,其中WebRTC使用到的报文只有某几项。
RTPFB支持的报文类型:
第一项NACK,用于通知发送方在上次包发送周期内有哪些包丢失了:
NACK报文中包含两个字段:PID和BLP。PID(Package ID)字段用于标识从哪个包开始统计丢包;
而BLP(16位)字段表示从PID包开始,接下来的16个RTP包的丢失情况。(BLP(Bitmask of Following Lost Packet),从丢失包开始的位掩码)
第二项TMMBR和第三项TMMBN是一对报文,TMMBR表示临时最大码流请求报文,TMMBN是对临时最大码流请求的应答报文。这两个报文虽然在WebRTC中实现了,但已被WebRTC废弃,其功能由TFB和REMB报文所代替。
第四项TFB是WebRTC中TCC[插图]算法的反馈报文,该报文会记录包的延迟情况,然后交由发送端的TCC算法计算下行带宽。(TCC(Transport-wide Congestion Control),基于发送端的带宽评估算法)
PSFB支持的报文类型:
PSFB报文包括PLI报文、FIR报文以及REMB报文。
其中PLI报文与FIR报文很类似,当发送端收到这两个报文时,都会触发生成关键帧(IDR帧)。
PLI报文是在接收端解码器无法解码时发送的报文。
FIR报文主要应用于多方通信时后加入房间的参与者向已加入房间的共享者申请关键帧。通过这种方式,可以保障后加入房间的参与者不会因收到的第一帧不是关键帧而引起花屏或黑屏的问题。
REMB报文是WebRTC增加的反馈报文,用于将接收端评估出的带宽值发给发送端。不过,由于最新的WebRTC已全面启用基于发送端的带宽估算方法,即TCC,因此目前REMB仅用于向后兼容,不再做进一步更新。
参考
李超《WebRTC音视频实时互动技术:原理、实战与源码分析》
https://weread.qq.com/web/reader/377320f07260a55337761c1kc81322c012c81e728d9d180
从WebRtc学习RTCP协议相关推荐
- 从WebRtc学习RTP协议
文章目录 TCP为何不适用于实时音视频 UDP->RTP RTP协议结构 Jittbuffer RTP扩展头 RTP填充数据 参考 TCP为何不适用于实时音视频 可靠性是以牺牲实时性为代价的.按 ...
- WebRTC中RTP协议详解
WebRTC中RTP协议详解 WebRTC中RTP协议详解 WebRTC中RTP协议详解 前言 一.RTP/RTCP在协议栈中的位置 1. RTP传输流程图 二.RTP Header 的结构图 1.R ...
- WebRTC学习进阶之路 --- 五、WebRTC网络知识详解(三)(最全流媒体协议(RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL)/SDP)
WebRTC学习进阶之路系列总目录:https://blog.csdn.net/xiaomucgwlmx/article/details/103204274 RTP:实时传输协议(Real-time ...
- 智能会议系统(33)---WebRTC学习之四:最简单的语音聊天
WebRTC学习之四:最简单的语音聊天 VoiceEngine中与最简单语音聊天相关的头文件有五个,如下表所示: 头文件 包含的类 说明 voe_base.h VoiceEngineObserver ...
- 音视频传输-之RTP/RTCP协议
前言 RTP/RTCP协议设计用来传输音视频数据,对应的RFC文档为:RFC3550,对应的中文版RFC3550中文版 RTP被定义为在一对一或者一对多的传输情况下工作,其目的是为了提供时间信息和实现 ...
- RTSP、RTP、RTCP协议简介
什么是RTSP RTSP(Real Time Streaming Protocol)是早期常用的流媒体协议,它用来建立客户端与服务器之间的会话,客户端发布播放暂停等命令,协议由RealNetworks ...
- WebRTC学习—WebRTC详解
目录 一:WebRTC学习了解 (一)WebRTC应用场景 (二)WebRTC的难点 (三)学习流程 (四)学习目标 二:WebRTC介绍 (一)概述 (二)WebRTC可以实 ...
- RTSP/RTP/RTCP协议简介
什么是RTSP RTSP(Real Time Streaming Protocol)是早期常用的流媒体协议,它用来建立客户端与服务器之间的会话,客户端发布播放暂停等命令,协议由RealNetworks ...
- WebRTC学习笔记
http://blog.chinaunix.net/uid-24567872-id-3961702.html 1. WebRTC学习 1.1 WebRTC现状 本人最早接触WebRTC是在 ...
最新文章
- MYSQL性能调优及架构设计学习笔记-基础篇MYSQL架构组成
- 利用WinRAR命令行压缩文件或文件夹
- 写给后端程序员的HTTP缓存原理介绍
- js获取当前日期方法
- openkm zip 导入乱码问题解决
- mysql新加不了数据库_MySQL数据库之mysql增加新用户无法登陆解决方法
- 计算机学院创新实验室,ACM创新实验室概况
- [JavaScript] JavaScript作用域深度解析
- 金属100寸“电视”却无屏,语音识别+DTS+1080P,微鲸M1测评
- zabbix专题:附加 zabbix配置文件详解
- STC学习:振动传感器
- 用纯fme批量生成界址点成果表(模板格式全部自拟)
- 信息安全技术 实验四 木马及远程控制技术
- 【教程】PhotoShop一些快捷键
- python 自动发微博_用 Python 自动定时发微博
- 2.2 数据库应用系统开发方法
- windows该任务映像已损坏或已篡改。(异常来自HRESULT:0x80041321)
- 无货源模式,跨境电商时代的风向标
- ICCV2017 论文浏览记录(转)
- USB答题卡识别主界面Demo
热门文章
- 摇杆控制方向原理_图文全面讲解多种方向控制阀的原理和区别....
- 那些容易遗忘的web前端问题
- 如何隐藏 video 元素的下载按钮
- 使用phpstorm+wamp实现php代码实时调试审计
- python模块之configparser
- PostgreSQL 9.6 keepalived主从部署
- 如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境 [转]
- 大学计算机专业高考听力,高考英语听力测试对考生听力策略反拨作用的研究
- php-v 查看不到版本,解決php -v查看到版本於phpinfo()打印的版本不一致問題
- jlink怎么调试linux程序_纯Linux下的 ARM裸机调试环境搭建(GDB + JLink)