从流程上对rtmp协议经行总结

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

一、握手:

1、C0:C—>S

2、S0: S—>C

        名称:C0 S0

        长度:1字节

        对于版本号的定义:当前rtmp协议的版本号一致为“3”,0、1、2是旧版本号,已经弃用。4-31被保留为rtmp协议的未来实现版本使用;32-255不允许使用。如果服务器端或者客户端收到的C0字段解析出为非03,如果是0x06考虑使用openssl进行解密C1 C2 S1 S2,如果对端不支持加密字段可以选择以版本3来响应,也可以放弃握手。

 

        简单握手:

        作用:C0和S0一致,都是一个字节,都代表当前使用的rtmp协议的版本号。如果服务器端或者客户端收到的C0/S0字段解析出为非03,对端可以选择以版本3来响应,也可以放弃握手。

 

        复杂握手:

        作用:说明是明文还是密文。如果使用的是明文(0X03),同时代表当前使用的rtmp协议的版本号。如果是密文,该位为0x06

 

3、C1: C—>S

4、S1: S—>C

        名称:C1 & S1

        长度:1536字节

        简单握手:

        作用:

        包结构:

          

        time(4字节)+zero(4字节)+ random data(1528字节)

        Time(4字节):这个字段包含一个timestamp,用于本终端发送的所有后续块的时间起点。这个值可以是0,或者一些任意值。要同步多个块流,终端可以发送其他块流当前的timestamp的值,以此让当前流跟要同步的流保持时间上的同步。

        Zero (4个字节):这个字段必须都是0。如果不是0,代表要使用complex handshack。

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

 

        复杂握手:

        作用:用于验证服务器端或者client端的有效性。

        包结构:


        time(4字节)+version(4字节)+key(764字节)+digest(764字节)总共1536字节

        其中,key和digest可能会交换位置,也就如下图有两种格式:schemal0&schemal1。

        客户端决定使用哪种schema方式,服务器端比较倒霉,需要将两种方式都尝试,一般是先按照schema0解析,失败则使用schema1解析。但是无论key和digest位置如何,它们的结构是不变的。

        Time(4字节):这个字段包含一个timestamp,用于本终端发送的所有后续块的时间起点。这个值可以是0,或者一些任意值。要同步多个块流,终端可以发送其他块流当前的timestamp的值,以此让当前流跟要同步的流保持时间上的同步。

        Version(4个字节):4bytes 为程序版本。C1一般是0x80000702。S1是0x04050001。貌似这个可以随意填写,但是要采用非0值跟simple handshack区分。

        Key(764个字节):

        random-data:长度由这个字段的最后4个byte决定,即761-764

        key-data:128个字节。Key字段对应C1和S1有不同的算法,这个需要注意。后面会详细解释。发送端(C1)中的Key应该是随机的,接收端(S1)的key需要按照发送端的key去计算然后返回给发送端。

        random-data:(764-offset-128-4)个字节

        key_offset:4字节, 最后4字节定义了key的offset(相对于KeyBlock开头而言,相当于第一个random_data的长度)

        Digest(764个字节):

        offset:4字节, 开头4字节定义了digest的offset(相对于DigestBlock的第5字节而言,offset=3表示digestBlock[7~38]为digest,【4-6】即为第一个random_data)

        random-data:长度由这个字段起始的4个byte决定

        digest-data:32个字节。Digest字段对应C1和S1有不同的算法,这个需要注意。后面会详细解释。

        random-data:(764-4-offset-32)个字节


        算法:

        C1的key为128bytes随机数。C1_32bytes_digest= HMACsha256(P1+P2, 1504, FPKey, 30) ,其中P1为digest之前的部分,P2为digest之后的部分,P1+P2是将这两部分拷贝到新的数组,共1536-32长度。S1的key根据 C1的key算出来。

        S1的digest算法同C1。注意,必须先计算S1的key,因为key变化后digest也重新计算

 

5、C2:    c—>s

6、S2:    s—>c

        名称:C2 & S2

        长度:1536字节

        简单握手:

        作用:基本是C1&S1的副本

        包结构:

          

        time(4字节)+ Time2(4字节)+randomecho(1528字节)

        Time(4个字节):这个字段必须包含终端在S1 (给 C2) 或者 C1 (给 S2) 发的 timestamp。

        Time2 (4个字节):这个字段必须包含终端先前发出数据包 (s1 或者 c1) timestamp。

        Randomecho (1528个字节):这个字段必须包含终端发的 S1 (给 C2) 或者 S2 (给 C1) 的随机数。两端都可以一起使用 time 和 time2 字段再加当前 timestamp 以快速估算带宽和/或者连接延迟,但这不太可能是有多大用处。

 

 

        复杂握手:

        作用:主要是用来提供对C1 S1的验证

        包结构:

Rtmp协议复杂握手(handshake)详解 Rtmp协议复杂握手(handshake)详解 一、复杂握手流程图 二、过程详解 先从Wireshark抓包中直观的认识握手到底长什么样子吧 1、Client->Server:C0+C1 格式: C0:一个字节0x03, C1:timestamp(4bytes)+ Version(4bytes)+ (复杂二进制串)1526bytes timestamp(4bytes)... 阅读详情

相关推荐

rtmp协议分析(三次握手)

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格式(简单握手)

万事亨通 1662

流程上对rtmp协议经行总结(V1.1)

