RTP/RTCP

RTP real-time transport protocol

【簡介】
RTP 提供端對端實時數(shù)據(jù)傳輸,如音視頻。本身不確保傳輸?shù)挠行蛐曰蛘咛峁㏎oS保證。依賴底層服務去做。
RTCP RTP control protocol,監(jiān)控Qos,傳輸參與者的會話信息。
profile specification document,定義負載類型編碼集合,并將之映射到負載格式(如媒體編碼)。同時根據(jù)特定類別的應用定義RTP擴展和修改。
payload format specification document,定義特定負載如音頻或視頻編碼是如何被RTP搭載的。

【使用場景】
一,簡單多播音頻會議
使用IP多播服務,多播地址和一對端口。一個端口傳輸音頻數(shù)據(jù),一個端口傳輸RTCP包
音頻會議應用發(fā)送的音頻數(shù)據(jù)比較小,20ms的延時。
存儲音頻數(shù)據(jù)塊的RTP包包含在UDP包中。RTP頭標識音頻編碼(如PCM,ADPCM,LPC等),每個包頭都有,方便實時改變編碼類型。如低帶寬的加入者。
RTP頭包含時間信息和序列號,允許接收者重建時鐘。如音頻數(shù)據(jù)塊每隔20ms順序播放。接收者也可以用序列號估計丟包數(shù)。
每個應用實例使用RTCP端口周期性的多播一個包含用戶名字的響應包。表明當前說話者接收狀況,被用來控制自適應編碼。亦可包含其他用來控制
帶寬限制的信息。離開會議會發(fā)送RTCP BYE 包

二,音視頻會議
使用不同的RTP會話傳輸音頻和視頻。使用兩個不同的UDP端口對及/或多播地址傳輸RTP和RTCP包。兩個會話不直接相關,RTCP中用戶名相同可以表明關聯(lián)
會話間可以使用RTCP包中的時間信息來確保音視頻同步

三,混和器和轉(zhuǎn)換器 mixer translator
低帶寬區(qū)域放置mixer,mixer重新同步發(fā)送者產(chǎn)生的20ms音頻包,并將之混合成一路流,轉(zhuǎn)碼為低帶寬流并通過低速網(wǎng)絡傳輸。
這些包可能被單播到一個接收者,或多播到不同地址的多個接收者。RTP頭包含了混合方法,區(qū)別各個貢獻的源。
在防火墻的兩端放置兩個translator,外端通過安全連接接收所有的多播包,并傳遞給內(nèi)端的translator,然后再轉(zhuǎn)發(fā)

四,層編碼
多媒體應用應該能夠調(diào)整傳輸碼率來適應接收者的能力,或者適應網(wǎng)絡擁塞。
結(jié)合層傳輸系統(tǒng)的層編碼,接收者可以負責碼率自適應。如IP多播的RTP,源可以在多個RTP會話中對分層表示的信號的漸進層進行分條,
每個會話都在自己的多播組中進行。接收者可以自適應網(wǎng)絡,通過只加入多播組合適的子集來控制它們的響應帶寬。

【定義】
RTP payload:音頻采樣或視頻壓縮數(shù)據(jù)。
RTP packet:包含頭和payload數(shù)據(jù)。通常一個下層協(xié)議包包含一個RTP包,也可以包含多個RTP包
RTCP packet:包含固定頭部,包含與RTCP包類型相關的結(jié)構(gòu)化元素。多個RTCP包可以在一個底層協(xié)議包中。每個RTCP包頭部的length域使能
RTP session
Synchronization source(SSRC):定義在RTP頭中的32位數(shù)值SSRC標識符。一個同步源的所有包組成部分時序和序列號空間。
接收者收集同步源的包播放。在一個特定的RTP session中,SSRC是全局唯一的隨機值。同一個multimedia session中的所有RTP session 中SSRC唯一
SSRC通過RTCP提供綁定。如果一個參與者在一個RTP session中生產(chǎn)了多個流,則每個流必須標識不同的SSRC。
Contributing source(CSRC):RTP mixer 組成的一個流中對流具有貢獻的源。mixer將這些源的SSRC標識符列表插入到RTP包的頭部。列表稱為
CSRC 表。確保接收者能夠分辨發(fā)送者,即使所有的RTP包包含相同的SSRC標識符(mixer的)。
Monitor:在一個RTP session中接收參與者發(fā)送的RTCP包,如報告、估計QoS、錯誤診斷、長期分析等。
Non-RTP means:提供可用服務除了RTP的其他協(xié)議和機制。如,提供多播地址、加密密鑰、協(xié)商加密算法、定義RTP payload type 和
payload format的動態(tài)映射。SIP(RFC 3261),SDP(RFC 2327)

