RTMP,Real Time Messaging Protocol,使用TCP,默认在1935端口上传输一般的FLV格式流。
优点:
- 支持加密
- 隐私性好
- 实时性好
- 延迟相对较低
缺点:
- 使用非公共端口,可能被防火墙拦截;
- 跨平台差
常用应用领域:
- 娱乐直播
- 点播
应用会比HLS更为广泛,主要还是因为传输效率较高、基建比较成熟。
发展方向:使用UDP逐渐替代TCP方案,把传输做薄。
RTMP是在TCP建立连接的基础之上传输,即底层使用使用TCP的。经过RTMP握手后,建立RTMP Connetction,然后stream传输。
创建流的基本流程:
- 通过socket建立TCP连接;
- RTMP握手;
- 建立RTMP连接;
- 创建RTMP流。
握手过程:
建立连接的过程:
创建流的过程:
推流过程:
拉流过程:
消息格式
当连接建立好后,就可以发送消息了,RTMP消息有固定的格式,如上图,这是RTMP协议中最复杂的部分。
如一般网络协议,整个RTMP的消息由Header和Body组成。
Header分为三个部分:
- Basic Header,必有
- Message Header,可选
- Extended Timestamp,可选
后两者是否存在是根据Basic Header的值决定的。
Basic Header的大小也是动态变化的,其大小由第一个字节决定。Basic Header第一个字节组成:
- 前2位:fmt。
- 后6位:取值为0、1、2~63。约束当前或后续字节是否为chunk string id(CSID)。
- 0,则表示整个Basic Header占2个字节,即使用第2个字节表达CSID。
- 1,则表示整个Basic Header占4个字节,即使用后续3个字节表达CSID。
- 2~63,则表示整个Basic Header占1个字节,即fmt后面的6位是CSID。自己使用的话基本够用。
Message Header是可选的,也是动态大小的。这两者都是由Basic Header的fmt决定的,fmt是2位,可表示以下状态:
- 00,Message Header最长,占11字节,即包含:TimeStamp(3) + MegLength(3) + TypeID(1) + StreamID(4)。
- 01,Message Header占7字节,即包含:TimeStamp(3) + MegLength(3) + TypeID(1)。
- 10,Message Header占3字节,即包含:TimeStamp(3)。
- 11,没有Message Header。
之所以是可变的,是因为同一个流、同一个包分为多个消息/chunk/块传输,有很多信息只需要传一次就可以,后续客户端收到的信息复用前面的信息即可。
当用Message Header还表达信息的时候,就需要Extended Timestamp。当Message Header中的TimeStamp值为0xFFFFFF时,就存在Extended Timestamp。
消息类型/TypeID
TypeID | 作用 | SID | CSID | 分类 |
---|---|---|---|---|
1 | Set Chunk Size | 0 | 2 | 控制消息 |
2 | Abort Message | 0 | 2 | 控制消息 |
3 | Acknowledgement | 0 | 2 | 控制消息 |
5 | Window Acknowlegement Size | 0 | 2 | 控制消息 |
6 | Set Peer Bandwidth | 0 | 2 | 控制消息 |
8 | 音频数据 | |||
9 | 视频数据 | |||
15(AMF3),18(AFM0) | Data Message | 命令消息 | ||
16(AFM3),19(AFM0) | Shared Object Message | 命令消息 | ||
17(AFM3),20(AFM0) | Command Message | 命令消息 | ||
22 | Aggregate Message |
AMF是Flash的编码数据格式,其形式像KLV(Key+Length+Value)。