RTMP协议分析

理论

总体介绍

        RTMP协议是应⽤层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建⽴完成后,RTMP协议也要客户端和服务器通过“握⼿”来建⽴基于传输层链接之上的RTMP Connection链接,在Connection链接上会传输⼀些控制信息,如SetChunkSize,SetACKWindowSize。其中CreateStream命令会创建⼀个Stream链接,⽤于传输具体的⾳视频数据和控制这些信息传输的命令信息。RTMP协议传输时会对数据做⾃⼰的格式化,这种格式的消息我们称之为RTMP Message,⽽实际传输的时候为了更好地实现多路复⽤、分包和信息的公平性,发送端会把Message划分为带有Message ID的Chunk,每个Chunk可能是⼀个单独的Message,也可能是Message的⼀部分,在接受端会根据chunk中包含的data的⻓度,message id和message的⻓度把chunk还原成完整的Message,从⽽实现信息的收发。

     介绍

       RTMP(Real Time Messaging Protocol)是一个应用层协议,主要用于 在Flash player和服务器之间传输视频、音频、控制命令等内容。 该协议的突出优点是: 低延时。RTMP基于TCP, 默认使用端口1935。

RTMP 的主要特点如下:

  1. 实时性强:

    • RTMP 采用 TCP 作为传输层协议,可以提供更可靠的实时数据传输。
    • 通过分块传输和优先级控制等机制,可以最大限度地减少传输延迟。
  2. 可靠性高:

    • RTMP 建立在 TCP 之上,能够保证数据传输的可靠性。
    • 支持重传机制来弥补丢包对实时性的影响。
  3. 支持多种媒体格式:

    • RTMP 可以传输 FLV、MP3、H.264 等常见的视频和音频格式。
    • 还支持 ActionScript 对象等数据格式的传输。
  4. 广泛应用:

    • RTMP 被广泛应用于直播、视频点播、在线教育等领域。
    • 主要被 Adobe Flash/AIR 平台和 NGINX 服务器所支持。

总之, RTMP 是一种专门为实时流媒体传输而设计的开放协议,具有高实时性、高可靠性和多格式支持等特点,是当前互联网视频直播和点播领域的重要技术标准之一。

名词解释

为了方便后续阅读,先学习主要的名词解释:
1. Payload: 数据包中包含的数据,例如音频样本或压缩视频数据。
2. Packet: 由固定的头部和载荷数据组成的数据包。
3. Port: 传输协议用于区分主机内部多个目的地的抽象。 
4. Transport address: 网络地址和端口的组合,标识传输层端点。
5. Message stream/stream id: 消息流动的逻辑通信通道。
6. Message stream ID: 每个消息都有一个ID,用于标识消息所属的消息流。
7. Chunk (块): 消息的一个片段,消息被分成较小的部分并交错发送。
8. Chunk stream(块流): 允许块在特定方向流动的逻辑通信通道。
9. Chunk stream ID: 每个块都有一个ID,用于标识块所属的块流。
10. Multiplexing: 将独立的音频/视频数据合成为一个连贯的音频/视频流的过程。
11. DeMultiplexing: 多路复用的反向过程,将交错的音频和视频数据组装成原始的音频和视频数据。
12. Remote Procedure Call (RPC): 允许客户端或服务器调用对端子程序或过程的请求。
13. Metadata: 对数据的描述,如电影标题、时长、创作日期等。
14. Application Instance: 客户端连接的服务器上的应用程序实例。
15. Action Message Format (AMF): 用于序列化ActionScript对象图的紧凑二进制格式。

RTMP播放基本流程

往后我们通过wireshark抓包方式,来检验。

 Step 1:tcp三次握手

Step 2:rtmp握⼿

 RTMP握手主要分为: 简单握手和复杂握手

简单握手

建⽴⼀个有效的RTMP Connection链接,⾸先要“握⼿”:客户端要向服务器发送C0,C1,C2(按序)三个 chunk,服务器向客户端发送S0,S1,S2(按序)三个chunk,然后才能进⾏有效的信息传输。

RTMP协议的实现者需要保证这⼏点:

客户端要等收到S1之后才能发送C2
客户端要等收到S2之后才能发送其他信息(控制信息和真实⾳视频等数据)
服务端要等到收到C0之后发送S1
服务端必须等到收到C1之后才能发送S2
服务端必须等到收到C2之后才能发送其他信息(控制信息和真实⾳视频等数据)

 实际实现中为了在保证握⼿的身份验证功能的基础上尽量减少通信的次数,⼀般的发送顺序是这样的,这⼀点可以通过wireshark抓ffmpeg推流包进⾏验证

握手包分析