【字節(jié)序、對齊、時間格式】
網(wǎng)絡字節(jié)序(大端)
絕對日期和時間使用NTP(Network Time Protocol)協(xié)議的時間戳格式。起始點1900.1.1 0h。

【RTP 數(shù)據(jù)傳輸協(xié)議】
一,RTP 固定頭部域
前12字節(jié)包含在所有RTP包中,4字節(jié)的CSRC標識符可選,使用mixer時插入。
V:version 2bits,RTP版本,默認位2。
P:padding,1bit,置位時包可能包含額外字節(jié)。這些額外字節(jié)位于不是payload的前面位置。最后一個額外字節(jié)表明忽略多少額外字節(jié),包括自己。
用于一些需要特定塊大小的加密算法或用于底層協(xié)議數(shù)據(jù)單元裝載多個RTP包
X:extension,1bit,置位后,固定頭部必須跟隨一個頭擴展。
CC:CSRC count,4bit
M:marker,1bit,profile定義,重要事件如標記包流中幀邊緣。profile可能定義額外的marker bits或通過改變payload type 域。
PT:payload type,7bits,定義RTP payload格式, 決定如何被應用解釋。
sequence number:16bits,每次遞增1,接收者判斷是否丟包、恢復包序。初始包序號隨機。
timestamp:32bits,反映RTP 數(shù)據(jù)包第一個字節(jié)的采樣時機。采樣時鐘必須線性單調(diào)遞增,用來同步和抖動校正。
初始值隨機。不同的源的時間時間戳可能沒關系,無法用來同步,使用參考時鐘同步
SSRC: 32bits
CSRC list:0~15個,每個32bits

二,多路復用RTP會話
三,profile 定義的RTP頭修改
四,RTP 頭擴展

【RTCP】
周期性的發(fā)送控制包給會話中的參與者。應用與數(shù)據(jù)包相同的分發(fā)機制,低層協(xié)議提供數(shù)據(jù)與控制包的復用,如使用單獨的UDP端口號
(1) 主要是提供數(shù)據(jù)發(fā)布的質(zhì)量反饋。RTCP是作為RTP傳輸協(xié)議的一部分,與其他傳輸協(xié)議的流和阻塞控制有關。反饋對自適應編碼控制
直接起作用,但IP多播經(jīng)驗表明,從發(fā)送者收到反饋對診斷發(fā)送錯誤是至關重要的。給所有參加者發(fā)送接收反饋報告允許問題觀察者估計
那些問題是局部的,還是全局的。諸如IP多播等發(fā)布機制使網(wǎng)絡服務提供商之類的團體可能接收反饋信息,充當?shù)谌奖O(jiān)控者來診斷網(wǎng)絡
問題。反饋功能由RTCP發(fā)送者和接收者報告執(zhí)行。
(2)RTCP帶有稱作規(guī)范名字(CNAME)的RTP源持久傳輸層標識。如發(fā)現(xiàn)沖突,或程序重新啟動,既然SSRC標識可改變,接收者需要CNAME
跟蹤參加者。接收者也需要CNAME與相關RTP連接中給定的幾個數(shù)據(jù)流聯(lián)系。
(3)前兩種功能要求所有參加者發(fā)送RTCP包,因此,為了RTP擴展到大規(guī)模數(shù)量,速率必須受到控制。讓每個參加者給其他參加者發(fā)送
控制包,就加大獨立觀察參加者數(shù)量。該數(shù)量用于計算包發(fā)送的速率。
(4)可選功能是傳送最小連接控制信息,如辨識參加者。最可能用在“松散控制”連接,那里參加者自由進入或離開,沒有成員控制
或參數(shù)協(xié)調(diào),RTCP充當通往所有參加者的方便通道,但不必支持應用的所有控制通訊要求。

在IP多播場合應用RTP時,前三個功能是必須的,推薦用于所有情形。RTP應用設計人員必須避免使用僅在單播模式下工作的機制,
那將導致無法擴展規(guī)模。

【RTCP包格式】
下面定義幾個攜帶不同控制信息的RTCP包類型:
SR(SenderReport):發(fā)送者報告,當前活動發(fā)送者發(fā)送、接收統(tǒng)計。
RR(ReceiverReport):接收者報告,非活動發(fā)送者接收統(tǒng)計。
SDES(SourceDescription):源描述項,包括CNAME, NAME, EMAIL,PHONE等。
BYE:表示結(jié)束。
APP(application):應用特定函數(shù)。

