RTP/RTCP 协议讲解

文章目录

  • 前言
  • 一、RTP 协议
    • 1、RTP 协议概述
    • 2、RTP 工作机制
    • 3、RTP 协议的报文结构
    • 4、wireshark 抓取 RTP 报文
  • 二、RTCP 协议
    • 1、RTCP 协议概述
    • 2、RTCP 工作机制
    • 3、RTCP 数据报
    • 4、wireshark 抓取 RTCP 报文
  • 三、RTSP 和 RTP 的关系
  • 四、易混淆概念
    • 1、RTP over UDP 和 RTP over RTSP 有什么区别?
    • 2、RTP over RTSP 是不是就是 RTP over TCP?
    • 3、有 PS 流的封装格式吗?
    • 4、RTP over TCP 需要 4 字节的头部


前言

目前,支持流媒体传输的协议主要有实时传输协议 RTP(Real-Time Transport Protocol)、实时传输控制协议 RTCP(Real-Time Transport Control Protocol)和实时流协议 RTSP(Real-Time Streaming Protocol)等。上文我们针对 RTSP 进行了详细的分析及讲解:RTSP协议抓包及讲解。

流媒体协议栈如下图所示:
在这里插入图片描述
本文对 RTP 及 RTCP 协议进行了讲解,以及使用 wireshark 抓包对其抓到的报文进行详细分析。


一、RTP 协议

1、RTP 协议概述

RTP(Real-time Transport Protocol)是用于 Internet 上针对多媒体数据流的一种传输层协议,RTP 协议和 RTP 控制协议 RTCP 一起使用。RTP 被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同步。RTP 的典型应用建立在 UDP 上,但也可以在 TCP 或 ATM 等其他协议之上工
作。

RTP 不像 http 和 ftp 可完整的下载整个影视文件,它是以固定的数据率在网络上发送数据,客户端也是按照这种速度观看影视文件,当影视画面播放过后,就不可以再重复播放,除非重新向服务器端要求数据。

RTP 本身只保证实时数据的传输,并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠 RTCP 提供这些服务。

2、RTP 工作机制

rtp 协议就是提供了时间标签序列号以及其它的结构用于控制适时数据的流放。在流的概念中” 时间标签” 是最重要的信息。发送端依照即时的采样在数据包里隐蔽的设置了时间标签。在接受端收到数据包后,就依照时间标签按照正确的速率恢复成原始的适时的数据。不同的媒体格式调时属性是不一样的。

但是 rtp 本身并不负责同步,rtp 只是传输层协议,为了简化运输层处理,提高该层的效率。 将部分运输层协议功能(比如流量控制)上移到应用层完成。同步就是属于应用层协议完成的。它没有运输层协议的完整功能,不提供任何机制来保证实时地传输数据,不支持资源预留,也不保证服务质量。rtp 报文甚至不包括长度和报文边界的描述。同时 rtp 协议的数据报文和控制报文的使用相邻的不同端口,这样大大提高了协议的灵活性和处理的简单性。

rtp 协议和 udp 二者共同完成运输层协议功能。udp 协议只是传输数据包,不管数据包传输的时间顺序。rtp 的协议数据单元是用 udp 分组来承载的。在承载 rtp 数据包的时候,有时候一帧数据被分割成几个包具有相同的时间标签,则可以知道时间标签并不是必须的。而 udp 的多路复用让 rtp 协议利用支持显式的多点投递,可以满足多媒体会话的需求。

3、RTP 协议的报文结构

每一个 RTP 数据报都由头部(Header)和负载(Payload)两个部分组成,其中头部前 12 个字节的含义是固定的,而负载则可以是音频或者视频数据。