更新了中间出现的错误。特别是字段大小上的不明确。并且将重点画出来了。文档中有rtmp协议相关的抓包

手撕Rtmp协议细节(10)——audio

​前面我们历经千难万险和重重障碍,接下来,我们音视频通信的二位主角终于要粉墨登场了,那就是音频君和视频君,这一篇我们来一睹音频君的风采。老样子,抓包文件先摆上来: 说明: rtmp协议wireshark中过滤音频数据包的条件为: rtmpt.header.typeid == 0x08 通过抓包文件,我们看到音频数据也是按照RTMP Header + Rtmp Body的组织结构来进行封装的。Header部分之前的文章解析过,我们主要来看Body部分。因为rtmp是Adobe公司开发的协...

1226

RTMP协议– AMF消息详解

一、简述: 本教程是基于VLC实现的Rtmp服务器与客户端的播放流程 AMF 命令-命令消息类型 发送端发送时会带有: 命令的名字,如 connect Transaction ID 表示此次命令的标识 Command Object 表示相关参数 接受端收到命令后,会返回以下三种消息中的一种: _result 消息表示接受该命令,对端可以继续往下执行流程 _error 消息代表拒绝该...

qq_28309121的博客 2894

流程上对rtmp协议经行总结_can not support cmd onbwdone

(相对于DigestBlock的第5字节而言,offset=3表示digestBlock[7~38]为digest,【4-6】即为第一个random_data)random-data:长度由这个字段起始的4个byte决定。

2501_90433549的博客 852

RTMP协议推流交互流程

RTMP协议推流交互流程 文章目录RTMP协议推流交互流程RTMP协议推流流程RTMP握手RTMP建立连接RTMP建流&PlayWireshark抓个RTMP流 想了解下直播常见协议RTMP,可是看着网文,头疼,这里记录下RTMP协议推流播放的交互流程,细节可以再看规范,感觉会舒服一些。 RTMP(Real Time Messaging Protocol 实时消息传输协议RTMP是由...

靑い空゛ 2299

RTMPRTMP协议的详细介绍

本文参考RTMP官方文档,详细介绍了rtmp协议

m0_54984588的博客 2186

RTMP协议详解

RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。 RTMP协议是应用层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建立完成后,RTMP协议也要客户端和服务器通过“握手”来建立基于传输层链接之上的RTMP Connection链接。 ...

wangbuji的博客 1万+

RTMP使用笔记(一):解析使用wireshark抓取的RTMP协议

Adobe的实时消息传递协议RTMP)通过可靠的流传输提供双向消息多路复用服务,例如TCP [RFC0793],用于在一对通信对等体之间携带具有相关定时信息的视频,音频和数据消息的并行流。 实现通常为不同类别的消息分配不同的优先级,这可以影响在传输容量受限时消息被排队到基础流传输的顺序。

zhuyunier的博客 1万+

RTMP协议详解及实例分析

1、简介 RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。实现通常对不同类型的消息分配不同的优先级,当运载能力有限时,这会影响等待流传输的消息的次序。 RTMP协议是应用层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建立完成后,RTMP...

king_weng的博客 5161

RTMP协议

RTMP协议

good good study, day day up! 1658

RTMP协议分析

RTMP协议是应⽤层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建⽴完成后,RTMP协议也要客户端和服务器通过“握⼿”来建⽴基于传输层链接之上的RTMP Connection链接,在Connection链接上会传输⼀些控制信息,如SetChunkSize,SetACKWindowSize。其中CreateStream命令会创建⼀个Stream链接,⽤于传输具体的⾳视频数据和控制这些信息传输的命令信息。

weixin_50873490的博客 1595

RTMP协议命令的流程详解

一, RMTP推流的命令的 1, handshake 客户端与服务器的RTMP握手的的流程 ①, 客户端发送 C0+C1 规则是 消息头一共是9个字节分别是: cid 标志是什么命令(一个字节) 时间戳timestamp(四个字节) 扩展字节(四个字节) 一个字节标志是什么游戏 0X03 表示发送C0+C1 四个字节时间戳 ::time(NULL) 四个字节的 0X00 后面在加1537个字节的随机数 代码 // [1+1536] char* c0c1; // [1+1

永远积极向上、永远热泪盈眶、永远豪情满怀、永远坦坦荡荡 1673

五、RTMP协议 RTMP播放基本流程

主要是将简单握手中1528Bytes随机数的部分平均分成两部分,一部分764Bytes存储public key(公共密钥),另一部分764Bytes存储digest(密文,32字节)。通过TCP三次握手,可实现RTMP客户端与RTMP服务器的指定端口(默认端口为1935)建立一个可靠的网络连接。Adobe协议中描述的是简单握手,但Adobe提供的Flash Media Server采用的却是复杂握手。与其叫RTMP握手,其实实质上起到的是验证的作用。相对于简单握手,复杂握手主要是增加了更严格的验证。

irainsa的博客 971

Rtmp协议看一篇就够了

1 rtmp chunk struct: 2 chunk msg header2.1basic header,chunk msg header 关系和chunk msg header struct basic header和chunk msg header都是变长的. basic header根据chunk stream id的大小,可以是1 bytes,2 bytes or 3 bytes。如何区分参见:https://blog.csdn.net/xwjazjx1314/article/det...

fdsafwagdagadg6576的专栏 2026
上一篇: 《定位》书摘
下一篇: rtmpdump源码分析
simon-扬
博客等级 码龄19年 214粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值