RTMP协议详解及Wiresahrk抓包分析(二)https://developer.aliyun.com/article/1472345
四、RTMP 流媒体播放过程
1、简介
下面分析打开一个 RTMP 流媒体到视音频数据开始播放的全过程。
RTMP 协议规定, 播放一个流媒体有两个前提步骤:
- 第一步, 建立一个网络连接( NetConnection);
- 第二步, 建立一个网络流( NetStream)。
其中,网络连接代表服务器端应用程序和客户端之间基础的连通关系。网络流代表了发送多媒体数据的通道。服务器和客户端之间只能建立一个网络连接,但是基于该连接可以创建很多网络流。他们的关系如图所示:
播放一个 RTMP 协议的流媒体需要经过以下几个步骤:握手,建立连接,建立流,播放。RTMP 连接都是以握手作为开始的。建立连接阶段用于建立客户端与服务器之间的“ 网络连接” ;建立流阶段用于建立客户端与服务器之间的“ 网络流”;播放阶段用于传输视音频数据。
我们分析上面 wireshark 抓到的报文。
2、握手(HandShake)
rtmp 连接从握手开始。它包含三个固定大小的块。客户端发送的三个块命名为 C0,C1,C2;服务端发送的三个块命名为 S0,S1,S2。
握手序列如下:
- 握手开始于客户端发送 C0、 C1 块。 服务器收到 C0 或 C1 后发送 S0 和 S1。
- 当客户端收齐 S0 和 S1 后, 开始发送 C2。 当服务器收齐 C0 和 C1 后, 开始发送 S2。
- 当客户端和服务器分别收到 S2 和 C2 后, 握手完成。
握手示意图如下图所示:
结合上面理论对比我们抓到的报文:
①、客户端向服务器发送握手 C0+C1
②、服务器向客户端回应握手 S0+S1+S2
③、客户端向服务器发送握手 C2
抓包总结:
- 第一步:客户端发送 C0+C1
- 第二步:服务端发送 S0+S1+S2
- 第三步:客户端发送 C2
疑问: C2 和 S2, 到底哪个先发送? ? ? 【协议没有具体规定】
3、建立网络连接(NetConnection)
包括以下步骤:
- ①、客户端发起连接请求
- ②、服务器设置客户端的应答窗口大小
- ③、服务器设置客户端的发送带宽大小
- ④、服务器设置客户端的接收块大小
- ⑤、服务器响应连接结果
- ⑥、客户端设置服务器的接收块大小
①、客户端发起连接请求
客户端发送命令消息中的“连接” (connect)到服务器, 请求与一个服务应用实例建立连接。
②、服务器设置客户端的应答窗口大小、发送带宽大小、接收块大小
服务器接收到连接命令消息后,发送确认窗口大小、发送带宽大小、接收块大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。
③、服务器响应创建流结果
服务器发送命令消息中的 “结果” (_result), 通知客户端连接的状态
④、客户端设置服务器的接收块大小
客户端发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。
4、建立网络流(NetStream)
包括以下步骤:
- 客户端发送命令消息中的“创建流” (createStream) 命令到服务器端。
- 服务器端接收到“创建流” 命令后, 发送命令消息中的“结果” (_result), 通知客户端流的状态
- 客户端向服务器获取指定流的长度
①、客户端发起创建流请求
②、服务器响应创建流结果
③、客户端向服务器获取指定流的长度
5、播放(Play)
- 客户端发送命令消息中的“播放” (play) 命令到服务器。
- 服务器发送用户控制消息中的 “stream begin” ,告知客户端流 ID
- 服务器发送客户端要播放的音频和视频数据
①、客户端发送播放请求
②、服务器发送 stream begin
③、服务器发送音视频数据给客户端