RTP 头格式如图所示:
在这里插入图片描述
开始 12 个八进制出现在每个 RTP 包中,而 CSRC 标识列表仅出现在混合器插入时。各段含义如下:

  • 版本(V)
    • 2 位, 标识 RTP 版本。
  • 填充标识(P)
    • 1 位,如设置填充位,在包尾将包含附加填充字,它不属于有效载荷。填充的最后一个八进制包含应该忽略的八进制计数。某些加密算法需要固定大小的填充字,或为在底层协议数据单元中携带几个 RTP 包。
  • 扩展(X)
    • 1 位,如设置扩展位,固定头后跟一个头扩展。
  • CSRC 计数(CC)
    • 4 位,CSRC 计数包括紧接在固定头后 CSRC 标识符个数。
  • 标记(M)
    • 1 位,标记解释由设置定义,目的在于允许重要事件在包流中标记出来。设置可定义其他标示位,或通过改变位数量来指定没有标记位。
  • 载荷类型(PT)
    • 7 位,记录后面资料使用哪种 Codec ,receiver 端找出相应的 decoder 解码出来
      在这里插入图片描述
  • 序列号
    • 16 位,序列号随每个 RTP 数据包而增加 1,由接收者用来探测包损失。序列号初值是随机的,使对加密的文本攻击更加困难。
  • 时间戳
    • 32 位,时间戳反映 RTP 数据包中第一个八进制数的采样时刻,采样时刻必须从单调、线性增加的时钟导出,以允许同步与抖动计算。时标可以让 receiver 端知道在正确的时间将资料播放出来。
      在这里插入图片描述
      由上图可知,如果只有序列号,并不能完整按照顺序的将 data 播放出来,因为如果 data 中间有一段是没有资料的,只有序列号的话会造成错误,需搭配上让它知道在哪个时间将 data 正确播放出来,如此我们才能播放出正确无误的信息。
  • SSRC
    • 32 位,SSRC 段标识同步源。此标识不是随机选择的,目的在于使同一 RTP 包连接中没有两个同步源有相同的 SSRC 标识。尽管多个源选择同一个标识的概率很低,所有 RTP 实现都必须探测并解决冲突。如源改变源传输地址,也必须选择一个新 SSRC 标识以避免插入成环行源。
  • CSRC 列表
    • 0 到 15 项,每项 32 位。CSRC 列表表示包内的对载荷起作用的源。标识数量由 CC 段给出。 如超出 15 个作用源,也仅标识 15 个。CSRC 标识由混合器插入,采用作用源的 SSRC 标识。

RTP 用到的地方就是 PLAY ,服务器往客户端传输数据用 UDP 协议,RTP 是在传输数据的前面加了个 12 字节的头(描述信息)。

RTP 载荷封装设计本文的网络传输是基于 IP 协议,所以最大传输单元(MTU)最大为 1500 字节,在使用 IP/UDP/RTP 的协议层次结构的时候,这其中包括至少 20 字节的 IP 头,8 字节的 UDP 头,以及 12 字节的 RTP 头。这样,头信息至少要占用 40 个字节,那么 RTP 载荷的最大尺寸为 1460 字节。以 H264 为例,如果一帧数据大于 1460,则需要分片打包,然后到接收端再拆包,组合成一帧数据,进行解码播放。

4、wireshark 抓取 RTP 报文

抓取方法参考RTSP协议抓包及讲解。

我们可以参考上面的 RTP 协议的报文结构对下面一包 RTP 报文进行分析
在这里插入图片描述

二、RTCP 协议

1、RTCP 协议概述

RTCP(Real-time Transport Control Protocol 或 RTP Control Protocol 或简写 RTCP),实时传输控制协议,是实时传输协议(RTP)的一个姐妹协议。

注:RTP 协议和 RTP 控制协议(RTCP)一起使用,而且它是建立在 UDP 协议上的(一般用于视频会议)

2、RTCP 工作机制

当应用程序开始一个 rtp 会话时将使用两个端口:一个给 rtp,一个给 rtcp。rtp 本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠 rtcp 提供这些服务。

RTCP 负责管理传输质量在当前应用进程之间交换控制信息。在 RTP 会话期间,各参与者周期性地传送 RTCP 包,包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料。因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。

RTP 和 RTCP 配合使用,能以有效的反馈和最小的开销使传输效率最佳化,故特别适合传送网上的实时数据。根据用户间的数据传输反馈信息,可以制定流量控制的策略,而会话用户信息的交互,可以制定会话控制的策略。

3、RTCP 数据报

在 RTCP 通信控制中,RTCP 协议的功能是通过不同的 RTCP 数据报来实现的,主要有如下几种类型:

  • SR:发送端报告,所谓发送端是指发出 RTP 数据报的应用程序或者终端,发送端同时也可以是接收端。
  • RR:接收端报告,所谓接收端是指仅接收但不发送 RTP 数据报的应用程序或者终端。
  • SDES:源描述,主要功能是作为会话成员有关标识信息的载体,如用户名、邮件地址、电话号码等,此外还具有向会话成员传达会话控制信息的功能。
  • BYE:通知离开,主要功能是指示某一个或者几个源不再有效,即通知会话中的其他成员自己将退出会话。
  • APP:由应用程序自己定义,解决了 RTCP 的扩展性问题,并且为协议的实现者提供了很大的灵活性。

4、wireshark 抓取 RTCP 报文

我们可以参考上面的 RTCP 数据报对下面一包 RTP 报文进行分析
在这里插入图片描述
过滤 rtcp,可以看到下面第 397、401 包报文为接收端报告+源描述,第 473、475 包报文为发送端报告 + 源描述报文
在这里插入图片描述

三、RTSP 和 RTP 的关系

