RTMP(Real-time messaging Protocol)实时消息传输协议,该消息基于TCP,是一个协议族,用来解决多路复用和分包的问题。
发送端:
- 把数据封装成消息
- 把消息分割为块
- 将分割后的快通过传输协议如(TCP)协议发送到网络传输出去
接收端:
- 通过TCP协议收到块数据
- 先将块重新组装成消息
- 通过对消息进行解封装可以恢复出可处理的数据
下面从从设计思想,消息【类型、格式、消息交互实例】、块等几个方面了解RTMP
设计思想
分包
从RTMP的数据传输流程可以看出RTMP里有两个重要的概念:消息和块。
消息,服务于数据封装,是RTMP协议中的基本数据单元;
块,服务于挽留过传输
通过这种分层设计,就可以将大的消息(message)分包成小的块(chunk)通过网络进行传输,这个也是RTMP能够实现降低延迟的核心原样
多路复用
在RTMP中,实时生成的音频和视频依次加入数据流,实现了多路复用。这个流就是块流(chunk stream),这种复用流,也是音视频同步的关键
优先级
块流没有优先级划分,优先级设计在消息流(message stream),不同消息的不同优先级,控制了在网络底层的排列顺序。
控制消息>音频消息>视频消息
分块的利用,是优先级有效执行的关键,将大消息切割小的,避免了大低优先级消息堵塞小的高优先级
块大小协商
在将消息切成为块,是以chunk size为基准切割。默认值为128字节。
块越大,CPU负担越小,不利于网络传输。耗时
块越小,CPU负担越大,利于挽留过,但不适用于高码率数据流情况。
chunk size可根据实际情况改变,通过set chunk size
压缩优化
RTMP中rtmp chunk header的长度不是固定的,12、8、4、1字节四种,RTMP chunk head是块头,属于RTMP结构块结构一部分。
最完整的chunk header是12字节,一步一步省略就变为了1字节的
12字节为
chunk type/chunk stream/timestamp/message length/msg type id/msg stream id
其中msg stream id为4字节,省略之后就剩8字节
msg type id为1字节,message length为3个字节,省略之后为4字节。
只剩 chunk type / chunk stream id的1字节
网友评论