RTC协议与算法基础 - RTP/RTCP

news2024/12/28 18:17:58

首先,需要说明下,webrtc的核心音视频传输是通过RTP/RTCP协议实现的,源码位于src/modules/rtp_rtcp目录下:

下面让我们对相关的内容基础进行简要分析与说明:

一、TCP与UDP协议

1.1、TCP协议

TCP为了实现数据传输的可靠性,采用的是“发送→确认→丢包→重传”这样一套机制。而且为了增加网络的吞吐量,还采用了延迟确认和Nagle算法(Nagle算法,将多个小包组成一个大包发送,组合包的大小不超过网络最大传输单元)。这套机制就是TCP产生延迟的根本原因。

为了增加网络的吞吐量,接收端不必每收到一个包就确认一次,而是对一段时间内收到的所有数据集体确认一次即可。为了实现该功能,TCP通常会在接收端启动一个定时器。定时器的时间间隔一般设置为200ms,即每隔200ms确认一次接收到的数据。这就是延迟确认机制。除此之外,TCP在发送端也启动了一个定时器,不过该定时器的功能不是发送确认消息,而是用来判别是否有丢包的情况。发送端定时器的时长为一个RTO(Retransmission Timeout,重传超时时长。其值约等于RTT的平均值,每次超时后以指数级增长。RTT表示一个数据包从发送端到接收端,然后再回到发送端所用的时长)。如果在定时器超时后仍然没有收到包的确认消息,则认为包丢失了,需要发送端重发丢失的包。这就是TCP的丢包重传机制。

1.2、UDP协议

UDP属于不可靠传输协议。在传输数据时,它不保证数据能可靠到达,也不保证数据有序,但它最大的优点就是传输速度“快”。由于UDP没有TCP那一套保证数据可靠、有序的控制逻辑,所以它不会被“人为”地变慢,因此它的实时性是最高的。

争对UDP丢包和抖动的问题,WebRTC给出了一套比较完美的解决方案,通过NACK、FEC、Jitter Bufer以及NetEQ技术既可以解决丢包和抖动问题,又不会产生影响服务质量的时延。通过上面的分析可以知道,由于TCP在极端网络情况下无法控制传输的时延大小,所以在做实时通信传输时,应该首选UDP。

二、RTP/RTCP协议

2.1、RTP协议

2.1.1、RTP协议概述

RTP—实时传输协议,它是基于UDP协议进行传输的,其在多点传送(多播)或单点传送(单播)的网络上,提供端对端的网络传输功能,适合应用程序传输实时数据,如:音频,视频或者仿真数据。RTP没有为实时服务提供资源预留的功能,也不保证QoS(服务质量)。

RTP的数据传输功能由一个控制协议(RTCP)来扩展,通过扩展,可以用一种方式对数据传输进行监测控制,该协议(RTCP)可以升级到大型的多点传输(多播)网络,并提供最小限度的控制和鉴别功能。RTP 和 RTCP 被设计成和下面的传输层和网络层无关。

总结:

RTP 只是简单数据的封装,基于UDP。没有任何的QoS 的支持。

RTCP 是对RTP 的扩展,也就是为解决了RTP 只是数据传输,没有管理的问题。

2.1.2、 RTP协议格式概述

RFC3550_RTP协议中文版

rfc3550

RTP协议报文

RTP报文主要由两部分组成,head和payload,head最小12个字节,可扩展。

版本( V ):2 比特 此域定义了 RTP 的版本。此协议定义的版本是 2。(值 1 被 RTP 草案版本使用,值 0 用在最初"vat"语音工具使用的协议中。)

填充( P ):1 比特 若填料比特被设置,则此包包含一到多个附加在末端的填充比特,填充比 特不算作负载的一部分。 填充的最后一个字节指明可以忽略多少个填充比特。 填充可能用于某些 具有固定长度的加密算法,或者用于在底层数据单元中传输多个 RTP 包。

扩展(X):1 比特 若设置扩展比特,固定头(仅)后面跟随一个头扩展。

CSRC 计数(CC):4 比特 CSRC 计数包含了跟在固定头后面 CSRC 识别符的数目。

标志(M):1 比特 标志的解释由具体协议规定。它用来允许在比特流中标记重要的事件,如 帧边界。