RTSP 与 RTP 最大的区别在于:RTSP 是一种双向实时数据传输协议,它允许客户端向服务器端发送请求,如回放、快进、倒退等操作。当然,RTSP 可基于 RTP 来传送数据,还可以选择 TCP、UDP、组播 UDP 等通道来发送数据,具有很好的扩展性,它是一种类似于 http 协议的网络应用层协议。作为一个应用层协议, RTSP 提供了一个可供扩展的框架,它的意义在于使得实时流媒体数据的受控和点播变得可能。RTP 是实时传输协议,一般不作为单独应用层协议处理;

我们来看看下图所示的例子:服务器端实时采集、编码并发送两路视频,客户端接收并显示两路视频。由于客户端不必对视频数据做任何回放、倒退等操作,可直接采用 UDP+RTP+组播实现。
在这里插入图片描述
rtsp 可基于 rtp 之上,比如常见的视频流传输过程:视频压缩文件 -> rtp 打包 -> 基于 udp 的 rtsp 网络传输;也可以不做成 rtp 包,直接基于 udp 传送,如视频压缩文件 -> 基于 udp 的 rtsp 网络传输。

具体协议内容可参看以下标准文档:
RTP/RTCP-------------------------RFC3550/RFC3551
RTSP -------------------------------RFC2326

四、易混淆概念

1、RTP over UDP 和 RTP over RTSP 有什么区别?

不一样,RTP over UDP 是 RTP 下层使用 udp 传输,RTP over RTSP 是指的用 rtsp 协议建立会话, 然后使用 RTP 协议传输数据;

2、RTP over RTSP 是不是就是 RTP over TCP?

不是。RTP over RTSP 是指的用用 rtsp 协议建立会话,然后使用 RTP 协议传输数据,至于下面用 udp 还是 tcp 是不确定的。

3、有 PS 流的封装格式吗?

PS,TS,ES 都有

rtp 和 rtsp 协议是应用层的,tcp 和 udp 是传输层的,所以只能说 rtp over tcp/udp,而且一般情况下一个点播需要 rtsp+rtp+rtcp 三个协议共同来实现。

4、RTP over TCP 需要 4 字节的头部

RTP,RTCP 数据和 RTSP 数据共享 TCP 数据通道,所以必须有一个标识来区别三种数据。RTP 和 RTCP 数据会以【 $符号+1 个字节的通道编号+2 个字节的数据长度】,共 4 个字节的前缀开始,RTSP 数据是没有前缀数据的。

RTP 数据和 RTCP 数据的区别在于第二个字节的通道编号,据观察 RTP 通道编号是偶数,RTCP通道编号是奇数。

两种发送方式的 RTP 包的打包方式和内容都是一样的,不同的地方主要是 rtsp 会话交互发送的信息还有通过 TCP 方式发送的 RTP 包前面再加四个字节的头,加四个字节头以及数据发送的代码如下:

static int send_rtp_packet(rtpclientparam_info* pinfo, unsigned char *buf,int len)
{int sfd = 0;int sendtonum;struct sockaddr_in s;if(!pinfo || !buf)return 1;if(pinfo->rtpovertcp)// rtp over tcp:需要另外添加 4 字节的头部{unsigned char tcp_pkt[len + 4];//tcp 包: 缓冲区uint16 *intlvd_ch = (uint16 *)&tcp_pkt[2];//缓冲区长度tcp_pkt[0] = '$';tcp_pkt[1] = (unsigned char)(pinfo->dst_videoport);//在这里目标端口号就是 Channelidprintf("tcp_pkt[1]=%d,port=%d\n",tcp_pkt[1],pinfo->dst_videoport);*intlvd_ch = htons((uint16)len);//两个字节的缓冲区长度memcpy(tcp_pkt + 4, buf, len);sendtonum = send(pinfo->tcpfd, tcp_pkt, len+4, MSG_NOSIGNAL);} else{s.sin_family = AF_INET;s.sin_addr.s_addr = pinfo->dstip;sfd = video_sockethandle;s.sin_port = htons(pinfo->dst_videoport);sendtonum = sendto(sfd, buf, len, 0, (struct sockaddr *)&s, sizeof(s));} if(sendtonum != len)return 2;return 0;
}

我的qq:2442391036,欢迎交流!


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s架构简述

以部署一个nginx服务说明kubernetes系统各个组件调用关系: 一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件 apiServer组件会调用scheduler组件来决定到底…

Linux系统编程系列之线程

一、什么是线程 线程(Thread)是计算机中的基本执行单元,是操作系统调度的最小单位。线程是进程内的一个独立执行流程,一个进程可以包含多个线程,这些线程共享进程的资源,但每个线程都有自己的独立栈空间以及…

【day11.02】网络编程脑图

大小端存储: ip地址划分:

【小沐学前端】从零开始搭建一个Vue项目

文章目录 1、简介1.1 Vue 核心功能1.2 Vue API风格1.3 node环境 2、构建项目2.1 vue create2.2 vue ui2.3 vue init2.4 vite 结语 1、简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&am…

华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos

