網絡流媒體-RTP與RTCP

1、RTP與RTCP概述

RTP與RTCP協議本來不屬於我們常見的流媒體協議,類似rtmp,rtsp,hls,webrtc等,但是很多的流媒體協議又是在這兩個協議之上的額,比如rtsp和webtrc這兩個下層就是rtp與rtcp協議的。這兩個協議在四層模型中我們仍把他們歸屬到應用層協議中,因爲這兩個協議的實現代碼均是由我們用戶自己完成,一個包含RTP完整的流媒體協議封裝應是類似user data+rtsp+rtp/rtcp+udp+ip來完成的。

RTP與RTCP協議區別?

在流媒體協議中這兩個協議一定是成對出現的,但是他們分工不一樣,RTP包負責傳輸用戶數據,RTCP包負責控制數據(確保數據質量等,裏面包含了RTP數據的傳輸包數量,丟包數,碼率等),因此RTCP是必須週期性穿插在碼流中。且這兩個協議佔用端口不一樣,RTP佔用的是UDP偶數端口,而RTCP則是RTP端口+1的奇數端口。

2、RTP封裝

我們知道任何一種協議的封包格式中,肯定包含有頭部信息的,rtp也不例外(rtp+fixed_header+extend_header+payload),具體的rtp header見圖。重點關注標紅的一個字段,關係到是否包含有擴展頭,rtp包的序號以控制rtp包接收順序,丟包重傳等(因爲rtp是基於UDP不可靠協議的,並不能保證包順序,是否丟包等)。其實還有擴展頭的,只不過我們只關注基本原理,就不詳細去講擴展頭等。對於rtp的理解我們只需知道,rtp專用於用戶數據的傳輸,同時在頭部爲rtcp提供rtp的負載類型,rtp包順序,標記位等以便於RTCP控制質量。

版本號(V):2比特,用來標誌使用的RTP版本。

填充位(P):1比特,如果該位置位,則該RTP包的尾部就包含附加的填充字節。

擴展位(X): 1比特,如果該位置位的話,RTP固定頭部後面就跟有一個擴展頭部。

CSRC計數器(CC):4比特,含有固定頭部後面跟着的CSRC的數目。

標記位(M): 1比特,該位的解釋由配置文檔(Profile)來承擔.
載荷類型(PayloadType): 7比特,標識了RTP載荷的類型。

序列號(SN):16比特,每發送一個 RTP 數據包,序列號增加1。接收端可以據此檢測丟包和重建包序列。

時間戳(Timestamp): 2比特,記錄了該包中數據的第一個字節的採樣時刻。在一次會話開始時,時間戳初始化成一個初始值。即使在沒有信號發送時,時間戳的數值也要隨時間而不斷地增加(時間在流逝嘛)。時鐘頻率依賴於負載數據格式,並在描述文件(profile)中進行描述。

同步源標識符(SSRC):32比特,同步源就是指RTP包流的來源。在同一個RTP會話中不能有兩個相同的SSRC值。該標識符是隨機選取的 RFC1889推薦了MD5隨機算法。

貢獻源列表(CSRC List):0~15項,每項32比特,用來標誌對一個RTP混合器產生的新包有貢獻的所有RTP包的源。由混合器將這些有貢獻的SSRC標識符插入表中。SSRC標識符都被列出來,以便接收端能正確指出交談雙方的身份。

例子:下面是wireshark抓取的RTP包,

3、RTCP封裝

 rtcp的主要功能是服務質量的監視與反饋、媒體間的同步,以及多播組中成員的標識。在RTP會話期 間,各參與者週期性地傳送RTCP包。RTCP包中含有已發送的數據包的數量、丟失的數據包的數量等統計資料,因此,各參與者可以利用這些信息動態地改變傳輸速率,甚至改變有效載荷類型。RTP和RTCP配合使用,它們能以有效的反饋和最小的開銷使傳輸效率最佳化,因而特別適合傳送網上的實時數據。RTCP分爲五種類型:

 RTCP也是用UDP來傳送的,但RTCP封裝的僅僅是一些控制信息,因而分組很短,所以可以將多個RTCP分組封裝在一個UDP包中。RTCP有如下五種分組類型。
類型     縮寫表示     用途
200     SR(Sender Report)     發送端報告
201     RR(Receiver Report)     接收端報告
202     SDES(Source Description Items)     源點描述
203     BYE     結束傳輸
204     APP     特定應用

上述五種分組的封裝大同小異,下面只講述SR類型,而其它類型請參考RFC3550。

        發送端報告分組SR(Sender Report)用來使發送端以多播方式向所有接收端報告發送情況。SR分組的主要內容有:相應的RTP流的SSRC,RTP流中最新產生的RTP分組的時間戳和NTP,RTP流包含的分組數,RTP流包含的字節數。SR包的封裝如圖3所示。

版本(V):同RTP包頭域。

填充(P):同RTP包頭域。

接收報告計數器(RC):5比特,該SR包中的接收報告塊的數目,可以爲零。
包類型(PT):8比特,SR包是200。

長度域(Length):16比特,其中存放的是該SR包以32比特爲單位的總長度減一。

同步源(SSRC):SR包發送者的同步源標識符。與對應RTP包中的SSRC一樣。
NTP Timestamp(Network time protocol)SR包發送時的絕對時間值。NTP的作用是同步不同的RTP媒體流。

RTP Timestamp:與NTP時間戳對應,與RTP數據包中的RTP時間戳具有相同的單位和隨機初始值。

Sender’s packet count:從開始發送包到產生這個SR包這段時間裏,發送者發送的RTP數據包的總數. SSRC改變時,這個域清零。

Sender`s octet count:從開始發送包到產生這個SR包這段時間裏,發送者發送的淨荷數據的總字節數(不包括頭部和填充)。發送者改變其SSRC時,這個域要清零。

同步源n的SSRC標識符:該報告塊中包含的是從該源接收到的包的統計信息。

丟失率(Fraction Lost):表明從上一個SR或RR包發出以來從同步源n(SSRC_n)來的RTP數據包的丟失率。

累計的包丟失數目:從開始接收到SSRC_n的包到發送SR,從SSRC_n傳過來的RTP數據包的丟失總數。

收到的擴展最大序列號:從SSRC_n收到的RTP數據包中最大的序列號,

接收抖動(Interarrival jitter):RTP數據包接受時間的統計方差估計
上次SR時間戳(Last SR,LSR):取最近從SSRC_n收到的SR包中的NTP時間戳的中間32比特。如果目前還沒收到SR包,則該域清零。

上次SR以來的延時(Delay since last SR,DLSR):上次從SSRC_n收到SR包到發送本報告的延時。
參考鏈接:https://blog.csdn.net/machh/article/details/51868569

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章