RTMP協議相關知識

2021-09-25 14:06:28 字數 3502 閱讀 4094

2.2. rtmp中的邏輯結構

2.5.

2.6.

2.7.

3. rtmp協議流程

rtmp協議是乙個網際網路tcp/ip五層體系結構中應用層的協議。rtmp協議中基本的資料單元稱為訊息(message)。當rtmp協議在網際網路中傳輸資料的時候,訊息會被拆分成更小的單元,稱為訊息塊(chunk)。rtmp 是目前主流的流**傳輸協議,廣泛用於直播領域,可以說市面上絕大多數的直播產品都採用了這個協議。

rtmp協議就像乙個用來裝資料報的容器,這些資料可以是amf格式的資料,也可以是flv中的視/音訊資料。乙個單一的連線可以通過不同的通道傳輸多路網路流。這些通道中的包都是按照固定大小的包傳輸的。

cdn 支援良好,主流的 cdn 廠商都支援

協議簡單,在各平台上實現容易

基於 tcp ,傳輸成本高,在弱網環境丟包率高的情況下問題顯著

不支援瀏覽器推送

adobe 私有協議,adobe 已經不再更新

rtmp傳輸的資料的基本單元為message,但是實際上傳輸的最小單元是chunk(訊息塊),因為rtmp協議為了提公升傳輸速度,在傳輸資料的時候,會把message拆分開來,形成更小的塊,這些塊就是chunk。

訊息是rtmp協議中基本的資料單元。不同種類的訊息包含不同的message type id,代表不同的功能。rtmp協議中一共規定了十多種訊息型別,分別發揮著不同的作用。

下面針對上圖的訊息結構體進行簡要分析:

在網路上傳輸資料時,訊息需要被拆分成較小的資料塊,才適合在相應的網路環境上傳輸。rtmp協議中規定,訊息在網路上傳輸時被拆分成訊息塊(chunk)。

訊息塊首部(chunk header)有三部分組成:

通過上圖可以看出,訊息塊在結構上與與訊息類似,有header和body。

下面對圖的每個部分簡要介紹:

注意: rtmp在傳輸資料的時候,傳送端會把需要傳輸的**資料封裝成訊息,然後把訊息拆分成訊息塊,再乙個乙個進行傳輸。接收端收到訊息塊後,根據message stream id重新將訊息塊進行組裝、組合成訊息,再解除該訊息的封裝處理就可以還原出**資料。由此可以看出,rtmp收發資料是以chunk為單位,而不是以message為單位。需要注意的是,rtmp傳送chunk必須是乙個乙個傳送,後面的chunk必須等前面的chunk傳送完成。

在訊息被分割成幾個訊息塊的過程中,訊息負載部分(message body)被分割成大小固定的資料塊(預設是128位元組,最後乙個資料塊可以小於該固定長度),並在其首部加上訊息塊首部(chunk header),就組成了相應的訊息塊。訊息分塊過程如圖5所示,乙個大小為307位元組的訊息被分割成128位元組的訊息塊(除了最後乙個)。

rtmp傳輸**資料的過程中,傳送端首先把**資料封裝成訊息,然後把訊息分割成訊息塊,最後將分割後的訊息塊通過tcp協議傳送出去。接收端在通過tcp協議收到資料後,首先把訊息塊重新組合成訊息,然後通過對訊息進行解封裝處理就可以恢復出**資料。

第一步,建立乙個網路連線(netconnection)

第二步,建立乙個網路流(netstream)。

其中,網路連線代表伺服器端應用程式和客戶端之間基礎的連通關係。網路流代表了傳送多**資料的通道。伺服器和客戶端之間只能建立乙個網路連線,但是基於該連線可以建立很多網路流。他們的關係如圖所示:

總的流程圖如下:

下面來詳細分析一下這幾個過程都做了一些什麼東東

在rtmp連線建立後,服務端與客戶端需要通過3次交換報文完成握手,握手其他的協議不同,是由三個靜態大小的塊,而不是可變大小的塊組成的,客戶端與伺服器傳送相同的三個chunk,客戶端傳送c0,c1,c2,服務端傳送s0,s1,s2。

握手開始於客戶端傳送 c0,c1 塊。

在傳送 c2 之前客戶端必須等待接收 s1 。

在傳送任何資料之前客戶端必須等待接收 s2。

服務端在傳送 s0 和 s1 之前必須等待接收 c0,也可以等待接收 c1。

服務端在傳送 s2 之前必須等待接收 c1。

服務端在傳送任何資料之前必須等待接收 c2。

c0與s0

c0和s0的長度是乙個位元組,在 s0 中這個字段表示伺服器選擇的 rtmp 版本。rtmp1.0規範所定義的版本是 3;0-2 是早期產品所用的,已被丟棄;4-31保留在未來使用;32-255 不允許使用(為了區分其他以某一字元開始的文字協議)。如果服務無法識別客戶端請求的版本,應該返回 3 。客戶端可以選擇減到版本 3 或選擇取消握手。

c1與s1c2與s2下面對建立網路連線的流程簡單介紹

客戶端傳送命令訊息中的「連線」(connect)到伺服器,請求與乙個服務應用例項建立連線。

伺服器接收到連線命令訊息後,傳送確認視窗大小(window acknowledgement size)協議訊息到客戶端,同時連線到連線命令中提到的應用程式。

伺服器傳送設定頻寬()協議訊息到客戶端。

客戶端處理設定頻寬協議訊息後,傳送確認視窗大小(window acknowledgement size)協議訊息到伺服器端。

伺服器傳送使用者控制訊息中的「流開始」(stream begin)訊息到客戶端。

伺服器傳送命令訊息中的「結果」(_result),通知客戶端連線的狀態。

注意

過程如下

客戶端傳送命令訊息中releasestream命令到伺服器端

客戶端傳送命令訊息中fcpublish命令到伺服器端

客戶端傳送命令訊息中的「建立流」(createstream)命令到伺服器端。

伺服器端接收到「建立流」命令後,傳送命令訊息中的「結果」(_result),通知客戶端流的狀態。

注意:解析伺服器返回的訊息會得到乙個stream id, 這個id也就是以後和伺服器通訊的 message stream id, 一般返回的是1,不固定。

圖如下:

RTMP協議概述

rtmp協議概述 介紹 rtmp協議就像乙個用來裝資料報的容器,這些資料可以是amf格式的資料,也可以是flv中的視 音訊資料.乙個單一的連線可以通過不同的通道傳輸多路網路流.這些通道中的包都是按照固定大小的包傳輸的.網路連線 connection copy to clipboard code va...

RTMP協議分析

rtmp協議封包 由乙個包頭和乙個包體組成,包頭可以是4種長度的任意一種 12,8,4,1 byte s 完整的rtmp包頭應該是12bytes,包含了時間戳,amfsize,amftype,streamid資訊,8位元組的包頭只紀錄了時間戳,amfsize,amftype,其他位元組的包頭紀錄資訊...

rtmp 協議詳解

rtmp協議是乙個網際網路tcp ip五層體系結構中應用層的協議。rtmp協議中基本的資料單元稱為訊息 message 當rtmp協議在網際網路中傳輸資料的時候,訊息會被拆分成更小的單元,稱為訊息塊 chunk 1 訊息 2 訊息塊 在網路上傳輸資料時,訊息需要被拆分成較小的資料塊,才適合在相應的網...