RTP协议基础

news2024/11/15 7:16:30

概述

1. 基本概念

        RTP协议,全称为Real-time Transport Protocol(实时传输协议)是一种用于在IP网络上传输音频、视频等实时数据的网络协议。

        在流媒体(流媒体就是指可在线/实时观看音视频的互联网产品数据传输过程中,为保障音视频流的实时传输,需采用RTP和RTCP协议。RTP用来为IP网上的语音、图像、传真等多种需要实时传输的多媒体数据提供端到端的实时传输服务但本身无法保证服务质量,因此,需要配合实时传输控制协议(RTCP)一起使用。

        RTP使用的端口是系统端口(即1024~65535)除外选一个未被使用的偶数UDP端口号,而在同一次会话中的RTCP则使用下一个奇数UDP端口号,端口号5004和5005分别用作RTP和RTCP的默认端口号。

        实际上,RTP只是一个协议框架,它只包含了实时应用的一些共用功能,RTP自己并不对多媒体数据块做任何处理,而只是向应用层提供一些附加信息,让应用层知道应当如何进行处理比如wireshark工具可以分析处理rtp流)。

2. 工作层级

        RTP协议可以归为应用层,因为从开发者的角度看,在应用程序的发送端和接收端,开发者必须编写用RTP封装分组和获取数据块的程序代码。RTP也可以认为是运输层协议,因为RTP封装了多媒体应用的数据块,并且向多媒体应用程序提供了服务(时间戳和序号),因此也可以把RTP看成是在UDP之上的一个运输层子层的协议。

二. rtp消息体

        当我们说“RTP协议”时,我们指的是一个包含了报头结构和有效载荷(Payload封装规则的完整协议。报头显示了一些基本信息和定义了一些基本规则;有效载荷作为RTP报文的一部分,是实际传输的多媒体数据这些数据在发送前被封装在RTP报文中,并在接收端被解封装出来,以便进行后续的解码和播放处理。

        更准确的说法是:有效载荷是RTP报文中的一个重要组成部分,它承载了实际要传输的多媒体数据,而RTP协议则定义了包括有效载荷在内的整个RTP报文的结构和封装规则。

1. 固定头部字段

  • 版本号(V):2比特,当前协议版本号为2标识使用的RTP版本

        重要性:版本号字段的唯一有意义的用途是作为数据包有效性检查的一部分。如果丢失,机器无法判断该数据包是否有效,可能会丢弃该数据包。

  • 填充标志(P):1比特,如果设置P=1,表明数据包尾部有一些额外的填充字节这些字节不是有效载荷的一部分。填充主要用于某些特定场景,如使用特定块大小的加密方案,或使有效载荷格式适应固定容量信道。

        重要性:如果填充部分丢失,可能会导致加密失效,有效载荷格式与信道不匹配。

  • 扩展标志(X):1比特,如果设置X=1,表明在固定头部之后还有一个扩展头部。扩展报头允许各个实现尝试新的与有效负载格式无关的功能。

        重要性:如果置1的情况下,头部扩展内容将变得无法识别,影响数据包的解析。

  • CSRC计数(CC):4比特,表示CSRC(贡献源)标识符的数量
  • 标记(M):1比特,用于特定类型的应用程序,如标识关键帧。

        重要性:丢失此字段可能会影响帧完整性的检测,但音频流可以通过序列号和时间戳的变化来检测帧的开始。 

  •  有效载荷类型Payload Type(PT)(7bit)

        这个字段指出后面的RTP数据属于何种格式的应用。收到RTP分组的应用层就根据此字段指出的类型进行处理。Payload Type 的具体含义取决于具体的音视频编码格式,即在sdp交互的过程中发送方和接收方需要约定相应的编码器和解码器,该编码器/解码器的编号即为负载类型。该值不但说明了rtp包传输的数据是音频还是视频,害指明了应该使用什么解码器解码

对于视频有效载荷:H.261(31)、MPEG1(32)、MPEG1(33)等。

对于音频有效载荷:G.711U, G.711A, G.729, G.723, G.722等。

重要性:如果丢失,接收端将无法解码该RTP包,该RTP包将被丢弃

  • 序号Sequence number(16bit)

        用于标识发送者发送的RTP报文序列号。对每一个发送的RTP分组,其序号加1。当达到最大值(65535)后,重新从0开1在一次RTP会话开始时的初始序号是随机选择的。

注解【1】:2的16次方=65536,从0开始标记:0-65535

重要性:序号使接收端能够发现丢失的分组,同时也能将失序的RTP分组重新按序排列好。如果丢失,则无法进行排序,可能会导致数据包被丢弃。

  • 时间戳(32bit)

        反映了RTP分组中数据的第一个字节的采样时刻。在一次会话开始时间戳的初始值也是随机选择的。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加。

重要性:时间戳可以用来消除抖动以及同步音视频。如果丢失,接收端可能无法正确排序和播放媒体。

  • 同步信源(SSRC)32bit

        用于标识同步信源。该标识符是随机选择的,参加同一视频会议的两个同步信源不能有相同的SSRC。这里的同步信源是指产生媒体流的信源,例如麦克风、摄像机等,它通过RTP报头中的一个32位数字SSRC标识符来标识,而不依赖于网络地址,接收者将根据SSRC标识符来区分不同的信源,进行RTP报文的分组。

重要性:如果丢失,接收端将无法确认RTP包的来源,可能无法进行分组和播放。

拓展:[Extended sequence number: 65538] 头部字段

        在RTP(实时传输协议)协议中,并没有直接称为“Extended sequence number”的字段。然而,在处理RTP报文的序列号(Sequence Number)时,确实存在一种机制来扩展序列号的范围,以便在序列号翻转时仍能准确计算丢包率和网络性能指标。

1)序列号的限制与翻转

  • RTP报文中的序列号是一个16位的字段,其取值范围从0到65535。
  • 当序列号达到65535后,会翻转回0,这是由序列号的位数限制所决定的

