RTMP协议的基本过程

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

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

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

  • RTMP协议是应用层协议,是要靠底层可靠的传输层(TCP)
  • 协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建立完成后,RTMP协议也要客户端和服务器通过“握手”来建立基于传输层链接之上的RTMP Connection链接. 播放一个RTMP协议的流媒体需要经过以下几个步骤:握手,建立网络连接,建立网络流,播放。服务器和客户端之间只能建立一个网络连接,但是基于该连接可以创建很多网络流。他们的关系如图所示:

RTMP协议的基本过程_第1张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第2张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第3张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第4张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第5张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第6张图片

  • 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后,握手完成。

RTMP协议的基本过程_第7张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第8张图片

实际上真实发包如下:

RTMP协议的基本过程_第9张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第10张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第11张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第12张图片

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

RTMP协议的基本过程_第13张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第14张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第15张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第16张图片

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

2. 建立网络连接(NetConnection)

555.pnguploading.4e448015.gif转存失败重新上传取消555.pnguploading.4e448015.gif正在上传…重新上传取消555.pnguploading.4e448015.gif正在上传…重新上传取消555.pnguploading.4e448015.gif正在上传…重新上传取消555.pnguploading.4e448015.gif转存失败重新上传取消

RTMP协议的基本过程_第17张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第18张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第19张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第20张图片

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

RTMP协议的基本过程_第21张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第22张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第23张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第24张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第25张图片

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

观察一下RTMP的包头

RTMP协议的基本过程_第26张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第27张图片

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

RTMP协议的基本过程_第28张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第29张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第30张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第31张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第32张图片

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

RTMP协议的基本过程_第33张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第34张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第35张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第36张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第37张图片

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我们可以看到链接已经建立成功

RTMP协议的基本过程_第38张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第39张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第40张图片

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

RTMP协议的基本过程_第41张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第42张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第43张图片

  1. 建立一个网络流(NetStream)

RTMP协议的基本过程_第44张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第45张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第46张图片

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

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

RTMP协议的基本过程_第47张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第48张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第49张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第50张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第51张图片

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

RTMP协议的基本过程_第52张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第53张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第54张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第55张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第56张图片

4. PLAY 播放

RTMP协议的基本过程_第57张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第58张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第59张图片

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

RTMP协议的基本过程_第60张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第61张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第62张图片

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

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

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

RTMP协议的基本过程_第63张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第64张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第65张图片

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

RTMP协议的基本过程_第66张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第67张图片uploading.4e448015.gif正在上传…重新上传取消RTMP协议的基本过程_第68张图片

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

5. PUBLISH 推流

RTMP协议的基本过程_第69张图片

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

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

RTMP协议的基本过程_第70张图片uploading.4e448015.gif转存失败重新上传取消RTMP协议的基本过程_第71张图片

你可能感兴趣的:(librtmp)