Time (4 bytes): 这个字段包含一个时间戳,这个时间戳应该被用作此端点发送的所有未来块的时间戳的起点
Zero (4 bytes): 这个字段必须全为 0。
Random data (1528 bytes): 这个字段可以包含任何任意值。由于每个端点都必须区分它发起的握手的响应和它的对等端发起的握手,因此这些数据应该足够随机。但不需要加密安全的随机性或动态值。 

交互流程

复杂握手

复杂握手主要是增加了更严格的验证。
主要是将简单握手中1528Bytes随机数的部分平均分成两部分,一部分764Bytes存储public key(公共密钥),另一部分764Bytes存储digest(密文,32字节)。
另外, 复杂握手还有一个明显的特征就是: Version部分不为0,服务器端可根据这个来判断是否简单握手或复杂握手。

 Step 3: connect(连接)

这里也叫连接,连接的是什么呢? 这里必须明白RTMP中一个很重要的概念: Application Instance。连接的是rtmp://192.168.126.129/live/36
其中live就是Application Instance(sport, music)不同的 Application Instance可根据功能等进行区分,比如直播可以用live来表示,点播回放可以用vod来表示。
播放该流时,connect的地址就是rtmp://192.168.126.129/live/36

 流程

客户端发送 connect 命令消息给服务器:这个命令消息包含一些连接参数,如应用程序名称、客户端版本、认证信息等。

服务器处理 connect 命令:服务器验证客户端提供的连接参数是否有效。如果验证通过,服务器会建立一个新的 NetConnection 对象,并返回一个 _result 响应给客户端。
这个 _result 响应包含一些连接元数据,如服务器版本、服务器时间等信息。
客户端处理服务器的 _result 响应:客户端可以根据 _result 响应中的信息,确认连接是否成功建立。

 Step 4: createStream(创建流)

 创建逻辑通道createStream命令用于创建逻辑通道,该通道用于传输视频、音频、
metadata。

在服务器的响应报文中会返回 ,用于唯一的标示该Stream。
注:Message ID和Stream ID的区别

客户端发送 createStream 命令消息给服务器:它的作用是在服务器端创建一个新的消息流。
服务器处理 createStream 命令:服务器会创建一个新的 NetStream 对象,并返回一个 _result 响应给客户端。这个 _result 响应包含了新创建的 NetStream 对象的流 ID。
客户端处理服务器的 _result 响应:客户端接收到服务器的 _result 响应后,就获得了新创建流的流 ID。客户端可以使用这个流 ID 来标识后续发送到服务器的消息流。

举例可看出返回的Stream ID为1。后续的视频或音频的Stream ID就是1 

 

 Step 5: play(播放)

客户端发送play命令来播放指定流。开始传输音视频数据。
如果发送play命令后想要立即播放,需要清空play队列中的其它流,并将reset置为true。
 

Step 6: deleteStream(删除流) 

删除指定Stream ID的流。服务器不用对这条命令发送响应报文。

 小结

以上简述了rtmp的交互逻辑,具体详细的包字段可查阅官方文档。

RTMP层次 (数据角度)

RTMP层次 (数据发送角度)

 RTMP层次 (数据接收角度)


 

小结

通过上述,我们已经知道了将flv格式数据进行封包成rtmp格式,将数据传输到对端。对端通过解包方式得到flv格式数据。后续我们将讨论flv如何进行传输的。

扩展阅读

RTMP 传输分析-CSDN博客

 学习资料分享

0voice · GitHub

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

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

相关文章

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

Electron-(二)桌面应用的启动动画创建

一、概述 在很多桌面应用中都会有启动画面的显示。启动画面可以解决在启动时耗时较长,将每一步反馈给用户。另外一方面解决启动过程中的环境检查及检查结果的反馈。 在当今的桌面应用领域,启动动画已成为提升用户体验的重要组成部分。它不仅仅是一个简单…

【Linux】main函数的参数列表从何而来?

Linux系统进程通过exec系列函数启动新程序时,argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数,显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中,main函数的标准参数列表通常如下所示: in…

极客wordpress模板

这是一个展示WordPress主题的网页设计。页面顶部有一个导航栏,包含多个选项,如“关于我们”、“产品中心”、“案例展示”、“新闻动态”、“联系我们”和“技术支持”。页面中间部分展示了多个产品,每个产品都有一个图片和简短的描述。页面下…

MySQL【知识改变命运】06

前言:在05这节数据结构里面,我们知道select * from 这个操作很危险,如果数据库很大,会把服务器资源耗尽,接下来提到的查询可以有效的限制返回记录 1:分页查询 分页查询可以有效控制一次查询出来的结果集的…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用cv2.imread函数读取图像文件。图像的形状通过shape属性获取&#xff0c;格式为(高度, 宽度, 颜色通道数)。 import cv2img1 cv2.imread(bg.jpg) img2 cv2.imread(fish.jpg)print(img1…

