从WebRtc学习RTP协议
1、TCP为何不适用于实时音视频
可靠性是以牺牲实时性为代价的。按照TCP原理,当出现极端网络情况时,理论上每个包的时延可达到秒级以上,而且这种时延是不断叠加的。这对于音视频实时通信来说是不可接受的。
TCP为了实现数据传输的可靠性,采用的是“发送→确认→丢包→重传”这样一套机制。而且为了增加网络的吞吐量,还采用了延迟确认和Nagle算法(将多个小包组成一个大包发送,组合包的大小不超过网络最大传输单元)
为了增加网络的吞吐量,接收端不必每收到一个包就确认一次,而是对一段时间内收到的所有数据集体确认一次即可。为了实现该功能,TCP通常会在接收端启动一个定时器。定时器的时间间隔一般设置为200ms,即每隔200ms确认一次接收到的数据。这就是延迟确认机制。‘
除此之外,TCP在发送端也启动了一个定时器,不过该定时器的功能不是发送确认消息,而是用来判别是否有丢包的情况。发送端定时器的时长为一个RTO(RTO(Retransmission Timeout),重传超时时长。其值约等于RTT的平均值,每次超时后以指数级增长。RTT表示一个数据包从发送端到接收端,然后再回到发送端所用的时长)如果在定时器超时后仍然没有收到包的确认消息,则认为包丢失了,需要发送端重发丢失的包。这就是TCP的丢包重传机制。

假如接收端发送的确认消息丢失了,按TCP的协议规则,通信双方会怎么做呢?首先,发送端只有等到定时器超时后,才能发现该包丢失了。确认丢包后,发送端会将前面所有未确认的包重发一遍。如果在收到数据后,接收端发送的确认消息又丢失了,那么发送端还要等到定时器超时后才能知道包丢失了。因此,在遇到这种极端网络的情况下,TCP传输的时延要累加很多,这种时延是不可控的。
2、UDP->RTP
UDP没有这套逻辑,所以实时性最高。WebRTC通过NACK、FEC、Jitter Bufer以及NetEQ技术既可以解决丢包和抖动问题,又不会产生影响服务质量的时延。
UDP传输一些有前后逻辑关系的数据时有缺陷,所以在UDP之上的应用层上使用RTP传输音视频数据
3、RTP协议结构
保持有序:Sequence Number
我们希望在使用RTP传输音视频数据时,一旦有数据丢失,可以快速定位是哪个数据包丢失了。
如果给每个发送的数据包都打上一个编号,并且编号是连续的,那么,接收端就可以很容易地判断出哪些包丢失了。在RTP头中,有一个专门记录该编号的字段,称作Sequence Number。在发送端,每产生一个RTP包,其Sequence Number字段中的值就被自动加1,以保证每个包的编号唯一且连续。当接收端收到RTP包时,会对Sequence Number字段进行检查,如果发现Sequence Number不连续了,就说明有包丢失或乱序了。
区分不同类型数据:PayloadType
我们在做网络应用开发时,通常会使用同一个端口传输不同类型的数据,如音视频数据。但接收端是如何区分出不同类型的数据的?RTP在其协议头中设置了PT(PayloadType)字段.比如VP8的PT一般为96,而Opus的PT一般为111
区分不同源数据包:SSRC
同一个端口不仅可以同时传输不同类型的数据包,还可以传输同一类型但不同源的数据包。
流媒体服务就可以将多个不同源(参与人)的视频通过同一个端口发送给客户端。那么客户端(接收端)又是如何将不同源的数据区分出来的呢?这就要说到RTP中另一个字段SSRC了。
RTP要求所有不同的源的数据流之间可以通过SSRC字段进行区分,且每个源的SSRC必须唯一。
每个SSRC所代表的数据流的Sequence Number都是单独计数的,如下图:

完整的协议格式如下:

V(Version)字段,占2位,表示RTP的版本号,现在使用的都是第2个版本,所以该域固定为2。
P(Padding)字段,占1位,表示RTP包是否有填充值。为1时表示有填充,填充以字节为单位。一般数据加密时需要固定大小的数据块,此时需要将该位置1。
X(eXtension)字段,占1位,表示是否有扩展头。如果有扩展头,扩展头会放在CSRC之后。扩展头主要用于携带一些附加信息。
CC(CSRCCount)字段,占4位,记录了CSRS标识符的个数。每个CSRC占4字节,如果CC=2,则表示有两个CSRC,共占8字节。
M(Marker)字段,其含义是由配置文件决定的,一般情况下用于标识边界。比如一帧H264被分成多个包发送,那么最后一个包的M位就会被置位,表示这一帧数据结束了。
timestamp字段,占4字节,用于记录该包产生的时间,主要用于组包和音视频同步。
CSRC字段,指该RTP包中的数据是由哪些源贡献的。比如混音数据是由三个音频混成的,那么这三个音频源都会被记录在CSRS列表中。
4、Jittbuffer
介绍一下使用RTP消除包抖动的一个简要过程:
对于WebRTC而言,其在接收RTP包时,会为之创建一个接收队列来消除包抖动。一开始,队列中只收到了100、101、102和104号包。由于103号包还没到,所以无法将100∼104号包组成一帧数据。103号包没有到有两种可能的原因:一种原因是103号包丢失了;另一种原因是网络抖动导致包乱序了。判断缓冲队列有没有满。如果缓冲队列满了,就说明包真的丢失了。对于103号包来说,由于现在缓冲队
列还不满,因此该包处于待定状态。同理,当107号包到达时,105号包和106号包也处于待定状态。

