05-流媒体-RTMP协议介绍
1.RTMP概述
RTMP是一种常见的流媒体协议,是基于TCP/IP协议模型的应用层协议,工作在TCP协议上,端口是1935。通过TCP三次握手保证传输的可靠。
2.握手
2.1 握手过程
RTMP基于传输层TCP连接后,通过RTMP握手协议来完成RTMP连接。客户端和服务端各发送相同的三个块,客户端发送C0、C1、C2,服务端发送S0、S1、S2。
 只需要满足如下条件即可:
握手以客户端发送 C0 和 C1 块开始
 客户端必须等待接收到 S1 才能发送 C2
 客户端必须等待接收到 S2 才能发送任何其他数据
 服务器必须等待接收到 C0 才能发送S0和S1,也可能是接收到 C1 后发送
 服务器必须等待接收到 C1 才能发送S2
 服务器必须等待接收到 C2 才能发送其他数据
抓取一个RTMP的包,如下图所示,我们一点点分析
 
 实际实现中为了在保证握手的身份验证功能的基础上尽量减少通信的次数,一般的发送顺序如下:
 客户端向服务端同时发送C0+C1
 服务端确认版本号后,向客户端同时发送S0+S1+S2
 客户端接收到S2后发送C2到服务端
Client                   Server
   |                       |
   |        C0, C1         |
   |---------------------->|
   |                       |
   |       S0,S1,S2        |
   |<----------------------|
   |                       |
   |          C2           |
   |---------------------->|
 
2.2 握手协议格式解析
(1)C0/S0格式:C0和S0都是1个字节,表示版本号,C0包中表示客户端请求的RTMP版本,在S0中表示服务器选择的RTMP版本,规范最新定义为3,如果服务器和客户端版本号不一致,则可能会终止交互或者降级。
 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|  version      |
+-+-+-+-+-+-+-+-+
 
(2)C1/S1格式
 长度为1536字节
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
|                     time(4 bytes)                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     zero(4 bytes)                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     random bytes                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     random bytes                              |
|                     (cont)                                    |
|                     ......                                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
 
time:时间戳,用于时间同步
 zero:写0
 random:1528个字节,用户区分出其响应C2/



