Linux服务器安装SRAToolkit教程

SRAToolkit是由NCBI&#xff08;美国国家生物技术信息中心&#xff09;提供的一个工具集&#xff0c;用于下载、读取和转换SRA&#xff08;Sequence Read Archive&#xff09;格式的数据文件。这些数据文件包含了大规模的核酸序列数据&#xff0c;对于基因组学研究至关重要。本…

pytorch激活函数介绍

在 PyTorch 中,激活函数(Activation Functions)是神经网络中重要的非线性组件,用于引入非线性,使网络能够学习复杂的函数关系。以下是 PyTorch 中常见的激活函数及其特点: 1. ReLU (Rectified Linear Unit) 函数: torch.nn.ReLU()公式: ReLU(x)=max⁡(0,x)特点: 常用于隐…

python-代码技巧

python-代码技巧 简单tips1、多个列表循环遍历2、使用map对列表中多个文件进行批量操作 仅个人笔记使用&#xff0c;感谢点赞关注 简单tips 1、多个列表循环遍历 dataTypes ["train","test"] dataStations ["1","2","3"…

【C语言】自定义类型:结构体--结构体内存对齐(用于计算结构体的大小)

结构体内存对齐 结构体内存对齐用于计算结构体的大小。 &#xff08;1&#xff09;对齐规则 1&#xff09;&#xff09;结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处。 2&#xff09;&#xff09;其他成员变量要对齐到某个数字&#xff08;对齐数&#…

FFmpeg 4.3 音视频-多路H265监控录放C++开发四 :RGB颜色

一 RGB 的意义&#xff1f; 为什么要从RGB 开始讲起呢&#xff1f; 因为最终传输到显卡显示器的颜色都是RGB 即使能处理YUV的API&#xff0c;本质上也是帮你做了从 YUV 到 RGB的转换。 RGB888 表示 R 占8bit&#xff0c;G 占8bit&#xff0c;B 占8bit&#xff0c;也就是每一…

Gin框架操作指南10:服务器与高级功能

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

手撕布隆过滤器:原理解析与面试心得

前言 说来话长&#xff0c;话来说长。前些天我投了一些日常实习的简历&#xff0c;结果足足等了两个礼拜才收到面试通知&#xff0c;看来如今的行情确实是挺紧张的。当时我是满怀信心去的&#xff0c;心想这次一定要好好拷打面试官一番&#xff0c;结果没想到&#xff0c;自我…

腰背肌筋膜炎有哪些治疗方法

腰背肌筋膜炎主要表现为腰背部的疼痛、酸胀、僵硬、活动受限等症状。在疾病初期&#xff0c;症状可能相对较轻&#xff0c;通过休息、保暖、适当的物理治疗等&#xff0c;往往可以缓解症状&#xff0c;此时病情不算严重。如果患者不重视&#xff0c;继续保持不良的生活习惯&…

微服务架构 --- 使用RabbitMQ进行异步处理

目录 一.什么是RabbitMQ&#xff1f; 二.异步调用处理逻辑&#xff1a; 三.RabbitMQ的基本使用&#xff1a; 1.安装&#xff1a; 2.架构图&#xff1a; 3.RabbitMQ控制台的使用&#xff1a; &#xff08;1&#xff09;Exchanges 交换机&#xff1a; &#xff08;2&#…

什么是不同类型的微服务测试?

大家好&#xff0c;我是锋哥。今天分享关于【什么是不同类型的微服务测试&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是不同类型的微服务测试&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构中的测试可以分为多种类…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统&#xff0c;是一个支持前后端分离设计的 客户端(C/S)项目&#xff0c;该示例项目前端xaml使用UI库 &#xff0c;Material Design Themes UI 来构建用户界面&#xff0c;确保…

【into outfile写文件】

简介 select * from user into outfile C:/Users/ichunqiu/Desktop/PhpStudy2018/PHPTutorial/WWW/1.txt;用法的意思就是把user表中查询到的所有字段都导出到1.txt文件中 我们之前还有学到dumpfile&#xff0c;单是它只能导出一条数据 写入shell 测试注入点 usernameadmin&…

【工具】使用perf抓取火焰图

背景 当程序存在cpu性能问题时&#xff0c;我们需要找到是哪个函数占用较多的CPU&#xff0c;也就是找出热点函数&#xff1b;perf的火焰图就是这个用途 安装 在Linux系统中&#xff0c;perf 是 Linux 内核提供的性能分析工具&#xff0c;它通常包含在内核源代码包中。大多数…