很快103号包来了,通过对其RTP头中Sequence Number字段的计算,它会被插到队列中对应的空缺位置,此时100∼104号包连成了一串。又由于104号包上有M标记,因此可以将这几个RTP包组成一个完整的帧。接下来,100∼104号包将从缓冲队列中弹出,交由组帧模块处理,空出的位置可以继续接收新包。WebRTC也是通过类似的方法从网络上将一个个RTP包接收下来。
WebRTC中解决RTP包抖动的缓冲队列就是我们通常所说的JitterBufer。
5、RTP扩展头
当X被置位1,说明有扩展头

RTP扩展头由三部分组成,分别为profile、length以及headerex tension。
在RFC5285中定义了两种profile,分别是**{0xBE,0xDE}和{0x10,0x0X}**(分别代表存放在headerextension中的两种不同的数据格式,即one-byte-header和two-byte-header)
接收端解析RTP扩展头时,通过profile来区分header extension中的内容该如何解析。
length字段表示扩展头所携带的header extension的个数。如果length为4,表示有4个headerextension;
header extension字段是扩展头信息,以4字节为单位,其具体含义由profile决定。
one-byte-header格式:
存放在扩展头header extension字段中的数据,由一个字节的Header和N字节的Body组成,而Header又由4位的ID和4位的len组成。注意,length的值为跟在Header后面的数据(以字节为单位)长度减1。