類似于RTP數(shù)據(jù)包,每個RTCP包以固定部分開始,緊接著的是可變長結(jié)構(gòu)元素,但以一個32位邊界結(jié)束。包含對齊要求和固定部分中長度域,
使RTCP包可堆疊。不需要插入任何分隔符將多個RTCP包連接起來形成一個RTCP組合包,以低層協(xié)議用單一包發(fā)送出去。由于低層協(xié)議
提供整體長度來決定組合包的結(jié)尾,在組合包中沒有單個RTCP包顯式計數(shù)。

組合包中每個RTCP包可獨立處理,不需要根據(jù)包組合順序。但為了執(zhí)行協(xié)議功能,強加如下約束:
(1) 接收統(tǒng)計(在SR或RR中)應該經(jīng)常發(fā)送,只要帶寬允許,因此每個周期發(fā)送的組合RTCP包應包含報告包。
(2) 新接收者需要接收CNAME,并盡快識別源,開始聯(lián)系媒介進行同步,因此每個包應該包含SDES CNAME。
(3) 出現(xiàn)在組合包前面的是包類型數(shù)量,其增長應該受到限制,以提高常數(shù)位數(shù)量,提高成功確認RTCP包對地址錯誤RTP數(shù)據(jù)包或其他無關包的概率。

因此,所有RTCP包至少必須以兩個包組合形式發(fā)送,推薦格式如下:
①加密前輟(Encryption prefix)
僅當組合包被加密,才加上一個32位隨機數(shù)用于每個組合包發(fā)送。
②SR或RR
組合包中第一個RTCP包必須總為一個報告包,方便頭的確認。即使沒有數(shù)據(jù)發(fā)送,也沒有接收到數(shù)據(jù),也要發(fā)送一個空RR,即避免組合包中RTCP包為BYE(終止標識)。
③附加RR
如報告統(tǒng)計源數(shù)目超過31,在初始報告包后應該有附加RR包。
④SDES
包含CNAME項的SDES包必須包含在每個組合RTCP包中。如應用要求,其他源描述項可選,但受到帶寬限制。
⑤BYE或APP
其他RTCP包類型可以任意順序排列,除了BYE應作為最后一個包發(fā)送,包類型出現(xiàn)可不止一次。
建議轉(zhuǎn)換器或混合器從多個源組合單個RTCP包。如組合包整體長度超過網(wǎng)絡路徑量最大傳輸單元,可分成多個較短組合包用低層協(xié)議以
單個包形式發(fā)送。注意,每個組合包必須以SR或RR包開始。附加RTCP包類型可在因特網(wǎng)分配號碼
機構(gòu)(IANA,InternetAssighnedd Numbers Authority)處注冊。

【RTCP傳輸間隔】
【SR包】
包類型 200

  1. 第一部分為頭,8個八位組長,內(nèi)容如下。
    ① 版本(V):2位,標識RTP版本。
    ② 填充(P):1位,如設置于此位,RTCP包結(jié)尾包含一些附加填充八位組,它們不屬于控制信息。最后一個八位組填充表示應忽略多少個填充。
    有些加密算法需要填充,塊大小固定。在組合RTCP包內(nèi),填充僅在最后一個包中需要,因為組合包加密成一個整體。
    ③ 接收報告計數(shù)(RC):5位,包含在包內(nèi)的接收報告塊數(shù)目,0值為有效。
    ④ 包類型(PT):8位,包含常數(shù)200標識此包為RTCP的SR包。
    ⑤ 長度:16位,以32位字為單位的RTCP包長減一。
    ⑥ SSRC:32位,同步源標識。

  2. 第二部分為發(fā)送者信息,20個八位組,20個字節(jié),出現(xiàn)在每個發(fā)送者報告包中。含義如下。
    ① NTP時標:64位,表示報告發(fā)送時的時鐘時間,它可以與從其它接收者返回的接收報告塊中的時間標志結(jié)合起來,測量到這些接收者的環(huán)路時延
    ② RTP時標:32位,與上述NTP時標同一時間有關,但與RTP時標有著相同的時間單位和同樣的隨機偏移。
    ③ 發(fā)送者包計數(shù):32位,自開始發(fā)送來,直到SR包產(chǎn)生時刻,發(fā)送者發(fā)送RTP數(shù)據(jù)包總數(shù)。如改變SSRC標識符,此計數(shù)重置。
    ④ 發(fā)送者八位組計數(shù):32位,發(fā)送者在RTP數(shù)據(jù)包中發(fā)送的載荷八位組總數(shù)。從發(fā)送開始,直到產(chǎn)生SR包,如發(fā)送者改變SSRC標識,重置此計數(shù)。
    這部分可用于估計載荷數(shù)據(jù)平均速率。

  3. 第三部分包含接收報告塊,大小不固定。每個接收報告塊傳送單個同步源接收RTP包的統(tǒng)計。發(fā)生沖突,當源改變SSRC標識時,接收者并不繼續(xù)統(tǒng)計。
    這些統(tǒng)計包括:
    ① SSRC_n(源標識):32位,接收報告塊中信息所屬源的SSRC標識。
    ② 丟失包率:8位,前一個SR或RR包發(fā)送以來所丟失的源SSRC_n的RTP數(shù)據(jù)包中一部分,定義成所丟失包的數(shù)目比率。
    以固定點小數(shù)表示,小數(shù)點位于左側(cè)。等于將丟包率乘以256取整。損失包數(shù)/期望接收包數(shù)
    ③ 丟失包累積數(shù):24位,自接收以來所丟失的源SSRC_n的RTP數(shù)據(jù)包總數(shù),定義成小于實際所接收包的數(shù)量,該數(shù)量包括遲到或復制的包。
    因此,遲到的包不計為丟失,如有復制,此數(shù)量可能為負數(shù)。
    ④ 收到已擴展的最高系列號:32位,低16位包含從SSRC_n源RTP數(shù)據(jù)包中收到的最高系列號,最高16位以序列號循環(huán)相應計數(shù)擴展序列號。
    如開始時間明顯不同,同一連接內(nèi)不同接收者將對系列號產(chǎn)生不同擴展。
    ⑤ 間隔抖動:32位,RTP數(shù)據(jù)包間隔時間的統(tǒng)計估計,以時標為單位,是一個無符號整數(shù)。
    ⑥ 最后SR時標(LSR):32位,NTP時標的中間32位,如還沒有收到SR,此段設為零。
    ⑦ 自最后一個SR來的延遲(DLSR):32位,延遲以1/65536秒為單位,表示源SSRC_n收到的最后一個SR包與發(fā)送此接收塊之間的時間,如還沒有收到SR,此段設為零。

