-
Notifications
You must be signed in to change notification settings - Fork 222
RtmpProxy
winlin edited this page Aug 11, 2016
·
2 revisions
关于RTMP代理的协议规范。RTMP是字节协议,第一个包是c0,1个字节,一般是03表示是明文的RTMP。所以如果需要做RTMP代理,如果直接转发RTMP客户端的消息,是没法传递额外的信息的,譬如HTTP代理在Header中传递的X-Real-IP
,即客户端的IP,就没法给RTMP的后端了。
因此,RTMP的Proxy协议必须使用私有协议,c0的意义必须改写了,譬如另外一个值表示是代理,后面跟随了一些协议信息,这个协议就是RTMP Proxy协议。
使用网络字节序,big-endian。在C0前插入代理的包,兼容RTMP标准协议。
标准RTMP协议如下:
C0, 1B, 03表示明文RTMP。后面是C1C2以及其他消息。
RTMP代理协议如下:
F3, 1B,常量0xF3,表示RTMP代理协议。
Size, 2B, 表示代理数据的长度,即Size和C0之间的数据。
X-Real-IP, 4B, 表示客户端的真实IP。
C0, 1B,原始客户端的C0,方便代理直接转发客户端的数据。
备注:一般Size应该不超过C0C1长度,即
Size<=1537
。
例如,标准RTMP客户端的消息:
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。
RTMP协议,譬如握手的C0、C1、C2、S0、S1、S2,以及数据部分,都没有变更。