第一个one-byte-header的length值为0,其数据长度为(0+1)=1字节;第二个one-byte-header(的length值为1,其数据占(1+1)=2字节;第三个one-byte-header的length值为3,其数据占(3+1)=4字节。此外,由于扩展头要保持4字节对齐,所以最后两个字节是填充字节,设置为0。

two-byte-header格式:
Header部分由两个字节组成,第一个字节表示ID,第二个字节表示长度,two-byte-header中length存放的是实际长度。

通过上面的介绍我们知道RTP扩展头有三个要点。一是RTP标准头中的X位,该位置1时,RTP中才会有扩展头。二是扩展头中的profile字段指明了扩展头中数据的格式。如果profile为0xBEDE,则说明使用的扩展头格式为one-byte-header;如果profile为0x100X(X表示任意值),则说明使用的扩展头格式为two-byte-header。三是one-byte-header与two-byte-header的区别。如果ID和len放在一个字节中,说明它是one-byte-header格式;如果ID和len放在两个字节中,说明它是two-byte-header格式。
6、RTP填充数据
RTP头中的P位用于标识RTP包中是否有填充数据。如果P位为1,说明RTP包中含有填充数据。
当RTP包中包含有填充数据时,其数据包的最后一个字节记录着包中填充字节的个数,即图中的Padding Size部分。

如果Padding Size为5,说明RTP包中共有5个填充字节,其中包括它自己。在解析RTP Payload部分之前,应将填充部分去掉。去掉填充字节的算法也非常简单,首先读取RTP包的最后一个字节,取出填充字节数,然后从最后一个字节算起,将其前面的Padding Size个字节丢掉即可。
原文链接:[从WebRtc学习RTP协议_rtp payload type_拾牙慧者的博客-CSDN博客](https://link.zhihu.com/?target=https%3A//blog.csdn.net/qq_42604176/article/details/122868578)
★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。
见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
相关文章:

从WebRtc学习RTP协议
1、TCP为何不适用于实时音视频可靠性是以牺牲实时性为代价的。按照TCP原理,当出现极端网络情况时,理论上每个包的时延可达到秒级以上,而且这种时延是不断叠加的。这对于音视频实时通信来说是不可接受的。TCP为了实现数据传输的可靠性…...

centos7 配置samba
samba概述: Windows与Linux之间通信的桥梁,Samba是一个非常强大的文件服务器。Samba端口:udp 137 udp138,tcp139 tcp445。Samba工作模式:C/S模式(客户端-服务器) samba应用环境 1、文件共享&…...

前端转golang从小白到实战自学笔记(2023/3/1)
了解:https://www.runoob.com/go/go-concurrent.htmlgolang学习方向区块链研发工程师go服务器>(特点:数据处理,处理大并发)/游戏软件工程师golang分布式/云计算软件工程师(盛大云、cdn、京东)…...

10个必须知道的JavaScript技巧,让你成为更好的程序员
1.Promise回调地狱Promises 提供了一种优雅的方式来处理 JavaScript 中的异步操作。这也是避免“回调地狱”的解决方案之一。但是我并没有真正理解它的意思,所以我写了这段代码。我做了这些事情:先获取用户的基本信息。按用户信息获取所有文章的简要摘要…...

蓝桥杯真题(JAVA)--分巧克力
题目描述儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有 NN 块巧克力,其中第 i块是HiWi 的方格组成的长方形。为了公平起见,小明需要从这 NN 块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克力需要满足&…...

机器学习:学习KMeans算法,了解模型创建、使用模型及模型评价
机器学习:学习KMeans算法,了解模型创建、使用模型及模型评价 作者:AOAIYI 作者简介:Python领域新星作者、多项比赛获奖者:AOAIYI首页 😊😊😊如果觉得文章不错或能帮助到你学习&#…...

ChatGPT引爆AIGC,垂类龙头迎来“创新春天”
文|智能相对论作者|陈壹一款AI产品,到底有多神?ChatGPT刷新了我们的认知。它用2个月时间,完成TikTok花9个月,Instagram花2年半才做到的事,成为史上用户增速最快破亿的消费级应用程序。它也凭借一己之力,让谷…...

科技制造商必须对安全、设计选择承担更多责任
网络安全和基础设施安全局局长称当今商业网络安全的现状是"不可持续的",公司、消费者和政府必须集体转变期望,让主要软件和硬件制造商对不安全的产品负责,而不是用户。 拜登政府预计将在未来几天发布一项战略,该战略将…...

HTML认知
HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径(常…...

全流程基于最新导则下的生态环境影响评价技术方法及图件制作与案例实践
根据最新生态环境影响评价导则,结合生态环评内容庞杂、综合性强的特点,以既包括陆域、又包括水域的项目为主要案例,对生态环评的具体流程及所需内容进行系统阐述。利用Rstudio、Fragstats等软件分析计算生态环评中所需各种指数,利…...
【Spring】Spring缓存注解@Cacheable、@CacheEvict、@CachePut使
文章目录1 基于注解的支持1.1 Cacheable1.1.1 value属性指定Cache名称1.1.2 使用key属性自定义key1.1.3 condition属性指定发生的条件1.2 CachePut1.3 CacheEvict1.3.1 allEntries属性1.3.2 beforeInvocation属性1.4 Caching1.5 使用自定义注解2 配置Spring对Cache的支持2.1 声…...

学了很久python却什么都做不了?这个方法一定要试试
很多人学了两三个月的python却什么都做不了,但有的人只学了不到一个月的时间,就可以开始自己做项目或者接私活,这是为什么? 作为20年码龄的老程序员,龙叔我觉得除了内在原因外,学习资源占据着大头。拥有好的…...

SiC MOSFET驱动电压的分析
SiC MOSFET驱动电压的分析 tips:资料来自富昌电子,及各个模块数据手册。 1.常见的Vgs与Vgs(th),以及对SiC MOSFET应用的影响 驱动电压Vgs和栅极电压阈值Vgs(th)关系到SiC MOSFET在应用过程中的可靠性,功率损耗(导通电阻),以及驱…...

Python爬虫之Scrapy框架爬虫实战
Python爬虫中Scrapy框架应用非常广泛,经常被人用于属于挖掘、检测以及自动化测试类项目,为啥说Scrapy框架作为半成品我们又该如何利用好呢 ?下面的实战案例值得大家看看。 目录: 1、Scrapy框架之命令行 2、项目实现 Scrapy框架…...

基于DSP的三相开关霍尔永磁同步电机控制
0 前言 本文本应该是一篇 记录我使用DSP28377D控制一个基于三相开关霍尔传感器的高速永磁同步电机全过程的长文,但大部分零散的知识点我都已经写成单独的博客了,所以本文更像是一个知识框架的梳理。本文最终目的是实现高速PMSM的电流-速度双闭环&#x…...
Vue和React的对比
1、响应式原理不同 vue:vue会遍历data数据对象,使用Object.definedProperty()将每个属性都转换为getter和setter,每个Vue组件实例都有一个对应的watcher实例,在组件初次渲染的时候会记录组件用到了那些数据,当数据发生…...
移动进阶之高效开发
响应式布局 媒体查询的语法 /* 4.媒体特性 *//* width / max-width / min-width *//* -webkit-device-pixel-ratio / -webkit-max-device-pixel-ratio / -webkit-min-pixel-ratio *//* orientation: landscape / portrait *//* media screen and (min-width: 320px) {body {b…...
用户手册:遥测服务之推送至 TDengine
创建TelemetryService Yaml 文件 apiVersion: shifu.edgenesis.io/v1alpha1 kind: TelemetryService metadata:name: push-endpoint-1namespace: devices spec:telemetrySeriveEndpoint: http://telemetryservice.shifu-service.svc.cluster.localserviceSettings:SQLSetting:…...

软件测试的主要工作内容是什么
平时说起程序员印象中大都是做Java、做前端、做后端,用着非常晦涩难懂的语言。在电脑前哐哐哐,没一会满屏代码显现出来。然而程序员并不全是印象中这样,还有一部分:他们不常写代码,主要去检查代码,是不是出…...

【云原生kubernetes】k8s中job与cronjob使用详解
一、前言 job,顾名思义就是任务,job的概念在很多框架中都有,而且实际业务场景中也使用非常广泛,比如大家熟悉的hadoop,客户端可以向集群提交一个job,然后集群根据一定的调度策略来处理这个job; …...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...