网络流媒体协议之RTMP(一)
RTMP协议
一、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利用率并减少信息阻塞的机率。
推荐阅读
-
云计算不能承受之重 新一代数据中心网络绘通途
-
python 之 网络编程(基于TCP协议的套接字通信操作)
-
C#利用 HttpWebRequest 类发送post请求,出现“套接字(协议/网络地址/端口)只允许使用一次”问题
-
菜鸟精彩教程: 网络协议知识一点通
-
iOS开发之网络音乐播放器(SC音乐)(一)
-
Java基础-关于session的详细解释(一) Java浏览器应用服务器IE网络协议
-
Java基础-关于session的详细解释(一) Java浏览器应用服务器IE网络协议
-
有一个开源的项目Cindy,现在不知道为什么没有更新了,作者放弃了吗 HPCVSJava网络协议.net
-
JAVA基础之网络通信协议--TCP与UDP
-
网络流媒体协议之RTMP(一)