负载类型(PT):7 比特 此域定义了负载的格式,由具体应用决定其解释。协议可以规定负载 类型码和负载格式之间一个默认的匹配。 其他的负载类型码可以通过非 RTP 方法动态定义。 RTP 发送端在任意给定时间发出一个单独的 RTP 负载类型;此域不用来复用不同的媒体流。

序列号(sequence number):16 比特 每发送一个 RTP 数据包,序列号加 1,接收端可 以据此检测丢包和重建包序列。 序列号的初始值是随机的(不可预测),以使即便在源本身不加密 时(有时包要通过翻译器,它会这样做),对加密算法泛知的普通文本攻击也会更加困难。

时间戳(timestamp): 32 比特时间戳反映了 RTP 数据包中第一个字节的采样时间。时 钟频率依赖于负载数据格式,并在描述文件(profile)中进行描述。也可以通过 RTP 方法对负 载格式动态描述。时间戳可用来实现不同媒体流的同步

×××C:32 比特 用以识别同步源。标识符被随机生成,以使在同一个 RTP 会话期中没有 任何两个同步源有相同的 ×××C 识别符。尽管多个源选择同一个 ×××C 识别符的概率很低,所 有 RTP 实现工具都必须准备检测和解决冲突。若一个源改变本身的源传输地址,必须选择新的 ×××C 识别符,以避免被当作一个环路源。

小结:

其实rtp 没有什么,只是在udp 发送数据的基础上,增加head 封装数据。来标识数据的类型和属性

序列号 , 未来解决丢包和乱序问题

负载类型,音视频类型

时间戳,做音视频同步用的

唯一标识, 由于是udp 端口可以接收多个源数据,要区分开哪一个发送源发送的数据

RTP包主要由两部分组成,head和payload,head最小12个字节,可扩展。

2.2、RTCP协议

由于rtp 太过于简单,只是在UDP 做了一些简单的封装,很多的功能无法支持,例如:重传等机制。那如何扩展呢,就是我们接下来要讲的rtcp 协议

RTCP功能

在使用 RTP 包传输数据时,难免会发生丢包、乱序、抖动等问题,下面我们来看一下使用的网络一般都会在什么情况下出现问题:

网络线路质量问题引起丢包率高;

传输的数据超过了带宽的负载引起的丢包问题;

信号干扰(信号弱)引起的丢包问题;

跨运营商引入的丢包问题 ;

RTCP 的作用,收集当前网络质量状态;

1、服务质量的监视与反馈

在RTP会话期间,每个会话参与者周期性地向所有其他参与者发送RTCP控制信息包。每个RTCP信息包不封装音频数据或者视频数据,而是封装发送端或接收端的统计报表。这些信息包括发送的信息包数目、丢失的信息包数目和信息包的抖动等情况,这些反馈信息反映了当前的网络状况,对发送端、接收端或者网络管理员都非常有用。

2、确定 RTP用户源 

RTCP为每个RTP用户提供了一个全局唯一的规范名称 (Canonical Name)标志符 CNAME,接收者使用它来追踪一个RTP进程的参加者。当发现冲突或程序重新启动时,RTP中的同步源标识符SSRC可能发生改变,接收者可利用CNAME来跟踪参加者。同时,接收者也需要利用CNAME在相关RTP连接中的几个数据流之间建立联系。当 RTP需要进行音视频同步的时候,接受者就需要使用 CNAME来使得同一发送者的音视频数据相关联,然后根据RTCP包中的计时信息(Network time protocol)来实现音频和视频的同步。

3、控制 RTCP传输间隔

由于每个对话成员定期发送RTCP信息包,随着参加者不断增加,RTCP信息包频繁发送将占用过多的网络资源,为了防止拥塞,必须限制RTCP信息包的流量,控制信息所占带宽一般不超过可用带宽的 5%,因此就需要调整 RTCP包的发送速率。由于任意两个RTP终端之间都互发 RTCP包,因此终端的总数很容易估计出来,应用程序根据参加者总数就可以调整RTCP包的发送速率。

4、传输最小进程控制信息 

这项功能对于参加者可以任意进入和离开的松散会话进程十分有用,参加者可以自由进入或离开,没有成员控制或参数协调。

RTCP 报文的种类

根据所携带的控制信息不同,RTCP信息包可分为五类

官方文档参考:RFC 3550 - RTP: A Transport Protocol for Real-Time Applications

