流媒体服务器开发笔记(2)--RTCP协议介绍
?
?
? ?RTCP概要實(shí)時(shí)傳輸控制協(xié)議(Real-time Control Protocol,RTCP)與RTP共同定義在1996年提出的RFC 1889中,是和 RTP一起工作的控制協(xié)議。RTCP單獨(dú)運(yùn)行在低層協(xié)議上,由低層協(xié)議提供數(shù)據(jù)與控制包的復(fù)用。在RTP會(huì)話期間,每個(gè)會(huì)話參與者周期性地向所有其他參與者發(fā)送RTCP控制信息包,如下圖所示。對(duì)于RTP會(huì)話或者廣播,通常使用單個(gè)多目標(biāo)廣播地址,屬于這個(gè)會(huì)話的所有RTP和RTCP信息包都使用這個(gè)多目標(biāo)廣播地址,通過使用不同的端口號(hào)可把RTP信息包和RTCP信息包區(qū)分開來(lái)。
RTCP功能
?
1、為應(yīng)用程序提供會(huì)話質(zhì)量或者廣播性能質(zhì)量的信息
RTCP的主要功能是為應(yīng)用程序提供會(huì)話質(zhì)量或者廣播性能質(zhì)量的信息。每個(gè)RTCP信息包不封裝聲音數(shù)據(jù)或者電視數(shù)據(jù),而是封裝發(fā)送端和/或者接收端的統(tǒng)計(jì)報(bào)表。這些信息包括發(fā)送的信息包數(shù)目、丟失的信息包數(shù)目和信息包的抖動(dòng)等情況,這些反饋信息反映了當(dāng)前的網(wǎng)絡(luò)狀況,對(duì)發(fā)送端、接收端或者網(wǎng)絡(luò)管理員都非常有用。RTCP規(guī)格沒有指定應(yīng)用程序應(yīng)該使用這些反饋信息做什么,這完全取決于應(yīng)用程序開發(fā)人員。例如,發(fā)送端可以根據(jù)反饋信息來(lái)調(diào)整傳輸速率,接收端可以根據(jù)反饋信息判斷問題是本地的、區(qū)域性的還是全球性的,網(wǎng)絡(luò)管理員也可以使用RTCP信息包中的信息來(lái)評(píng)估網(wǎng)絡(luò)用于多目標(biāo)廣播的性能。
2、確定 RTP用戶源
RTCP為每個(gè)RTP用戶提供了一個(gè)全局唯一的稱為規(guī)范名稱 (Canonical Name)的標(biāo)志符 CNAME,接收者使用它來(lái)追蹤一個(gè)RTP進(jìn)程的參加者。當(dāng)發(fā)現(xiàn)沖突或程序重新啟動(dòng)時(shí),RTP中的同步源標(biāo)識(shí)符SSRC可能發(fā)生改變,接收者可利用CNAME來(lái)跟蹤參加者。同時(shí),接收者也需要利用CNAME在相關(guān)RTP連接中的幾個(gè)數(shù)據(jù)流之間建立聯(lián)系。當(dāng) RTP需要進(jìn)行音視頻同步的時(shí)候,接受者就需要使用 CNAME來(lái)使得同一發(fā)送者的音視頻數(shù)據(jù)相關(guān)聯(lián)。
3、控制 RTCP傳輸間隔
由于每個(gè)對(duì)話成員定期發(fā)送RTCP信息包,隨著參加者不斷增加,RTCP信息包頻繁發(fā)送將占用過多的網(wǎng)絡(luò)資源,為了防止擁塞,必須限制RTCP信息包的流量,控制信息所占帶寬一般不超過可用帶寬的 5%,因此就需要調(diào)整 RTCP包的發(fā)送速率。由于任意兩個(gè)RTP終端之間都互發(fā) RTCP包,因此終端的總數(shù)很容易估計(jì)出來(lái),應(yīng)用程序根據(jù)參加者總數(shù)就可以調(diào)整RTCP包的發(fā)送速率。
4、傳輸最小進(jìn)程控制信息
這項(xiàng)功能對(duì)于參加者可以任意進(jìn)入和離開的松散會(huì)話進(jìn)程十分有用,參加者可以自由進(jìn)入或離開,沒有成員控制或參數(shù)協(xié)調(diào)。?
?
RTCP信息包
類似于RTP信息包,每個(gè)RTCP信息包以固定部分開始,緊接著的是可變長(zhǎng)結(jié)構(gòu)單元,最后以一個(gè)32位邊界結(jié)束。
根據(jù)所攜帶的控制信息不同RTCP信息包可分為RR(接收者報(bào)告包)、SR(源報(bào)告包)、SEDS(源描述包)、BYE(離開申明)和APP(特殊應(yīng)用包)五類5類:
1、SR:
源報(bào)告包,用于發(fā)送和接收活動(dòng)源的統(tǒng)計(jì)信息;
2、RR:
接收者報(bào)告包,用于接收非活動(dòng)站的統(tǒng)計(jì)信息;
3、SDES:
源描述包,用于報(bào)告和站點(diǎn)相關(guān)的信息,包括CNAME;
4、BYE:
斷開RTCP包,是站點(diǎn)離開系統(tǒng)的報(bào)告,表示結(jié)束;
5、APP:
應(yīng)用特定函數(shù)。
不同類型的RTCP信息包可堆疊,不需要插入任何分隔符就可以將多個(gè)RTCP包連接起來(lái)形成一個(gè)RTCP組合包,然后由低層協(xié)議用單一包發(fā)送出去。由于需要低層協(xié)議提供整體長(zhǎng)度來(lái)決定組合包的結(jié)尾,在組合包中沒有單個(gè)RTCP包的顯式計(jì)數(shù)。
組合包中每個(gè)RTCP包可獨(dú)立處理,而不需要按照包組合的先后順序處理。在組合包中有以下幾條強(qiáng)制約束:
1、只要帶寬允許,在SR包或RR包中的接收統(tǒng)計(jì)應(yīng)該經(jīng)常發(fā)送,因此每個(gè)周期發(fā)送的組合RTCP 包中應(yīng)包含報(bào)告包。
2、每個(gè)組合包中都應(yīng)該包含SDES CNAME,因?yàn)樾陆邮照咝枰ㄟ^接收CNAME來(lái)識(shí)別源,并與媒體聯(lián)系進(jìn)行同步。
3、組合包前面是包類型數(shù)量,其增長(zhǎng)應(yīng)該受到限制。
所有RTCP包至少必須以兩個(gè)包組合形式發(fā)送,推薦格式如下:
加密前綴(Encryption prefix):
僅當(dāng)組合包被加密,才加上一個(gè)32位隨機(jī)數(shù)用于每個(gè)組合包發(fā)送。
SR或RR:
組合包中第一個(gè)RTCP包必須是一個(gè)報(bào)告包,以幫助分組頭的確認(rèn)。即使沒有數(shù)據(jù)發(fā)送,也沒有接收到數(shù)據(jù),也要發(fā)送一個(gè)空RR,那怕組合包中RTCP包為BYE。
附加RR:
如報(bào)告統(tǒng)計(jì)源數(shù)目超過31,在初始報(bào)告包后應(yīng)該有附加RR 包。
SDES:
包含CNAME 項(xiàng)的SDES包必須包含在每個(gè)組合RTCP包中。SDES包可能包括其他源描述項(xiàng),這要根據(jù)特別的應(yīng)用需要,并同時(shí)考慮帶寬限制。
BYE或APP:
除了BYE應(yīng)作為最后一個(gè)包發(fā)送,其它RTCP包類型可以任意順序排列,包類型出現(xiàn)可不止一次。
混合器從多個(gè)源組合單個(gè)RTCP包,如組合包整體長(zhǎng)度超過網(wǎng)絡(luò)路徑最大傳輸單元,可分成多個(gè)較短組合包用低層協(xié)議以單個(gè)包形式發(fā)送。注意,每個(gè)組合包必須以SR或RR包開始。附加RTCP包類型可在Internet Assigned Numbers Authority (IANA)處注冊(cè),以獲得合法的類型號(hào)。
RTCP傳輸間隔
由于RTP設(shè)計(jì)成允許應(yīng)用自動(dòng)擴(kuò)展,可從幾個(gè)人的小規(guī)模系統(tǒng)擴(kuò)展成上千人的大規(guī)模系統(tǒng)。而每個(gè)會(huì)話參與者周期性地向所有其他參與者發(fā)送RTCP控制信息包,如每個(gè)參與者以固定速率發(fā)送接收?qǐng)?bào)告,控制流量將隨參與者數(shù)量線性增長(zhǎng)。由于網(wǎng)絡(luò)資源有限,相應(yīng)的數(shù)據(jù)包就要減少,直接影響用戶關(guān)心的數(shù)據(jù)傳輸。為了限制控制信息的流量,RTCP控制信息包速率必須按比例下降。
一旦確認(rèn)加入到RTP會(huì)話中,即使后來(lái)被標(biāo)記成非活動(dòng)站,地址的狀態(tài)仍會(huì)被保留,地址應(yīng)繼續(xù)計(jì)入共享RTCP帶寬地址的總數(shù)中,時(shí)間要保證能掃描典型網(wǎng)絡(luò)分區(qū),建議為30分鐘。注意,這仍大于RTCP報(bào)告間隔最大值的五倍。
SR源報(bào)告包和RR接收者報(bào)告包
SR源報(bào)告包和RR接收者報(bào)告包用于提供接收質(zhì)量反饋,除包類型代碼外,SR與RR間唯一的差別是源報(bào)告包含有一個(gè)20字節(jié)發(fā)送者信息段。RR針對(duì)每個(gè)信源都提供信息包丟失數(shù)、已收信息包最大序列號(hào)、到達(dá)時(shí)間抖動(dòng)、接收最后一個(gè)SR的時(shí)間、接收最后一個(gè)SR的延遲等信息。SR不僅提供接收質(zhì)量反饋信息(與RR相同),而且提供SSRC標(biāo)識(shí)符、NTP時(shí)間戳、RTP時(shí)間戳、發(fā)送包數(shù)以及發(fā)送字節(jié)數(shù)等。根據(jù)接收者是否為發(fā)送者來(lái)決定使用SR還是RR包,活動(dòng)源在發(fā)出最后一個(gè)數(shù)據(jù)包之后或前一個(gè)數(shù)據(jù)包與下一個(gè)數(shù)據(jù)包間隔期間發(fā)送SR;否則,就發(fā)送RR;SR和RR包都可沒有接收?qǐng)?bào)告塊也可以包括多個(gè)接收?qǐng)?bào)告塊,其發(fā)布報(bào)告表示的源不一定是在CSRC列表上的起作用的源,每個(gè)接收?qǐng)?bào)告塊提供從特殊源接收數(shù)據(jù)的統(tǒng)計(jì)。最大可有31個(gè)接收?qǐng)?bào)告塊嵌入在SR 或 RR包 中,丟失包累計(jì)數(shù)差別給出間隔期間丟包的數(shù)量,而系列號(hào)的差別給出間隔期間希望發(fā)送的包數(shù)量,兩者之比等于經(jīng)過間隔期間包丟失百分比。從發(fā)送者信息,第三 方監(jiān)控器可計(jì)算載荷平均數(shù)據(jù)速率與沒收到數(shù)據(jù)間隔的平均包速率,兩者比值給出平均載荷大小。如假設(shè)包丟失與包大小無(wú)關(guān),那么特殊接收者收到的包數(shù)量給出此 接收者收到的表觀流量。
SDES源描述包
SDES源描述包提供了直觀的文本信息來(lái)描述會(huì)話的參加者,包括CNAME、NAME、EMAIL、PHONE、LOC等源描述項(xiàng),這些為接收方獲取發(fā)送方的有關(guān)信息提供了方便。SDES 包由包頭與數(shù)據(jù)塊組成,數(shù)據(jù)塊可以沒有,也可有多個(gè)。包頭由版本(V)、填充(P)、長(zhǎng)度指示、包類型(PT)和源計(jì)數(shù)(SC)組成。PT占8位,用于識(shí)別RTCP的SDES包,SC占5位,指示包含在SDES包中的SSRC/CSRC塊數(shù)量,零值有效,但沒有意義。數(shù)據(jù)塊由源描述項(xiàng)組成,源描述項(xiàng)的內(nèi)容如下:
CNAME: 規(guī)范終端標(biāo)識(shí)SDES項(xiàng)
類似SSRC標(biāo)識(shí),RTCP為RTP連接中每一個(gè)參加者賦予唯一一個(gè)CNAME標(biāo)識(shí)。在發(fā)生沖突或重啟程序時(shí),由于隨機(jī)分配的SSRC標(biāo)識(shí)可能發(fā)生變化,CNAME項(xiàng)可以提供從SSRC標(biāo)識(shí)到仍為常量的源標(biāo)識(shí)的綁定。
為方便第三方監(jiān)控,CNAME應(yīng)適合程序或人員定位源。
NAME:用戶名稱SDES項(xiàng)
這是用于描述源的真正的名稱,如"John Doe, Bit Recycler, Megacorp",可以是用戶想要的任意形式。由于采用文本信息來(lái)描述,對(duì)諸如會(huì)議應(yīng)用,可以對(duì)參加者直接列表顯示,NAME項(xiàng)是除CNAME項(xiàng)以外發(fā)送最頻繁的項(xiàng)目。NAME值在一次RTP會(huì)話期間應(yīng)該保持為常數(shù),但它不該成為連接的所有參加者中唯一依賴。
EMAIL:電子郵件地址SDES項(xiàng)
郵件地址格式由RFC822規(guī)定,如"John.Doe@megacorp.com"。一次RTP會(huì)話期間,EMAIL項(xiàng)的內(nèi)容希望保持不變。
PHONE:電話號(hào)碼SDES項(xiàng)
電話號(hào)碼應(yīng)帶有加號(hào),代替國(guó)際接入代碼,如"+1 908 555 1212"即為美國(guó)電話號(hào)碼。
LOC:用戶地理位置SDES項(xiàng)
根據(jù)應(yīng)用,此項(xiàng)具有不同程度的細(xì)節(jié)。對(duì)會(huì)議應(yīng)用,字符串如"Murray Hill, New Jersey"就足夠了。然而,對(duì)活動(dòng)標(biāo)記系統(tǒng),字符串如"Room 2A244, AT&T BL MH"也許就適用。細(xì)節(jié)留給實(shí)施或用戶,但格式和內(nèi)容可用設(shè)置指示。在一次RTP會(huì)話期間,除移動(dòng)主機(jī)外,LOC值期望保持不變。
TOOL:應(yīng)用或工具名稱SDES項(xiàng)
TOOL項(xiàng)包含一個(gè)字符串,表示產(chǎn)生流的應(yīng)用的名稱與版本,如"videotool 1.2"。這部分信息對(duì)調(diào)試很有用,類似于郵件或郵件系統(tǒng)版本SMTP頭。TOOL值在一次RTP會(huì)話期間保持不變。
NOTE: 通知/狀態(tài)SDES項(xiàng)
NOTE 項(xiàng)旨在描述源當(dāng)前狀態(tài)的過渡信息,如"on the phone, can't talk",或在講座期間用于傳送談話的題目,它的語(yǔ)法可在設(shè)置中顯式定義。NOTE項(xiàng)一般只用于攜帶例外信息,而不應(yīng)包含在全部參加者中,因?yàn)檫@將降低接收?qǐng)?bào)告和CNAME發(fā)送的速度,損害協(xié)議的性能。一般NOTE 項(xiàng)不作為用戶設(shè)置文件的項(xiàng)目,也不會(huì)自動(dòng)產(chǎn)生。
由于NOTE項(xiàng)對(duì)顯示很重要,當(dāng)會(huì)話的參加者處于活動(dòng)狀態(tài)時(shí),其它非CNAME項(xiàng)(如NAME)傳輸速率將會(huì)降低,結(jié)果使NOTE項(xiàng)占用RTCP部分帶寬。若過渡信息不活躍,NOTE項(xiàng)繼續(xù)以同樣的速度重復(fù)發(fā)送幾次,并以一個(gè)串長(zhǎng)為零的字符串通知接收者。
PRIV: 專用擴(kuò)展SDES項(xiàng)
PRIV項(xiàng)用于定義實(shí)驗(yàn)或應(yīng)用特定的SDES擴(kuò)展,它由長(zhǎng)字符串對(duì)組成的前綴,后跟填充該項(xiàng)其他部分和攜帶所需信息的字符串值組成。前綴長(zhǎng)度段為8位。前綴字符串是定義PRIV項(xiàng)人員選擇的名稱,唯一對(duì)應(yīng)應(yīng)用接收到的其它PRIV項(xiàng)。應(yīng)用實(shí)現(xiàn)者可選擇使用應(yīng)用名稱,如有必要,外加附加子類型標(biāo)識(shí)。另外,推薦其它人根據(jù)其代表的實(shí)體選擇名稱,然后,在實(shí)體內(nèi)部協(xié)調(diào)名稱的使用。
注意,前綴應(yīng)盡可能的短。SDES 的PRIV項(xiàng)前綴沒在IANA處注冊(cè)。如證實(shí)某些形式的PRIV項(xiàng)具有通用性, IANA應(yīng)給它分配一個(gè)正式的SDES項(xiàng)類型,這樣就不再需要前綴,從而簡(jiǎn)化應(yīng)用,并提高傳輸?shù)男省?/span>
BYE斷開RTCP包
如混合器接收到一個(gè)BYE包,混合器轉(zhuǎn)發(fā)BYE包,而不改變SSRC/CSRC 標(biāo)識(shí)。如混合器關(guān)閉,在關(guān)閉之前它應(yīng)該發(fā)出一個(gè)BYE包,列出混合器處理的所有源,而不只是自己的SSRC標(biāo)識(shí)。作為可選項(xiàng),BYE包可包括一個(gè)8位八進(jìn)制計(jì)數(shù),后跟文本信息,表示離開原因,如:"camera malfunction"或"RTP loop detected"。字符串的編碼與在SDES 項(xiàng)中所描述的相同。如字符串信息至BYE包下32位邊界結(jié)束處,字符串就不以空結(jié)尾;否則,BYE包以空八進(jìn)制填充。
APP特殊應(yīng)用包
APP包用于開發(fā)新應(yīng)用和新特征的實(shí)驗(yàn),不要求注冊(cè)包類型值。帶有不可識(shí)別名稱的APP包應(yīng)被忽略掉。測(cè)試后,如確定應(yīng)用廣泛,推薦重新定義每個(gè)APP包,而不用向IANA注冊(cè)子類型和名稱段。
總結(jié)
以上是生活随笔為你收集整理的流媒体服务器开发笔记(2)--RTCP协议介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android四大组之ContentPr
- 下一篇: Javascript中闭包的作用域链