2)处理序列号翻转的方法

        由于它在达到65535后会翻转回0,在同一个SSRC中,出现相同序列号的rtp报文这可能导致在计算丢包率时出现混淆

  • 为了在序列号翻转时仍能准确计算丢包率和网络性能指标,接收端需要维护一个额外的计数器(如wrap-around counter),用于记录序列号翻转的次数。
  • 通过将接收到的序列号与翻转次数相结合,可以计算出所谓的“扩展序列号”(Extended sequence number),尽管在RTP协议本身中并没有直接定义这个字段。

3)扩展序列号的计算

        假设seq_num是当前接收到的RTP报文的序列号,wrap_around_count是序列号翻转的次数。则扩展序列号(Extended sequence number)可以通过以下公式计算:

extended_seq_num = seq_num + (65536 * wrap_around_count)

2. Rtp数据部分:Payload字段(有效载荷)

        有效载荷是RTP报文的核心内容,用于封装实际要传输的多媒体数据(如音频、视频等)。

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

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

相关文章

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集

文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标:跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…

Vue响应式的原理

一. Vue响应式原理的核心概念 1. Vue响应式原理基于以下核心概念: ① 响应式对象:Vue使用Object.defineProperty()来 reactive(反应)对象中的属性,使其变化可以被检测。 注意: ★ Object.definePropert…

Python字符串处理技巧:一个小技巧竟然能省下你一半时间!

获取Pyhon及副业知识,关注公众号【软件测试圈】 效率翻倍的秘密:Python字符串操作的5个惊人技巧 在Python编程中,字符串处理在数据分析、Web开发、自动化脚本等多个领域都有广泛应用。Python提供了一系列强大的字符串处理函数,能够…

蚓链数字化生态平台:构建城市智能商业,引领协同发展新潮流

​在当今数字化飞速发展的时代,城市商业的运行模式正在经历着数字化变革。蚓链数字化生态平台应运而生,以其强大的功能和创新的理念,成为构建城市智能商业枢纽中心的关键力量,推动着平台互通、业务贯通、管理协同的全新发展格局。…

MySQL数据库-索引和视图

一、视图 1.什么是视图 MySQL中的视图(view)是一种虚拟表,其内容由查询定义,视图本身并不包含数据。视图看起来和真实的表完全相同,但其中的数据来自定义视图时用到的基本表,并且在打开视图时动态生成&am…

【JavaWeb项目】——外卖订餐系统之登入、登入后显示餐品信息、用户注册、注销部分

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

什么是内网ip地址?如何查询电脑内网ip地址

在数字化时代,互联网已经成为我们日常生活和工作中不可或缺的一部分。无论是家庭网络还是企业办公环境,每台接入网络的设备都需要一个独特的标识来区分彼此,这个标识就是IP地址。IP地址全称为“互联网协议地址”,是设备在网络中的…

springboot整合junit-用于测试用例

package impl;public interface BookDao {public void save(); }第一步:打开软件,点击file,点击new 然后选择module,在右侧选择springboot 第二步:选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选…