SR(Sender Report 源报告报文)

发送端报告,向接收端发送,包含发送端的统计信息,如发送的数据包数量、字节数、丢包数量等。

RR(Receiver Report 接收者报告报文)

接收端可以使用RTCP的RR报文向发送端发送接收报告,报告中记录着从上一次报告到本次报告之间丢失了多少包、丢包率是多少、延时是多少等一系列信息。

SEDS(Source Description 源描述报文)

源描述报文,包含有关参与会话的参与者的信息,如CNAME(参与者的标识符)、名称、电话号码等。

BYE(离开申明报文)

结束会话报文,用于说明哪些(音视频)媒体源现在不可用了。当WebRTC收到该报文后,应该将SSRC所对应的通道删除。

APP(特殊应用包报文)

给应用预留的RTCP报文,应用可以根据自己的需要自定义一些应用层可以解析的报文。

RTPFB(反馈报文)

RTP的反馈报文,是指RTP传输层面的报文。该报文可以装入不同类型的子报文。该报文中可以包含多个子报文,其中WebRTC使用到的报文只有4项。

NACK,接收端用于通知发送方在上次包发送周期内有哪些包丢失了。在NACK报文中包含两个字段:PID和BLP。PID(Package ID)字段用于标识从哪个包开始统计丢包;而BLP(16位)字段表示从PID包开始,接下来的16个RTP包的丢失情况。

TMMBR和TMMBN是一对报文,TMMBR表示临时最大码流请求报文,TMMBN是对临时最大码流请求的应答报文。这两个报文虽然在WebRTC中实现了,但已被WebRTC废弃,其功能由TFB和REMB报文所代替。

TFB是WebRTC中TCC算法的反馈报文,该报文会记录包的延迟情况,然后交由发送端的TCC算法计算下行带宽。

PSFB(负载相关的反馈报文)

RTP中与负载相关的反馈报文。同样,该报文也可以装入不同类型的子报文。

PLI报文与FIR报文很类似,当发送端收到这两个报文时,都会触发生成关键帧(IDR帧),但两者还是有一些区别的。PLI报文是在接收端解码器无法解码时发送的报文。FIR报文主要应用于多方通信时后加入房间的参与者向已加入房间的共享者申请关键帧。通过这种方式,可以保障后加入房间的参与者不会因收到的第一帧不是关键帧而引起花屏或黑屏的问题。

REMB报文是WebRTC增加的反馈报文,用于将接收端评估出的带宽值发给发送端。不过,由于最新的WebRTC已全面启用基于发送端的带宽估算方法,即TCC,因此目前REMB仅用于向后兼容,不再做进一步更新。

为了对网络更加准确完善的描述,在出现了205、206 也是目前webrtc 在使用的的内容。

RTCP 有两个最重要的报文:RR 和 SR 。通过这两个报文的交换,各端就知道自己的网络质量到底如何了。

总结

三、总结

RTP是一个非常轻量的传输协议,特别适合传输音视频数据,或者说它就是专门为传输音视频数据而开发的。RTP控制协议RTCP对于传输服务质量起着关键的作用,WebRTC的服务质量系统中的大量控制参数都是通过RTCP获取的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于grafana+elk等开源组件的 云服务监控大屏架构

本套大屏,在某云服务大规模测试环境,良好运行3年. 本文主要展示这套监控大屏的逻辑架构.不做具体操作与配置的解释. 监控主要分为三部分: 数据展示部分数据存储数据采集 1. 数据展示 数据展示方面主要使用grafana 2. 数据存储 根据数据种类和特性和用途的不同,本套监控采用…

专业120+总400+北京理工大学826信号处理导论考研经验北理工电子信息与通信工程,真题,大纲,参考书。

**今年专业课826信号处理导论(信号系统和数字信号处理)120,总分400,应群里同学需要,自己总结一下去年的复习经历,希望对大家复习有帮助。**专业课: 北京理工大学专业826是两门合一,…

应用开发平台集成表单设计器系列之4——表单构造器深度了解

背景 平台需要实现自定义表单功能,作为低代码开发的一部分,通过技术预研和技术选型,选择form-create和form-create-designer这两个组件进行集成作为实现方案。通过深入了解和技术验证,确认了组件的功能能满足需求,具备…

Tensorflow笔记(二):激活函数、优化器等、神经网络模型实现(商品销量预测)

