RTP協(xié)議分析 第1章. RTP概述1.1. RTP是什么RTP全名是Real-time Transport Protocol(實時傳輸協(xié)議)。它是IETF提出的一個標(biāo)準(zhǔn),對應(yīng)的RFC文檔為RFC3550(RFC1889為其過期版本)。RFC3550不僅定義了RTP,而且定義了配套的相關(guān)協(xié)議RTCP(Real-time Transport Control Protocol,即實時傳輸控制協(xié)議)。RTP用來為IP網(wǎng)上的語音、圖像、傳真等多種需要實時傳輸?shù)亩嗝襟w數(shù)據(jù)提供端到端的實時傳輸服務(wù)。RTP為Internet上端到端的實時傳輸提供時間信息和流同步,但并不保證服務(wù)質(zhì)量,服務(wù)質(zhì)量由RTCP來提供。 1.2. RTP的應(yīng)用環(huán)境RTP用于在單播或多播網(wǎng)絡(luò)中傳送實時數(shù)據(jù)。它們典型的應(yīng)用場合有如下幾個。 簡單的多播音頻會議。語音通信通過一個多播地址和一對端口來實現(xiàn)。一個用于音頻數(shù)據(jù)(RTP),另一個用于控制包(RTCP)。 音頻和視頻會議。如果在一次會議中同時使用了音頻和視頻會議,這兩種媒體將分別在不同的RTP會話中傳送,每一個會話使用不同的傳輸?shù)刂罚?/span>IP地址+端口)。如果一個用戶同時使用了兩個會話,則每個會話對應(yīng)的RTCP包都使用規(guī)范化名字CNAME(Canonical Name)。與會者可以根據(jù)RTCP包中的CNAME來獲取相關(guān)聯(lián)的音頻和視頻,然后根據(jù)RTCP包中的計時信息(Network time protocol)來實現(xiàn)音頻和視頻的同步。 翻譯器和混合器。翻譯器和混合器都是RTP級的中繼系統(tǒng)。翻譯器用在通過IP多播不能直接到達(dá)的用戶區(qū),例如發(fā)送者和接收者之間存在防火墻。當(dāng)與會者能接收的音頻編碼格式不一樣,比如有一個與會者通過一條低速鏈路接入到高速會議,這時就要使用混合器。在進(jìn)入音頻數(shù)據(jù)格式需要變化的網(wǎng)絡(luò)前,混合器將來自一個源或多個源的音頻包進(jìn)行重構(gòu),并把重構(gòu)后的多個音頻合并,采用另一種音頻編碼進(jìn)行編碼后,再轉(zhuǎn)發(fā)這個新的RTP包。從一個混合器出來的所有數(shù)據(jù)包要用混合器作為它們的同步源(SSRC,見RTP的封裝)來識別,可以通過貢獻(xiàn)源列表(CSRC表,見RTP的封裝)可以確認(rèn)談話者。 1.3. 相關(guān)概念1.3.1. 流媒體流媒體是指Internet上使用流式傳輸技術(shù)的連續(xù)時基媒體。當(dāng)前在Internet上傳輸音頻和視頻等信息主要有兩種方式:下載和流式傳輸兩種方式。 下載情況下,用戶需要先下載整個媒體文件到本地,然后才能播放媒體文件。在視頻直播等應(yīng)用場合,由于生成整個媒體文件要等直播結(jié)束,也就是用戶至少要在直播結(jié)束后才能看到直播節(jié)目,所以用下載方式不能實現(xiàn)直播。 流式傳輸是實現(xiàn)流媒體的關(guān)鍵技術(shù)。使用流式傳輸可以邊下載邊觀看流媒體節(jié)目。由于Internet是基于分組傳輸?shù)?,所以接收端收到的?shù)據(jù)包往往有延遲和亂序(流式傳輸構(gòu)建在UDP上)。要實現(xiàn)流式傳輸,就是要從降低延遲和恢復(fù)數(shù)據(jù)包時序入手。在發(fā)送端,為降低延遲,往往對傳輸數(shù)據(jù)進(jìn)行預(yù)處理(降低質(zhì)量和高效壓縮)。在接收端為了恢復(fù)時序,采用了接收緩沖;而為了實現(xiàn)媒體的流暢播放,則采用了播放緩沖。 使用接收緩沖,可以將接收到的數(shù)據(jù)包緩存起來,然后根據(jù)數(shù)據(jù)包的封裝信息(如包序號和時戳等),將亂序的包重新排序,最后將重新排序了的數(shù)據(jù)包放入播放緩沖播放。 為什么需要播放緩沖呢?容易想到,由于網(wǎng)絡(luò)不可能很理想,并且對數(shù)據(jù)包排序需要處理時耗,我們得到排序好的數(shù)據(jù)包的時間間隔是不等的。如果不用播放緩沖,那么播放節(jié)目會很卡,這叫時延抖動。相反,使用播放緩沖,在開始播放時,花費幾十秒鐘先將播放緩沖填滿(例如PPLIVE),可以有效地消除時延抖動,從而在不太損失實時性的前提下實現(xiàn)流媒體的順暢播放。 到目前為止,Internet 上使用較多的流式視頻格式主要有以下三種:RealNetworks 公司的RealMedia ,Apple 公司的QuickTime 以及Microsoft 公司的Advanced Streaming Format (ASF) 。 上面在談接收緩沖時,說到了流媒體數(shù)據(jù)包的封裝信息(包序號和時戳等),這在后面的RTP封裝中會有體現(xiàn)。另外,RealMedia這些流式媒體格式只是編解碼有不同,但對于RTP來說,它們都是待封裝傳輸?shù)牧髅襟w數(shù)據(jù)而沒有什么不同。 第2章. RTP詳解2.1. RTP的協(xié)議層次2.1.1. 傳輸層的子層RTP(實時傳輸協(xié)議),顧名思義它是用來提供實時傳輸?shù)?,因而可以看成是傳輸層的一個子層。圖 1給出了流媒體應(yīng)用中的一個典型的協(xié)議體系結(jié)構(gòu)。 圖 1 流媒體體系結(jié)構(gòu) 從圖中可以看出,RTP被劃分在傳輸層,它建立在UDP上。同UDP協(xié)議一樣,為了實現(xiàn)其實時傳輸功能,RTP也有固定的封裝形式。RTP用來為端到端的實時傳輸提供時間信息和流同步,但并不保證服務(wù)質(zhì)量。服務(wù)質(zhì)量由RTCP來提供。這些特點,在第4章可以看到。 2.1.2. 應(yīng)用層的一部分不少人也把RTP歸為應(yīng)用層的一部分,這是從應(yīng)用開發(fā)者的角度來說的。操作系統(tǒng)中的TCP/IP等協(xié)議棧所提供的是我們最常用的服務(wù),而RTP的實現(xiàn)還是要靠開發(fā)者自己。因此從開發(fā)的角度來說,RTP的實現(xiàn)和應(yīng)用層協(xié)議的實現(xiàn)沒不同,所以可將RTP看成應(yīng)用層協(xié)議。 RTP實現(xiàn)者在發(fā)送RTP數(shù)據(jù)時,需先將數(shù)據(jù)封裝成RTP包,而在接收到RTP數(shù)據(jù)包,需要將數(shù)據(jù)從RTP包中提取出來。 2.2. RTP的封裝一個協(xié)議的封裝是為了滿足協(xié)議的功能需求的。從前面提出的功能需求,可以推測出RTP封裝中應(yīng)該有同步源和時戳等字段,但更為完整的封裝是什么樣子呢?請看圖2。 圖 2 RTP的頭部格式 版本號(V):2比特,用來標(biāo)志使用的RTP版本。 填充位(P):1比特,如果該位置位,則該RTP包的尾部就包含附加的填充字節(jié)。 擴(kuò)展位(X):1比特,如果該位置位的話,RTP固定頭部后面就跟有一個擴(kuò)展頭部。 CSRC計數(shù)器(CC):4比特,含有固定頭部后面跟著的CSRC的數(shù)目。 標(biāo)記位(M):1比特,該位的解釋由配置文檔(Profile)來承擔(dān). 載荷類型(PT):7比特,標(biāo)識了RTP載荷的類型。 序列號(SN):16比特,發(fā)送方在每發(fā)送完一個RTP包后就將該域的值增加1,接收方可以由該域檢測包的丟失及恢復(fù)包序列。序列號的初始值是隨機(jī)的。 時間戳:32比特,記錄了該包中數(shù)據(jù)的第一個字節(jié)的采樣時刻。在一次會話開始時,時間戳初始化成一個初始值。即使在沒有信號發(fā)送時,時間戳的數(shù)值也要隨時間而不斷地增加(時間在流逝嘛)。時間戳是去除抖動和實現(xiàn)同步不可缺少的。 同步源標(biāo)識符(SSRC):32比特,同步源就是指RTP包流的來源。在同一個RTP會話中不能有兩個相同的SSRC值。該標(biāo)識符是隨機(jī)選取的 RFC1889推薦了MD5隨機(jī)算法。 貢獻(xiàn)源列表(CSRC List):0~15項,每項32比特,用來標(biāo)志對一個RTP混合器產(chǎn)生的新包有貢獻(xiàn)的所有RTP包的源。由混合器將這些有貢獻(xiàn)的SSRC標(biāo)識符插入表中。SSRC標(biāo)識符都被列出來,以便接收端能正確指出交談雙方的身份。 2.3. RTCP的封裝RTP需要RTCP為其服務(wù)質(zhì)量提供保證,因此下面介紹一下RTCP的相關(guān)知識。 RTCP的主要功能是:服務(wù)質(zhì)量的監(jiān)視與反饋、媒體間的同步,以及多播組中成員的標(biāo)識。在RTP會話期 間,各參與者周期性地傳送RTCP包。RTCP包中含有已發(fā)送的數(shù)據(jù)包的數(shù)量、丟失的數(shù)據(jù)包的數(shù)量等統(tǒng)計資料,因此,各參與者可以利用這些信息動態(tài)地改變傳輸速率,甚至改變有效載荷類型。RTP和RTCP配合使用,它們能以有效的反饋和最小的開銷使傳輸效率最佳化,因而特別適合傳送網(wǎng)上的實時數(shù)據(jù)。 從圖 1可以看到,RTCP也是用UDP來傳送的,但RTCP封裝的僅僅是一些控制信息,因而分組很短,所以可以將多個RTCP分組封裝在一個UDP包中。RTCP有如下五種分組類型。
表 1 RTCP的5種分組類型 上述五種分組的封裝大同小異,下面只講述SR類型,而其它類型請參考RFC3550。 發(fā)送端報告分組SR(Sender Report)用來使發(fā)送端以多播方式向所有接收端報告發(fā)送情況。SR分組的主要內(nèi)容有:相應(yīng)的RTP流的SSRC,RTP流中最新產(chǎn)生的RTP分組的時間戳和NTP,RTP流包含的分組數(shù),RTP流包含的字節(jié)數(shù)。SR包的封裝如圖3所示。 圖 3 RTCP頭部的格式 版本(V):同RTP包頭域。 填充(P):同RTP包頭域。 接收報告計數(shù)器(RC):5比特,該SR包中的接收報告塊的數(shù)目,可以為零。 包類型(PT):8比特,SR包是200。 長度域(Length):16比特,其中存放的是該SR包以32比特為單位的總長度減一。 同步源(SSRC):SR包發(fā)送者的同步源標(biāo)識符。與對應(yīng)RTP包中的SSRC一樣。 NTP Timestamp(Network time protocol)SR包發(fā)送時的絕對時間值。NTP的作用是同步不同的RTP媒體流。 RTP Timestamp:與NTP時間戳對應(yīng),與RTP數(shù)據(jù)包中的RTP時間戳具有相同的單位和隨機(jī)初始值。 Sender’s packet count:從開始發(fā)送包到產(chǎn)生這個SR包這段時間里,發(fā)送者發(fā)送的RTP數(shù)據(jù)包的總數(shù). SSRC改變時,這個域清零。 Sender`s octet count:從開始發(fā)送包到產(chǎn)生這個SR包這段時間里,發(fā)送者發(fā)送的凈荷數(shù)據(jù)的總字節(jié)數(shù)(不包括頭部和填充)。發(fā)送者改變其SSRC時,這個域要清零。 同步源n的SSRC標(biāo)識符:該報告塊中包含的是從該源接收到的包的統(tǒng)計信息。 丟失率(Fraction Lost):表明從上一個SR或RR包發(fā)出以來從同步源n(SSRC_n)來的RTP數(shù)據(jù)包的丟失率。 累計的包丟失數(shù)目:從開始接收到SSRC_n的包到發(fā)送SR,從SSRC_n傳過來的RTP數(shù)據(jù)包的丟失總數(shù)。 收到的擴(kuò)展最大序列號:從SSRC_n收到的RTP數(shù)據(jù)包中最大的序列號, 接收抖動(Interarrival jitter):RTP數(shù)據(jù)包接受時間的統(tǒng)計方差估計 上次SR時間戳(Last SR,LSR):取最近從SSRC_n收到的SR包中的NTP時間戳的中間32比特。如果目前還沒收到SR包,則該域清零。 上次SR以來的延時(Delay since last SR,DLSR):上次從SSRC_n收到SR包到發(fā)送本報告的延時。 2.4. RTP的會話過程當(dāng)應(yīng)用程序建立一個RTP會話時,應(yīng)用程序?qū)⒋_定一對目的傳輸?shù)刂?。目的傳輸?shù)刂酚梢粋€網(wǎng)絡(luò)地址和一對端口組成,有兩個端口:一個給RTP包,一個給RTCP包,使得RTP/RTCP數(shù)據(jù)能夠正確發(fā)送。RTP數(shù)據(jù)發(fā)向偶數(shù)的UDP端口,而對應(yīng)的控制信號RTCP數(shù)據(jù)發(fā)向相鄰的奇數(shù)UDP端口(偶數(shù)的UDP端口+1),這樣就構(gòu)成一個UDP端口對。 RTP的發(fā)送過程如下,接收過程則相反。 1) RTP協(xié)議從上層接收流媒體信息碼流(如H.263),封裝成RTP數(shù)據(jù)包;RTCP從上層接收控制信息,封裝成RTCP控制包。 2) RTP將RTP 數(shù)據(jù)包發(fā)往UDP端口對中偶數(shù)端口;RTCP將RTCP控制包發(fā)往UDP端口對中的接收端口。 第3章. 相關(guān)的協(xié)議3.1. 實時流協(xié)議RTSP實時流協(xié)議RTSP(Real-Time Streaming Protocol)是IETF提出的協(xié)議,對應(yīng)的RFC文檔為RFC2362。 從圖 1可以看出,RTSP是一個應(yīng)用層協(xié)議(TCP/IP網(wǎng)絡(luò)體系中)。它以C/S模式工作,它是一個多媒體播放控制協(xié)議,主要用來使用戶在播放流媒體時可以像操作本地的影碟機(jī)一樣進(jìn)行控制,即可以對流媒體進(jìn)行暫停/繼續(xù)、后退和前進(jìn)等控制。 3.2. 資源預(yù)定協(xié)議RSVP資源預(yù)定協(xié)議RSVP(Resource Reservation Protocol)是IETF提出的協(xié)議,對應(yīng)的RFC文檔為RFC2208。 從圖 1可以看出,RSVP工作在IP層之上傳輸層之下,是一個網(wǎng)絡(luò)控制協(xié)議。RSVP通過在路由器上預(yù)留一定的帶寬,能在一定程度上為流媒體的傳輸提供服務(wù)質(zhì)量。在某些試驗性的系統(tǒng)如網(wǎng)絡(luò)視頻會議工具vic中就集成了RSVP。 第4章. 常見的疑問4.1. 怎樣重組亂序的數(shù)據(jù)包可以根據(jù)RTP包的序列號來排序。 4.2. 怎樣獲得數(shù)據(jù)包的時序可以根據(jù)RTP包的時間戳來獲得數(shù)據(jù)包的時序。 4.3. 聲音和圖像怎么同步根據(jù)聲音流和圖像流的相對時間(即RTP包的時間戳),以及它們的絕對時間(即對應(yīng)的RTCP包中的RTCP),可以實現(xiàn)聲音和圖像的同步。 4.4. 接收緩沖和播放緩沖的作用如1.3.1所述,接收緩沖用來排序亂序了的數(shù)據(jù)包;播放緩沖用來消除播放的抖動,實現(xiàn)等時播放。 第5章. 實現(xiàn)方案
表 2 協(xié)議分析要求 表 2給出了協(xié)議分析要求。容易看出要獲取RTP音頻包中的音頻信息很容易,直接將RTP包的包頭去掉即可。當(dāng)然,要成功地播放解碼獲取到的音頻流,需要知道其編碼,這可從RTP包包頭的有效載荷類型字段(PT)獲得。 第6章. 參考資料[1] RFC文檔:RFC3550對應(yīng)RTP/RTCP,RFC2362對應(yīng)RTSP,RFC2208對應(yīng)RSVP [2] http://www./rfcs/,上面有全面的英文RFC文檔 [3] http://www./,有不少協(xié)議分析文檔,也有中文RFC文檔,但質(zhì)量不是特別高。 |
|