RTMP协议解析【三】
文章目录
- RTMP协议解析【三】
- 控制消息
- 设置块大小(Type = 1)
- 终止消息(Type = 2)
- 确认消息(Type = 3)
- 确认窗口大小消息(Type = 5)
- 设置对端带宽消息(Type = 6)
- 用户控制消息
RTMP协议解析【三】
本专栏重点负责介绍RTMP协议的理论部分, 跳过定义,协议与其他协议的优缺点对比,协议的拓展与改进,协议的历史发展等其他废话
本专栏重点介绍三个部分
- RTMP的握手
- RTMP消息
- RTMP推流
前情简要
在RTMP协议解析【一】中,我介绍了RTMP握手的相关流程和包结构,RTMP工作流程大致如下:
- 客户端与服务器建立TCP连接。
- 双方通过握手过程确认协议版本及交换随机数等信息。
- 客户端发送连接命令(connect)到服务器。
- 服务器响应连接命令,返回连接结果。
- 客户端与服务器建立流(stream)进行音视频数据传输。
- 在传输过程中,双方可以发送控制命令,如播放(play)、暂停(pause)等。
当连接关闭时,双方结束消息传输并断开连接。
在 RTMP协议解析【二】中我介绍了RTMP协议的Chunk格式
在本文里,我将会介绍RTMP消息的细节,具体为:
- 控制消息
- 用户控制消息
控制消息
RTMP协议控制消息是指Chunk Stream参数的消息
控制消息的消息类型为
- 1
- 2
- 3
- 5
- 6
消息的Message Stream ID固定为0,Chunk Stream ID固定为2
设置块大小(Type = 1)
本控制消息用来通知对端的块大小的最大值,默认块大小为128字节,结构如下:
- 第一bit必须为0
- 后面31bit为:Chunk Size,表示此后使用此值作为最大的块大小
终止消息(Type = 2)
本控制消息用于通知对端,如果正在等待一条消息的部分块(一个Message可能由多个Chunk组成),那么可以丢弃之前已经接受到的块,对端接受到的Chunk Stream ID作为当前控制消息的有效负载。
业务层一般会在关闭的时候发送这个消息以表示不需要进一步对这个消息进行处理
整个包结构为4字节,仅1个字段:Chunk Stream ID,用来表示哪个Chunk StreamID要被丢弃
确认消息(Type = 3)
本控制消息用来在客户端或者服务端接收到等同于窗口大小的字节后必须发送对端一个确认消息。
窗口大小是指发送者在没有收到接收者的确认消息之前发送的最大字节数,本控制消息定义了序列号也就是目前为止收到的字节数
本控制消息占4字节,仅一个字段:Sequence Number,表示包含了截至目前收到的数据总和,单位为字节
确认窗口大小消息(Type = 5)
本控制字段用来在客户端或者服务端发送本消息通知对端确认消息的窗口大小,结构如下:
占4个字节,表示确认窗口的大小,单位为字节
设置对端带宽消息(Type = 6)
用来在客户端或者服务端发送本消息更新对端传输的带宽,输出带宽值和窗口大小值相同,如果对端在本消息中收到的值和窗口大小不相同,则发回确认窗口大小消息,结构如下:
- Acknowledgement Window Size:占4字节,确认窗口的消息,单位为字节
- Limit Type:限制消息,取值为:0(硬),1(软),或者2(动态)
- 如果是硬限制:对端必须按提供的带宽发送数据
- 如果是软限制:对端可以灵活决定带宽,发送端可以限制带宽
- 如果是动态,则带宽既可以是硬限制,也可以是软限制
用户控制消息
用户控制消息用于告知对方执行该信息中包含的用户控制时间,消息类型为4,并且Message Stream ID固定为0, Chunk Stream ID固定为2
用户控制消息在接受到后,需要马上生效
结构如下:
- Event Type:事件类型,占2字节,16bit
- Event Data:事件数据
其中,Event Type取值有如下情况
取值 | 含义 | 描述 |
---|---|---|
0 | stream begin | 服务器发送这个事件来通知客户端一个流已就绪并可以用来通信。默认情况下,这一事件在成功接收到客 |
1 | Stream EOF | 服务器发送这一事件来通知客户端请求的流的数据回放已经结束。在发送额外的命令之前不再发送任何数据。客户端将丢弃接收到的这个流的消息。事件数据为4字节,代表了回放已结束的流的流 ID |
2 | StreamDry | 服务器发送这一事件来通知客户端当前流中已没有数据。当服务器在一段时间内没有检测到任何消息,它可以通知相关客户端当前流已经没数据了。这一事件数据为4字节,代表了已没数据的流的流 ID。 |
3 | SetBuffer Length | 客户端发送这一事件来通知服务器缓冲区大小 (以毫秒为单位),这个缓冲区用于缓存来自流的任何数据。 此事件在服务器开始处理流之前就发送。事件数据的前4个字节代表了流ID,紧接其后的4个字节代表了以 |
毫秒为单位的缓冲区的长度。 | ||
4 | Stream Recored | 服务器发送这一事件来通知客户端当前流是一个录制流。事件数据为4字节,代表了录制流的流 ID |
6 | PingRequest | 服务器端发送这一事件用于测试客户端是否可达。事件数据是为一个4字节的时间戳,代表了服务器端发 送这一命令时的服务器本地时间。客户端在接收到这一消息后会立即发送 PingResponse 回复。 |
7 | PingResponse | 客户端发送这一事件用于回复服务器的PingRequest。事件数据是为一个4字节的时间戳,该时间戳是从接 收到的PingRequest的事件数据中获取的。 |
关注我,后续将会介绍RTMP的命令消息