import tensorflow as tf import numpy as np from tqdm import tqdm# ----------------------------- tensor常用函数2 ----------------------------------- a tf.constant([1, 2, 3, 1, 2]) b tf.constant([0, 1, 3, 4, 5]) c tf.where(tf.greater(a, b), a, b) # 若a&g…

6语言交易所/多语言交易所php源码/微盘PHP源码

6语言交易所PHP源码,简单测试了一下,功能基本都是正常的。 由于是在本地测试的运行环境的问题,K线接口有点问题,应该在正式环境下是OK的。 源码下载地址:6语言交易所/多语言交易所php源码/微盘PHP源码.zip 程序截图…

YOLOv5改进 | 图像去雾 | 利用图像去雾网络UnfogNet辅助YOLOv5进行图像去雾检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv5针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv5的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可…

PC电脑如何使用HDMI连接小米电视当显示屏

使用HDMI连接好当时和电脑,HDMI2.0会更清晰;小米电视会自动弹窗提示你有HDMI 接口连接,或者你进入信号源进行选择即可;需要平时我们电脑的显示器正常连接,然后按 win p ,选择 扩展 屏幕; 进入设…

Spring MVC文件上传配置

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 文件上传 Spring MVC文件上传基于Servlet 3.0实现;示例代码如下: Overrideprotected void customizeRegistration(ServletRegistration.Dynamic reg…

【基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸设计】

1.前言 基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸 在当今物联网与智能家居科技日益发达的时代,将先进技术和传统养鱼艺术融合,创造出智能、自动化且极具观赏价值的鱼缸已成为一种创新趋势。SeeedStudio推出的Xiao ESP32-S3 Sense开发板以其卓越的性能…

sadtalker-api/

———— 下载sadtalker工程文件,包括844个模型 。。。。。。。。。。。。。。。。 配置环境: pip源,设置: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple anaconda prompt, 进入命令行 how在 …

【教学类-44-07】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体、print dashed 德彪行书行楷)

背景需求: 前文制作了三种字体的A4横版数字描字帖 【教学类-44-06】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体)-CSDN博客【教学类-44-06】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体)https://…

蓝桥杯刷题 Day36 倒计时26天 纯练题的一天

[蓝桥杯 2022 省 B] 积木画 题目描述 小明最近迷上了积木画,有这么两种类型的积木,分别为 I 型(大小为 2个单位面积) 和 L 型 (大小为 3 个单位面积): 同时,小明有一块面积大小为2N 的画布,画布由2N 个 11 区域构成。…

vb.net+zxing.net随机彩色二维码、条形码

需要zxing库支持ZXing.NET Generate QR Code & Barcode in C# Alternatives | IronBarcode 效果图: 思路:先生成1个单位的二维码,然后再通过像素填充颜色,颜色数组要通过洗牌算法 洗牌算法 Dim shuffledCards As New List(…

docker-compose 部署nginx和jdk步骤

** yum安装jdk ** 1、​​yum -y list java* 查看可安装java版本 选择安装 java-1.8.0-openjdk-accessibility.x86_64 2、​​yum install -y java-1.8.0-openjdk-devel.x86_64 耐心等待安装完成即可 3、​java -version​​ 即可查看当前安装的java版本 4、yum安装的jdk&am…

Java代码审计安全篇-XXE(XML外部实体注入)漏洞

前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各…

HTML5+CSS3小实例:衣服颜色选择器

实例:衣服颜色选择器 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=…

软件杯 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

262:vue+openlayers 移动地图获取中心点经纬度信息

第262个 点击查看专栏目录 本示例介绍演示如何在vue+openlayers中移动地图并获取中心点经纬度信息。这里主要用到了是view的getCenter方法,这一功能在实际项目中很有用,能给出一个清晰的定位。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

解决后端传给前端的日期问题

解决方式&#xff1a; 1). 方式一 在属性上加上注解&#xff0c;对日期进行格式化 但这种方式&#xff0c;需要在每个时间属性上都要加上该注解&#xff0c;使用较麻烦&#xff0c;不能全局处理。 2). 方式二&#xff08;推荐 ) 在WebMvcConfiguration中扩展SpringMVC的消息转…

JDBC基础(CRUD)使用详解(mysql)

1. 什么是JDBC JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范.这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访…