rtmp协议分析(三次握手)

RTMP详细分析(Message 消息,Chunk分块)
librtmp分析(发送数据包处理)
librtmp分析(接收数据包处理)

RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应
用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。随
着VR技术的发展,视频直播等领域逐渐活跃起来,RTMP作为业内广泛使用的协议也重新被相关开发者重
视起来。

目录

    • 1、介绍:
    • 2.1、握手:
    • 2.2、握手过程:
    • 3.1 、C0和S0格式(简单握手):
    • 3.2 、C1和S1格式(简单握手):
    • 3.3 、C2和S2格式(简单握手):
    • 4、复杂握手:

1、介绍:

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,从而实现信息的收发。

2.1、握手:

一个 RTMP 连接以握手开始。RTMP 的握手不同于其他协议˗ RTMP 握手由三个固定
长度的块组成,而不是像其他协议一样的带有报头的可变长度的块。
客户端 (发起连接请求的终端) 和服务器端各自发送相同的三块。
客户端发送的这些块称为C0、 C1 和 C2,服务器端发送的这些块称为 S0、
S1 和 S2。

2.2、握手过程:

本身并没有规定这6个Message的具体传输顺序,但RTMP协议的实现者需要保证这几点:
客户端要等收到S1之后才能发送C2
客户端要等收到S2之后才能发送其他信息(控制信息和真实音视频等数据)
服务端要等到收到C0之后发送S1
服务端必须等到收到C1之后才能发送S2
服务端必须等到收到C2之后才能发送其他信息(控制信息和真实音视频等数据)

理论上来讲只要满足以上条件,如何安排6个Message的顺序都是可以的,但实际实现中为了在保证握手
的身份验证功能的基础上尽量减少通信的次数,一般的发送顺序是这样的,这一点可以通过wireshark抓推流包进行验证:
在这里插入图片描述
在这里插入图片描述
握手流程图:在这里插入图片描述
Uninitialized (未初始化):协议的版本号在这个阶段被发送。客户端和服务器都是。
uninitialized (未初始化)状态。之后客户端在数据包 C0 中将协议版本号发出。如果服务器
支持这个版本,它将在回应中发送S0 和 S1。如果不支持,服务器会才去适当的行为进
行响应。在 RTMP 协议中,这个行为就是终止连接。
Version Sent (版本已发送):在未初始化状态之后,客户端和服务器都进入 Version Sent
(版本已发送) 状态。客户端会等待接收数据包 S1 而服务器在等待 C1。一旦拿到期待的包,
客户端会发送数据包 C2 而服务器发送数据包 S2。 (客户端和服务器各自的)状态随即变为
Ack Sent (确认已发送 )。
Ack Sent (确认已发送):客户端和服务器分别等待 S2 和 C2。
Handshake Done (握手结束):客户端和服务器可以开始交换消息了。

3.1 、C0和S0格式(简单握手):

C0 和 S0 包都是一个单一的八位字节,以一个单独的八位整型域进行处理:
在这里插入图片描述
版本( 八位):在 C0 中,这一字段指示出客户端要求的 RTMP 版本号。
在 S0 中,这一字段指示出服务器端选择的 RTMP 版本号。版本号基本都是3。
0、1、2 这三个值是由早期其他产品使用的,是废弃值。
4 - 31 被保留为RTMP 协议的未来实现版本使用。
32 - 255 不允许使用 (以区分开 RTMP 和其他常以一个可打印字符开始的文本协议)。
无法识别客户端所请求版本号的服务器应该以版本 3 响应, (收到响应的) 客户端可以选择降低到版本 3,或者放弃握手。

3.2 、C1和S1格式(简单握手):

C1 和 S1 数据包的长度都是 1536 字节,分布如下:
在这里插入图片描述
Time (四个字节):这个字段包含一个 timestamp,用于本终端发送的所有后续块的时间
起点。这个值可以是 0。

Zero (四个字节):这个字段必须都是 0。
Random data (1528 个字节):这个字段可以包含任意值。终端需要区分出响应来自它发
起的握手还是对端发起的握手,这个数据应该发送一些足够随机的数。这个不需要对随机数进行加密保护,也不需要动态值。

3.3 、C2和S2格式(简单握手):

C2 和 S2 数据包长度都是 1536 个节,基本就是 S1 和 C1 的副本。分布如下:
在这里插入图片描述
Time (四个字节):这个字段必须包含终端在 S1 (给 C2) 或者 C1 (给 S2) 发的
timestamp。
Time2 (四个个节):这个字段必须包含终端先前发出数据包 (s1 或者 c1) timestamp。
Random echo (1528 个字节):这个字段必须包含终端发的 S1 (给 C2) 或者 S2 (给 C1)
的随机数。
在这里插入图片描述

4、复杂握手:

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

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

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

相关文章

OpenAPI系列: 六、OpenAPI策略分析

一、如何注册 为什么要注册?访问 OpenAPI必须拥有Consumer Key和Consumer Secret。 如何注册?要获取Consumer Key及Consumer Secret,需要消费方(Consumer)向服务提供方申请注册,服务提供方审核通过后会向消…

压缩、解压 解决 客户端查询大批量数据时等待时间过长的问题

在项目中查询时,因数据量大,导致网络传输很慢,这就需要在服务器端查询出的数据进行压缩处理,后传输完了在客户端进行解压处理(此为在Silverlight中压缩与解压); 具体方法如下: using…

C---已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。

已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。 思路:由题意可知,n为两个质数之积,也就是说只要找到一个数能够被n整除,这个数一定是质数!!!2为最小的质数,…

