1.RTMP
1.1 简介
RTMP 是 Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。
RTMP 协议是应用层协议,是要靠底层可靠的传输层协议(通常是 TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建立完成后,RTMP 协议也要客户端和服务器通过“RTMP 握手”来建立基于传输层链接之上的 RTMP Connection 链接,在 Connection 链接上会传输一些控制信息。
RTMP 协议传输时会对数据(直播流,推本地视频文件)做自己的格式(Message/Chunk),这种格式的消息我们称之为 RTMP Message,而实际传输的时候为了更好地实现多路复用、分包和信息的公平性,发送端会把 Message 划分为带有 Message ID 的 Chunk,每个 Chunk 可能是一个单独的 Message,也可能是 Message 的一部分,在接受端会根据 chunk 中包含的 data 的长度,message id 和 message 的长度把 chunk 还原成完整的 Message,从而实现信息的收发。
1.2 Message
这里的 Message 是指满足该协议格式的、可以切分成 Chunk 发送的消息,消息包含的字段如下:
- Timestamp(时间戳):消息的时间戳,4 个字节
- Length(长度):是指 Message Payload(消息负载)即音视频等信息的数据的长度,3 个字节
- TypeId(类型 Id):消息的类型 Id,1 个字节
- Message Stream ID(消息的流 ID):每个消息的唯一标识,划分成 Chunk 和还原 Chunk 为 Message 的时候都是根据这个 ID 来辨识是否是同一个消息的 Chunk 的,4 个字节,并且以小端格式(little-endian)存储
1.3 Chunk
Chunk的格式由 Basic Header(基本的头部信息)包含了 chunk stream ID(流通道 Id)和 chunk type(chunk 的类型)构成
1.4 运行过程
RTMP 协议规定,播放一个流媒体有两个前提步骤:第一步,建立一个网络连接(NetConnection);第二步,建立一个网络流(NetStream)。其中,网络连接代表服务器端应用程序和客户端之间基础的连通关系。网络流代表了发送多媒体数据的通道。服务器和客户端之间只能建立一个网络连接,但是基于该连接可以创建很多网络流。
他们的关系如下图所示:
1)握手(HandShake)
一个 RTMP 连接以握手开始,双方分别发送大小固定的三个数据块
- 握手开始于客户端发送 C0、C1 块。服务器收到 C0 或 C1 后发送 S0 和 S1。
- 当客户端收齐 S0 和 S1 后,开始发送 C2。当服务器收齐 C0 和 C1 后,开始发送 S2。
- 当客户端和服务器分别收到 S2 和 C2 后,握手完成。
2) 建立网络连接(NetConnection)
- 客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接。
- 服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。
- 服务器发送设置带宽()协议消息到客户端。
- 客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。
- 服务器发送用户控制消息中的“流开始”(Stream Begin)消息到客户端。
- 服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。
3)建立网络流(NetStream)
1.客户端发送命令消息中的“创建流”(createStream)命令到服务器端。
2.服务器端接收到“创建流”命令后,发送命令消息中的“结果”(_result),通知客户端流的状态。
4)播放(Play)
1.客户端发送命令消息中的“播放”(play)命令到服务器。
2.接收到播放命令后,服务器发送设置块大小(ChunkSize)协议消息。
3.服务器发送用户控制消息中的“streambegin”,告知客户端流 ID。
4.播放命令成功的话,服务器发送命令消息中的“响应状态” NetStream.Play.Start &
NetStream.Play.reset,告知客户端“播放”命令执行成功。
5.在此之后服务器发送客户端要播放的音频和视频数据。