华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品优势1.3 应用场景1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 memos3.1 memos介绍3.2 Docker 环境搭建…

OSI体系结构和TCP/IP体系结构

在第一章( 计网第一章 )的时候,曾经提到过OSI体系结构和TCP/IP体系结构,并对它们进行了简单的对比。这篇博客在其基础上进行更深层次的理解。 一.OSI体系结构: 通信子网: 计算机网络在逻辑功能上可以分为…

Redis主从复制、哨兵模式、群集部署

目录 一、Redis高可用 二、Redis主从复制 主从复制的作用 主从复制的流程 实例 三、Redis哨兵模式 哨兵的核心功能 哨兵模式的作用 哨兵结构的组成 故障转移机制 实例 四、Redis群集 集群的作用,可以归纳为两点: Redis集群的数据分片&#…

wireshark of tshark tools v3.4.0版本 支持json

tshark(1) Install tshark (Wireshark) Ver.3.4.0 on CentOS7 --It must be "ps", "text", "pdml", "psml" or "fields". TCP 协议中的三次握手和四次挥手是 TCP 连接建立和关闭的过程。 三次握手 客户端向服务器发送 SYN…

Python绘图系统25:新增8种绘图函数

文章目录 常用绘图函数单选框的更改逻辑源代码 Python绘图系统: 前置源码: Python打造动态绘图系统📈一 三维绘图系统 📈二 多图绘制系统📈三 坐 标 轴 定 制📈四 定制绘图风格 📈五 数据生成导…

自动混剪多段视频、合并音频、添加文案的技巧分享

在如今的社交媒体时代,视频的重要性越来越被人们所重视。许多人喜欢记录生活中的美好瞬间,并将其制作成视频分享给朋友和家人。然而,对于那些拍摄了大量视频的人来说,一个一个地进行剪辑和合并可能是一项令人头痛的任务。但是&…

GraphQL全面深度讲解

目录 一、GraphQL 是什么 二、GraphQL 规范 数据模型 字段 参数 三、运行示例 四、优势和劣势 优势 劣势 一、GraphQL 是什么 GraphQL 是一种用于 API 的查询语言,也是一个基于服务端的运行引擎。 GraphQL 提供了一套完整的规范和描述用于查询 API&#xf…

一种基于体素的射线检测

效果 基于体素的射线检测 一个漏检的射线检测 从起点一直递增指定步长即可得到一个稀疏的检测 bool Raycast(Vector3 from, Vector3 forword, float maxDistance){int loop 6666;Vector3 pos from;Debug.DrawLine(from, from forword * maxDistance, Color.red);while (loo…

【LeetCode热题100】--98.验证二叉搜索树

98.验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 由于二…

【LeetCode热题100】--108.将有序数组转换为二叉搜索树

108.将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 二叉搜索树的中序遍历是升序…

华为云云耀云服务器L实例评测|Elasticsearch的springboot整合 Kibana进行全查询和模糊查询

前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到各种问题,在解决问题的过程中学到不少和运维相关的知识。 在前几期的博客中,介绍了Elasticsearch的Docker版本的安装,Elasticsearch的可视化Kibana工具…

计算机组成与结构

目录 一、计算机硬件组成 二、中央处理单元 1、功能 2、CPU的组成 三、校验码 四、体系结构的分类 1、按处理机数量分类 2、Flynn分类 五、指令系统 1、指令 2、寻址方式 3、指令系统 #CISC(复杂指令集计算机) RISC(精简指令集…

深眸科技入局AI视觉行业,以深度学习赋能视觉应用推进智造升级

随着科技的飞速发展,人工智能技术已经成为改变我们生活的重要力量,而深度学习作为人工智能的一个重要分支,近年来随着卷积神经网络的突破和推广,取得了显著进展,并呈现爆发式增长势头。 目前AI技术已经被迅速引入到机…

设计模式10、外观模式Facade

解释说明:外观模式(Facade Pattern)又称为门面模式,属于结构型模式 Faade 为子系统中的一组接口提供了一个统一的高层接口,该接口使得子系统更加容易使用 外观(Facade)角色:为多个子系统对外提供…

【爬虫】用wget命令爬虫的简易教程

文章目录 1. 获取登录的请求2. 用postman模拟登录请求3. 用wget模拟登录请求并保存cookie4. 开始爬取网站5. 查看爬取结果6. 网站爬虫简易教程 爬取需要登录的网站的资源 背景:对于一些网站需要使用用户名和密码登录并且使用了https,我们如果不通过凭证将…

BiMPM实战文本匹配【上】

引言 今天来实现BiMPM模型进行文本匹配,数据集采用的是中文文本匹配数据集。内容较长,分为上下两部分。 数据准备 数据准备这里和之前的模型有些区别,主要是因为它同时有字符词表和单词词表。 from collections import defaultdict from …