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

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

作者: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 协议基本过程分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/22520.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注