isnumeric_Python字符串| isnumeric()方法与示例

isnumericisnumeric() is an in-built method in Python, which is used to check whether a string contains only numeric values or not. isnumeric()是Python中的内置方法,用于检查字符串是否仅包含数字值。 Numeric contain all decimal characters and the f…

合并文件夹中子目录_01 Linux之统计文件夹中文件个数以及目录个数

案例分析:今天遇到了一个需要统计路径下目录个数的问题如果一个一个的去数会很麻烦,找到了一篇文章刚好提到这个,于是我将方法整理了一下。该方法的链接:Linux统计文件夹中文件个数以及目录个数_SG匚hang的博客-CSDN博客_linux统计…

关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题

目录makefile写法1. 简介2. 上路之前3. 一个简单的例子4.说明:4.1、autoscan4.2、 configure.scan4.3、aclocal4.4、autoconf4.5、Makefile.am4.6、 automake4.7、Makefilemakefile写法 在 Unix 上写程式的人大概都碰过 Makefile,尤其是用 C 来开发程式…

修改主键的SQL

declare defname varchar(100)declare cmd varchar(500)declare tablename varchar(100)declare keyname varchar(100) Set tablenameTemp1Set keynameid --需要設置的key,分隔 select defname name FROM sysobjects so JOIN sysconstraints sc ON so.id sc.constid …

西安理工大学863(转载)

原创:https://blog.csdn.net/mzj15101229871/article/details/107613162 (博主总结的很完整,很厉害,本人为了查看方便,才转载的。本人只是个小白~) 第一章 绪论 考试大纲 1)了解数据元素、数…

原理简介_消息通信的利器MQTT协议简介及协议原理

- 没用过但是必须得知道系列 -前言:相比于 XMPP, MQTT 的简单轻量受到了不少工程师的喜爱,从物联网到传统的消息服务,简单可依赖的 MQTT 到底为何让人如此着迷呢?MQTT 协议-MQTT 协议简介及协议原理MQTT(Me…

stl vector 函数_vector :: pop_back()函数以及C ++ STL中的示例

stl vector 函数C vector :: pop_back()函数 (C vector::pop_back() function) vector::pop_back() is a library function of "vector" header, it is used to deletes an element from the end of the vector, it deletes the element from the back and returns …

rtmp协议分析(Message 消息,Chunk分块)

RTMP详细分析(三次握手) librtmp分析(发送数据包处理) librtmp分析(接收数据包处理) 目录1、Message(消息)2、Chunking(Message 分块)2.1、 Basic Header(基本的头信息)2.1.1、Basic Header为1个字节时2.1.…

【文摘】 雪念——作者:蓝色妖姬

引用原文地址:点我 我本是惆怅之人,拥有不了所谓的快乐,笔尖谱写不出唯美的风花雪月,只是流露这淡淡的疼痛,淡淡的哀伤。——蓝色妖姬。 喜欢雪,喜欢伫立在雪地里,凝视着片片雪花从眼前飘落。 心…

将Sharepoint Server 2010部署到WINDOWS 7

首先祝CNBLOGS上的筒子们新年快乐。Sharepoint 2010 BETA版发布已经有段时间了,总是感觉MS的步伐要比我们这些追逐他的人快很多,不过确实他的每一次革新总给我们带来了惊喜。 前几天报名参加了SHAREPOINT 2010 DAY 活动(详情),等待着1月16日体…

嵌入式实训-day1

完全复制一个文件的内容到另外一个文件 思路解析: 首先我这里使用了三个.c文件,分别是:yanyu.c、yanyu_old.c、yanyu_now.c 其中yanyu.c负责将yanyu_old.c中的内容读入到buff缓冲区中,然后再从buff缓冲区中将数据写入到yanyu_no…

stl中copy()函数_std :: rotate_copy()函数以及C ++ STL中的示例

stl中copy()函数C STL std :: rotate_copy()函数 (C STL std::rotate_copy() function) rotate_copy() function is a library function of algorithm header, it is used to rotate left the elements of a sequence within a given range and copy the rotating elements to…

计量经济学建模_浅谈统计学模型(兼计量经济学模型)

计量经济学模型是从统计学模型中衍生出来的,故将它们一并放在此处进行说明。实际上,很多人在很久之前就督促我写一篇统计学和计量经济学模型的文章,但我太懒惰,一直拖到现在,也是十分汗颜。先讲一些统计学上的基础故事…

linux文件存储、inode、硬链接、软链接

目录介绍inode的内容inode的大小inode号码目录文件硬链接软链接介绍 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会…

OSPF路由器建立全毗邻关系的状态转换过程

1)Down状态:路由器不与其他任何路由器交换任何OSPF消息;2)Init状态:接收方路由器已经接收到对端路由器的hello包,但是没有从对端路由器的hello包中发现自己的router-id.。此时通信是单向的;3&am…

JavaScript打包与解包工具

JavaScript Packer: http://packer.skiyo.cn/ JavaScript UnPacker: http://packer.skiyo.cn/unpacker.html 转载于:https://www.cnblogs.com/springmvc-hibernate/archive/2010/09/17/2484233.html

工具栏的打印图标不见了_显示屏下方的工具栏里的小图标不见了怎么弄回来

优质回答 回答者:昂天大笑出门去一般右下角那些小图标都是与系统同步启动的一些功能,有的是没必要让它们同步启动的,启动的东西越多,系统反应就越慢。你说的工具栏里的小图标没了,可能是那些工具不能和系统同步启动了&…