react中路由懒加载

// 1.引入方法,用于创建路由实例 // createBrowserRouter是用于创建history模式 // createHashRouter是用于创建hash模式 // 路由模式的切换只需要更改创建路由实例的方法就行了,其他地方不需要更改 import { createBrowserRouter,createHashRouter } fr…

deployment

一.deployment rc和rs控制器都是控制pod的副本数量的,但是,他们两个有个缺点,就是在部署新版本pod或者回滚代码的时候,需要先apply资源清单,然后再删除现有pod,通过资源控制,重新拉取新的pod来实…

【Vue3复习】Vite创建项目报错解决

报错: Cannot find package ‘vite’ 出错原因分析 使用命令npm create vuelatest创建项目时,没有按顺序执行以下提示命令 解决 依序执行这三条指令 注意 如果没有执行 npm install 这条指令,直接用VS Code打开项目时,env.d.…

职场英语培训柯桥成人学外语|邮件里别乱用“Dear”,老外才不会这么写!

写邮件是职场上的必修课,而一封好的英语邮件应当从适合的称呼开始。 说到称呼,你的脑子里是不是冒出了一个单词“Dear” 从小我们就被教育写英语作文时,开头先来个Dear,结尾写个Sincerely,简直不要太顺手~ 然&#xff…

HDU1071——The area,HDU1072——Nightmare,HDU1073——Online Judge

目录 HDU1071——The area 题目描述 运行代码 代码思路 HDU1072——Nightmare 题目描述 运行代码 代码思路 HDU1073——Online Judge 题目描述 运行代码 代码思路 HDU1071——The area 题目描述 Problem - 1071 运行代码 #include <iostream> #include &…

CloudWeGo新手教程视频:手把手教你从0到1打造电商商城微服务demo

概要 Gomall 电商项目视频教程&#xff0c;由 CloudWeGo 技术社区出品&#xff0c;旨在帮助开发者掌握 Go 语言项目开发和微服务架构。教程通过演示 CloudWeGo 项目中的 Kitex 和 Hertz 框架&#xff0c;引导 Go 初学者学习常见的技术和开源中间件。 观看教程请访问&#xff…

高效灵活 | 前端利器 Vue.js 是一个构建用户界面的渐进式框架。

Vue.js 是一个构建用户界面的渐进式框架。 官网&#xff1a;https://cn.vuejs.org/ 基本特性 数据驱动&#xff1a;通过响应式机制&#xff0c;实现数据的变化自动触发视图的更新。 组件化架构&#xff1a;高度可复用的组件结构&#xff0c;提升代码组织性和可维护性。 虚拟…

爬虫-实战爬取虎扑ACG帖子

要求如下: 爬取虎扑步行街 ACG 版面的数据,要求使用多线程来并发爬取。范围是第一页的所有帖子,每个帖子包含标题、主题内容和第一页的所有回复内容。最后打印出爬到的所有帖子的标题。 网址是:ACG圈 - 虎扑社区。 针对上面的要求,我们进行分析: 首先是要使用多线程范…

YOLO5项目目录最强解析

YOLO5项目目录解析 YOLOv5 项目目录下的文件和目录的结构&#xff0c;以下是对每个目录和文件的解释&#xff1a; 目录 &#x1f4c1; .github: 存放 GitHub 相关配置和文件&#xff0c;如 GitHub Actions 工作流文件、Issue 模板等&#xff0c;用于自动化构建和持续集成等功…

Java编写SIP协议

1、编写Server代码 package com.genersoft.iot.vmp.sip; import javax.sip.*; import javax.sip.message.*; import javax.sip.header.*; import java.util.*;public class SimpleSipServer implements SipListener {private SipFactory sipFactory;private SipStack sipStack…

神经网络的参数初始化【PyTorch】

文章目录 1、常见初始化方法2、代码2.1、导包&#xff1a;2.2、均匀分布随机初始化2.3、固定初始化2.4、全0初始化2.5、全1初始化2.6、正态分布随机初始化2.7、kaiming 初始化2.8、xavier 初始化2.9、完整代码 3、小节 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专…

哨兵Sentinel-2一些有趣的示例

每天我们都会观察周围的世界。在许多情况下&#xff0c;我们认为我们所看到的事物是不言而喻的&#xff0c;它们只是我们所认为的那样。其他时候&#xff0c;我们会更仔细地分析和询问那些看起来不太熟悉的事物。有时&#xff0c;仅仅改变我们的视觉视角就能提供额外的启发和启…