一、RTMP协议简介
Real Time Message Protocol(RTMP),即实时消息传输协议,它是由Adobe公司提出的一种应用层协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(Packetizing)的问题。
二、握手
RTMP是基于传输层协议(TCP)来保证信息传输的可靠性,首先需要在传输层建立链接,之后还要建立RTMP Connect链接。
要建立一个有效的RTMP Connection链接,首先要“握手”:客户端要向服务器发送C0,C1,C2(按序)三个chunk,服务器向客户端发送S0,S1,S2(按序)三个chunk,然后才能进行有效的信息传输。RTMP协议本身并没有规定这6个Message的具体传输顺序,但RTMP协议的实现者需要保证这几点:
- 客户端要等收到S1之后才能发送C2
- 客户端要等收到S2之后才能发送其他信息(控制信息和真实音视频等数据)
- 服务端要等到收到C0之后发送S1
- 服务端必须等到收到C1之后才能发送S2
- 服务端必须等到收到C2之后才能发送其他信息(控制信息和真实音视频等数据)
实际握手流程如下:
+-+-+-+-+-+-+ +-+-+-+-+-+-+
| Client | | Server |
+-+-+-+-+-+-+ +-+-+-+-+-+-+
|--------- C0C1 -------->|
|<------- S0S1S2 -------|
|---------- C2 --------->|
三、消息块 Chunck Block
RTMP将Message拆分成Chunck传输,一个Chunck传输完成之后才能传输下一个。每个Chunck中都带有Message ID标识所属的Message,客户端按照ID将Chunck组装成Message。
Chunck传输的原因:
1、避免优先级低的数据持续传输阻塞了优先级高的数据。
2、对于数据量较小的Message,可以通过压缩Chunck Header字段来减少信息的传输量。
Chunck默认大小是128字节,可以通过Chunck Set Size设置Chunck最大值的大小。Chunck太大会占用较多的传输时间,很可能会阻塞后面更重要信息的传输。Chunck太小又会引入过多的额外信息,少量多次的传输也可能会造成发送的间断导致不能充分利用高带宽的优势,因此并不适合在高比特率的流中传输。在实际发送数据时需要根据网络带宽和实际信息的大小动态调整Chunck的大小,从而尽量提高CPU利用率并减少信息阻塞的机率。