通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

栏目: 编程工具 · 发布时间: 5年前

内容简介:作者:Elias Zhang 声网资深工程师,拥有从Iaas层的基础信息存储服务到paas层的云服务的职业经历,喜欢python语言,习惯使用C#,熟悉基于和结合CDN的业务产品架构,点播、直播、云导播等。喜欢探索问题和研究创新,拥有5项国家发明专利。在直播是最常见的实时音视频场景,而 RTMP 是该场景下最重要的协议之一,是很多初步接触实时音视频的开发者需要了解的。本文会一边利用winshark工具进行抓包,一边从中分析 RTMP 协议的基本原理,帮助大家更容易地理解它。先给出RTMP协议的原文件

作者:Elias Zhang 声网资深工程师,拥有从Iaas层的基础信息存储服务到paas层的云服务的职业经历,喜欢 python 语言,习惯使用C#,熟悉基于和结合CDN的业务产品架构,点播、直播、云导播等。喜欢探索问题和研究创新,拥有5项国家发明专利。

在直播是最常见的实时音视频场景,而 RTMP 是该场景下最重要的协议之一,是很多初步接触实时音视频的开发者需要了解的。本文会一边利用winshark工具进行抓包,一边从中分析 RTMP 协议的基本原理,帮助大家更容易地理解它。

先给出RTMP协议的原文件 www.adobe.com/devnet/rtmp… 需要用到的时候可以参考一下~。

做推流直播接触最多的并且最主要是RTMP协议

  • RTMP协议是应用层协议,是要靠底层可靠的传输层(TCP)
  • 协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建立完成后,RTMP协议也要客户端和服务器通过“握手”来建立基于传输层链接之上的RTMP Connection链接. 播放一个RTMP协议的流媒体需要经过以下几个步骤:握手,建立网络连接,建立网络流,播放。服务器和客户端之间只能建立一个网络连接,但是基于该连接可以创建很多网络流。他们的关系如图所示:
通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程
  • RTMP协议传输时会对数据做自己的格式化,这种格式的消息我们称之为RTMP Message,而实际传输的时候为了更好地实现多路复用、分包和信息的公平性,发送端会把Message划分为带有Message ID的Chunk,每个Chunk可能是一个单独的Message,也可能是Message的一部分,在接受端会根据chunk中包含的data的长度,message id和message的长度把chunk还原成完整的Message,从而实现信息的收发。 协议本身的详细字段和流程就不在这里详细解释了,主要结合看包直观的了解下这个协议的流程,更详细的内容可以查阅前面给出的官方文档。

RTMP步骤:

1. 握手

要建立一个有效的RTMP Connection链接,首先要“握手”:客户端要向服务器发送C0,C1,C2(按序)三个chunk,服务器向客户端发送S0,S1,S2(按序)三个chunk,然后才能进行有效的信息传输。RTMP协议本身并没有规定这6个Message的具体传输顺序,但RTMP协议的实现者需要保证这几点:

  • 客户端要等收到S1之后才能发送C2
  • 客户端要等收到S2之后才能发送其他信息(控制信息和真实音视频等数据)
  • 服务端要等到收到C0之后发送S1
  • 服务端必须等到收到C1之后才能发送S2
  • 服务端必须等到收到C2之后才能发送其他信息(控制信息和真实音视频等数据) 握手开始于客户端发送C0、C1块。服务器收到C0或C1后发送S0和S1。 当客户端收齐S0和S1后,开始发送C2。当服务器收齐C0和C1后,开始发送S2。 当客户端和服务器分别收到S2和C2后,握手完成。
通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

实际上真实发包如下:

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

我们可以看见TCP的三次握手,RTMP基于TCP的可靠传输。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

接下去过滤rtmpt协议,rtmp的握手过程如下,我们发现真实发包是C0+C1一起发;S0,S1,S2一起发。

2. 建立网络连接(NetConnection)

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程
通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

a) 客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

打开connect这个包,一个OSI5层协议模型,最后一个是RTMP协议发送了connect链接消息,查看内容包含推流地址名,但是可以观察到还没有发流名,地址是有app名。

观察一下RTMP的包头

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

StreamID是每个消息的唯一标识,划分成Chunk和还原Chunk为Message的时候都是根据这个ID来辨识是否是同一个消息的Chunk的,这里面为0说明这个消息是初始的0消息。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

Chunk stream ID:message会拆分成多个chunk,同一个Chunk Stream ID必然属于同一个Message。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

message type id(消息的类型id):表示实际发送的数据的类型,如8代表音频数据、9代表视频数据。

Format:指的是chunk type。共有4种不同的格式,其中第一种格式字段为0,可以表示其他三种表示的所有数据,但由于其他三种格式是基于对之前chunk的差量化的表示,因此可以更简洁地表示相同的数据,实际使用的时候还是应该采用尽量少的字节表示相同意义的数据。因为type0是表示不同数据,其他是差量,所以可以想象如果搜不到type0的包说明这个流肯定有问题。可以通过“rtmpt.header.format == 0”过滤。

b) 服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。

c) 服务器发送设置带宽协议消息到客户端。

d) 客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。

e) 服务器发送用户控制消息中的“流开始”(Stream Begin)消息到客户端。

f) 服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。 b~f如图:在_result我们可以看到链接已经建立成功

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

接下去的包我们看到发了releaseStream命令,里面的agora就是流名,所以一个推流地址我们可以抓包connect和releaseStream里面拼接得出。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程
  1. 建立一个网络流(NetStream)
通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

提示:网络流代表了发送多媒体数据的通道。服务器和客户端之间只能建立一个网络连接,且多个网络流可以复用这一个网络连接。

a. 客户端向服务器发送请求创建流(createStream)。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

b. 服务器收到请求后向客户端发送_result(),对创建流的消息进行响应。此时NetStream创建完成。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

4. PLAY 播放

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

a) 客户端发送命令消息中的“播放”(play)命令到服务器。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

b) 接收到播放命令后,服务器发送设置块大小(ChunkSize)协议消息。

c) 服务器发送用户控制消息中的“streambegin”,告知客户端流ID。

d) 播放命令成功的话,服务器发送命令消息中的“响应状态” NetStream.Play.Start & NetStream.Play.reset,告知客户端“播放”命令执行成功。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

e) 在此之后服务器发送客户端要播放的音频和视频数据。

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

可以注意到里面音频type是8,视频是9。

5. PUBLISH 推流

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

推流从握手开始和前面步骤123一致。

和第四步play区别在于netstream的命令改为publish

通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程
通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

关于本文,如果你在跟随步骤操作或阅读时有任何疑问,请点击这里跳转至原文与作者直接交流。


以上所述就是小编给大家介绍的《通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

SQL基础教程

SQL基础教程

MICK / 孙淼、罗勇 / 人民邮电出版社 / 2013-8-1 / CNY 69.00

本书介绍了关系数据库以及用来操作关系数据库的SQL语言的使用方法,提供了大量的示例程序和详实的操作步骤说明,读者可以亲自动手解决具体问题,循序渐进地掌握SQL的基础知识和技巧,切实提高自身的编程能力。在每章结尾备有习题,用来检验读者对该章内容的理解程度。另外本书还将重要知识点总结为“法则”,方便大家随时查阅。 本书适合完全没有或者具备较少编程和系统开发经验的初学者,也可以作为大中专院校的教材......一起来看看 《SQL基础教程》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码