RTMP
RTMP
RTMP,
- 纯
RTMP: 直接通过TCP 连接,端口为1935 - RTMPS: RTMP + TLS/SSL,用于安全性的交流。
- RTMPE: RTMP + encryption。在
RTMP 原始协议上使用,Adobe 自身的加密方法 - RTMPT: RTMP + HTTP。使用
HTTP 的方式来包裹RTMP 流,这样能直接通过防火墙。不过,延迟性比较大。 - RTMFP: RMPT + UDP。该协议常常用于
P2P 的场景中,针对延时有变态的要求。
在
协议规范

当使用一个可靠的传输协议如
消息格式
消息格式可以被分割成多个块,用来在更高的协议中支持多路复用。在创建块消息格式时,应该包含以下字段
-
时间戳:消息的时间戳。这个字段占用
4 字节。 -
长度:消息的有效长度。如果消息头不能被忽略,它应该包括长度。这个字段在块头中占用
3 字节。 -
类型
ID :各种类型的协议控制消息的ID 。这些消息使用RTMP 块流协议和更高级别的协议来传输信息。所有其他类型的ID 可以用在高级协议,这对于RTMP 块流来说,是不透明的。事实上,RTMP 块流中没有要求使用这些值作为类型;所有( 无协议的) 消息可能是相同的类型,或者应用程序使用这个字段来区分多个连接,而不是类型。这个字段在块头中占用1 字节。 -
消息流
ID :消息流ID 可以是任意值。当同一个块流被复用到不同的消息流中时,可以通过消息流ID 来区分它们。另外,对于RTMP 块流而言,这是一个不透明值。该字段占用4 字节,使用小端序。
握手
客户端通过发送
+-------------+ +-------------+
| Client | TCP/IP Network | Server |
+-------------+ | +-------------+
| | |
Uninitialized | Uninitialized
| C0 | |
|------------------->| C0 |
| |-------------------->|
| C1 | |
|------------------->| S0 |
| |<--------------------|
| | S1 |
Version sent |<--------------------|
| S0 | |
|<-------------------| |
| S1 | |
|<-------------------| Version sent
| | C1 |
| |-------------------->|
| C2 | |
|------------------->| S2 |
| |<--------------------|
Ack sent | Ack Sent
| S2 | |
|<-------------------| |
| | C2 |
| |-------------------->|
Handshake Done | Handshake Done
| | |
下面是握手示意图中提到的状态
-
未初始化:协议版本号在此阶段发送。客户端和服务器均处于未初始化状态。客户端发送携带协议版本号的
C0 包。如果服务器支持此版本,回复S0 和S1 包。如果服务器不支持此版本,使用适当的动作回复。在RTMP 协议中,此动作是中止连接。 注: 在”C0 和S0 格式”章节中提及, 如果服务器不支持客户端的版本号, 可以选择降到版本3 或中止。 -
发送版本:客户端和服务器双方在未初始化状态后,会进入发送版本状态。之后,客户端等待
S1 包,服务器等待C1 包。待接收到数据包,客户端发送C2 包,服务器发送S2 包。然后,双方都进入答复状态。客户端等待C2 的答复,服务器等待S2 的答复。 -
握手完成:客户端和服务器交换消息。
RTMP 代理
关于
因此,
使用网络字节序,big-endian。在
标准
C0, 1B, 03表示明文RTMP。后面是C1C2以及其他消息。
F3, 1B,常量0xF3,表示RTMP代理协议。
Size, 2B, 表示代理数据的长度,即Size和C0之间的数据。
X-Real-IP, 4B, 表示客户端的真实IP。
C0, 1B,原始客户端的C0,方便代理直接转发客户端的数据。
备注:一般
Size 应该不超过C0C1 长度,即Size<=1537
。
例如,标准
03 // 客户端的C0包,后面是C1C2,以及其他的消息。
或者,代理客户端发送的消息:
F3 // 表示是RTMP代理
00 04 // 表示Extra有4字节
C0 A8 01 67 // 表示客户端IP,C0.A8.01.67,即192.168.1.103
03 // 客户端原始的C0数据。从这个数据(包括它本身)开始,就是客户端发送的消息了,譬如C1C2。