【RR包】
接收報告包格式與SR包類似,但包類型包含常數(shù)201,并刪除發(fā)送者信息的五個字。當沒有數(shù)據(jù)傳輸或接收報告時,則將一個空RR包(RC=O)放在組合RTCP包的前頭。

【SDES】
源描述RTCP包(SDES)為三層結(jié)構(gòu),由頭與數(shù)據(jù)塊組成,數(shù)據(jù)塊可以沒有,也可有多個,組成項描述塊所表明的源

  1. 項描述如下:

    (1)版本(V)、填充(P)、長度:如SR包中所描述。

    (2)包類型(PT):8位,包含常數(shù)202,標識RTCP SDES包。

    (3)源計數(shù)(X):1位,包含在SDES包中的SSRC/CSRC塊數(shù)量,零值有效,但沒有意義。

    1. 源描述項
      【BYE包】
      包頭類似,類型為203

對于UDP及類似協(xié)議,RTP使用偶數(shù)目的端口,RTCP使用大1的奇數(shù)目的端口。
單播會話中,兩個參與者都需要定義一個端口對來接收RTP和RTCP包

【丟包率計算】
initRTPSeqNo:本端收到的第一個RTP報文序列號
extRTPSeqNo1:本端在采樣點收到的RTP報文中最大的序列號
preExpRcvRTPPkt:期望收包數(shù),= extRTPSeqNo1 - initRTPSeqNo
rcvRTPPkt1:本端在采樣點1處實際收包數(shù) preRcvRTPPkt
extRTPSeqNo2:本端在采樣點2收到的RTP包中最大的序列號
rcvRTPPkt2:本端在采樣點2的實際收包數(shù)

receivedInterval:實際間隔收包數(shù) rcvRTPPkt2 - rcvRTPPkt1
expectedInterval:預期間隔收包數(shù) extRTPSeqNo2 - extRTPSeqNo1

lostInterval = (expectedInterval - receivedInterval)/expectedInterval;

【RR間隔抖動計算】
int transit = arrival - r->ts; ///<傳輸間隔 = 當前時間 - 接收包時間戳
int d = transit - s->transit; ///<傳輸間隔 - 上次傳輸間隔
s->transit = transit;
if (d < 0) d = -d;
s->jitter += (1./16.) * ((double)d - s->jitter); ///<計算期望抖動

rr->jitter = (u_int32) s->jitter;
///< 或者
s->jitter += d - ((s->jitter + 8) >> 4);
rr->jitter = s->jitter >> 4;

【環(huán)路時延計算】

![20170718134634553.png](https://upload-images.jianshu.io/upload_images/3454662-95903703c675be69.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
rtp_rtcp發(fā)送者報告包.png
rtp_rtcp接收者報告包.png
rtp_rtcp源描述包.png
rtp_rtcp組合包結(jié)構(gòu).png
rtp_丟包率估算.png
rtp_環(huán)路時延計算.png
rtp_頭域定義.png
rtp_頭域擴展.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容