RtmpProxy
關于RTMP代理的協議規范。RTMP是字節協議,第一個包是c0,1個字節,一般是03表示是明文的RTMP。所以如果需要做RTMP代理,如果直接轉發RTMP客戶端的消息,是沒法傳遞額外的信息的,譬如HTTP代理在Header中傳遞的X-Real-IP,即客戶端的IP,就沒法給RTMP的后端了。
因此,RTMP的Proxy協議必須使用私有協議,c0的意義必須改寫了,譬如另外一個值表示是代理,后面跟隨了一些協議信息,這個協議就是RTMP Proxy協議。
Protocol
使用網絡字節序,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,以及數據部分,都沒有變更。