流(Streaming)是近年在Internet上出現(xiàn)的新概念,其定義非常廣泛,主要是指通過網(wǎng)絡(luò)傳輸多媒體數(shù)據(jù)的技術(shù)總稱。
流式傳輸分為兩種
實(shí)時(shí)流式傳輸是實(shí)時(shí)傳送,特別適合現(xiàn)場事件?!皩?shí)時(shí)”是指在一個(gè)應(yīng)用中數(shù)據(jù)的交付必須與數(shù)據(jù)的產(chǎn)生保持精確的時(shí)間關(guān)系,這需要相應(yīng)的協(xié)議支持,這樣RTP和RTCP就相應(yīng)的出現(xiàn)了。
RTP全名:Real-time Transport Protocol(實(shí)時(shí)傳輸協(xié)議)。它是IETF提出的一個(gè)標(biāo)準(zhǔn),對(duì)應(yīng)的RFC文檔為RFC3550。
詳細(xì)的協(xié)議參考:
鏈接:https://pan.baidu.com/s/10fMJI8AQFZAqvUChBpVD_g
提取碼:rd1v
RTP協(xié)議原理:較簡單,負(fù)責(zé)對(duì)流媒體數(shù)據(jù)進(jìn)行封包并實(shí)現(xiàn)媒體流的實(shí)時(shí)傳輸,即它按照RPT數(shù)據(jù)包格式來封裝流媒體數(shù)據(jù),并利用與它綁定的協(xié)議進(jìn)行數(shù)據(jù)包的傳輸。
RTCP原理:向會(huì)話中的所有成員周期性地發(fā)送控制包來實(shí)現(xiàn)的,應(yīng)用程序通過接收這些控制數(shù)據(jù)包,從中獲取會(huì)話參與者的相關(guān)資料,以及網(wǎng)絡(luò)狀況、分組丟失概率等反饋信息,從而能夠?qū)Ψ?wù)質(zhì)量進(jìn)行控制或者對(duì)網(wǎng)絡(luò)狀況進(jìn)行診斷。
RTP在端口號(hào)1025到65535之間選擇一個(gè)未使用的偶數(shù)UDP端口號(hào),而在同一次會(huì)話中的RTCP則使用下一個(gè)基數(shù)UDP端口號(hào)。
默認(rèn)端口號(hào): RTP:5004 RTCP:5005
從下圖可看出RTP被劃分在傳輸層,它建立在UDP上。同UDP協(xié)議一樣,為了實(shí)現(xiàn)其實(shí)時(shí)傳輸功能,RTP也有固定的封裝形式。RTP用來為端到端的實(shí)時(shí)傳輸提供時(shí)間信息和流同步,但并不保證服務(wù)質(zhì)量。服務(wù)質(zhì)量由RTCP來提供。
多媒體處理流程
從開發(fā)者的角度看,RTP 應(yīng)當(dāng)是應(yīng)用層的一部分。
RTP實(shí)現(xiàn)者在發(fā)送RTP數(shù)據(jù)時(shí),需先將數(shù)據(jù)封裝成RTP包,而在接收到RTP數(shù)據(jù)包,需要將數(shù)據(jù)從RTP包中提取出來。
下圖為RTP部格式:
*****************************************************
1) V:RTP協(xié)議的版本號(hào),占2位,當(dāng)前協(xié)議版本號(hào)為2
2) P:填充標(biāo)志,占1位,如果P=1,則在該報(bào)文的尾部填充一個(gè)或多個(gè)額外的八位組,它們不是有效載荷的一部分。
3) X:擴(kuò)展標(biāo)志,占1位,如果X=1,則在RTP報(bào)頭后跟有一個(gè)擴(kuò)展報(bào)頭
4) CC:CSRC計(jì)數(shù)器,占4位,指示CSRC 標(biāo)識(shí)符的個(gè)數(shù)(作用信源CSRC計(jì)數(shù)器)
5) M: 標(biāo)記,占1位,不同的有效載荷有不同的含義,對(duì)于視頻,標(biāo)記一幀的結(jié)束;對(duì)于音頻,標(biāo)記會(huì)話的開始。(對(duì)于分組中的重要事件可用該位標(biāo)識(shí))
6) PT: 有效荷載類型,占7位,用于說明RTP報(bào)文中有效載荷的類型,如GSM音頻、JPEM圖像等,在流媒體中大部分是用來區(qū)分音頻流和視頻流的,這樣便于客戶端進(jìn)行解析。
詳細(xì)參考:https://blog.csdn.net/qq_40732350/article/details/88374707
7) 序列號(hào):占16位,用于標(biāo)識(shí)發(fā)送者所發(fā)送的RTP報(bào)文的序列號(hào),每發(fā)送一個(gè)報(bào)文,序列號(hào)增1。這個(gè)字段當(dāng)下層的承載協(xié)議用UDP的時(shí)候,網(wǎng)絡(luò)狀況不好的時(shí)候可以用來檢查丟包。同時(shí)出現(xiàn)網(wǎng)絡(luò)抖動(dòng)的情況可以用來對(duì)數(shù)據(jù)進(jìn)行重新排序,序列號(hào)的初始值是隨機(jī)的,同時(shí)音頻包和視頻包的sequence是分別記數(shù)的。
8) 時(shí)戳(Timestamp):占32位,必須使用90 kHz 時(shí)鐘頻率。時(shí)戳反映了該RTP報(bào)文的第一個(gè)八位組的采樣時(shí)刻。接收者使用時(shí)戳來計(jì)算延遲和延遲抖動(dòng),并進(jìn)行同步控制。
9) 同步信源(SSRC)標(biāo)識(shí)符:占32位,用于標(biāo)識(shí)同步信源。該標(biāo)識(shí)符是隨機(jī)選擇的,參加同一視頻會(huì)議的兩個(gè)同步信源不能有相同的SSRC。
10) 特約信源(CSRC)標(biāo)識(shí)符:每個(gè)CSRC標(biāo)識(shí)符占32位,可以有0~15個(gè)。每個(gè)CSRC標(biāo)識(shí)了包含在該RTP報(bào)文有效載荷中的所有特約信源。
注:基本的RTP說明并不定義任何頭擴(kuò)展本身,如果遇到X=1,需要特殊處理
取一段碼流如下:
80 e0 00 1e 00 00 d2 f0 00 00 00 00 41 9b 6b 49 €?....??....A?kI
e1 0f 26 53 02 1a ff06 59 97 1d d2 2e 8c 50 01 ?.&S....Y?.?.?P.
cc 13 ec 52 77 4e e50e 7b fd 16 11 66 27 7c b4 ?.?RwN?.{?..f'|?
f6 e1 29 d5 d6 a4 ef3e 12 d8 fd 6c 97 51 e7 e9 ??)????>.??l?Q??
cfc7 5e c8 a9 51 f6 82 65 d6 48 5a 86 b0 e0 8c ??^??Q??e?HZ????
其中,
80 是V_P_X_CC
e0 是M_PT
00 1e 是SequenceNum
00 00 d2 f0 是Timestamp
00 00 00 00是SSRC
把前兩字節(jié)換成二進(jìn)制如下
1000 0000 1110 0000
按順序解釋如下:
10 是V;
0 是P;
0 是X;
0000 是CC;
1 是M;
110 0000 是PT;
*****************************************************
有效載荷類型:7位,指出后面的RTP數(shù)據(jù)屬于何種格式的應(yīng)用。應(yīng)用層可根據(jù)次類型進(jìn)行處理。
音頻:μ律PCM(0),GMS(3) A律PCM(8),G.722(9),G728(1)
視頻:活動(dòng)JPEG(26)、H.261(31)、 MPEG1(32)、MPEG2(33)、H.264(96)等
RTCP的主要功能
RTCP也是用UDP來傳送的,但RTCP封裝的僅僅是一些控制信息,因而分組很短,所以可以將多個(gè)RTCP分組封裝在一個(gè)UDP包中。RTCP有如下五種分組類型:
發(fā)送端報(bào)告分組SR(Sender Report)用來使發(fā)送端以多播方式向所有接收端報(bào)告發(fā)送情況。SR分組的主要內(nèi)容有:相應(yīng)的RTP流的SSRC,RTP流中最新產(chǎn)生的RTP分組的時(shí)間戳和NTP,RTP流包含的分組數(shù),RTP流包含的字節(jié)數(shù)。
****************************************************************************************************
時(shí)間戳(1)
時(shí)間戳字段是RTP首部中說明數(shù)據(jù)包時(shí)間的同步信息,是數(shù)據(jù)能以正確的時(shí)間順序恢復(fù)的關(guān)鍵。
時(shí)間戳的值給出了分組中數(shù)據(jù)的第一個(gè)字節(jié)的采樣時(shí)間,要求發(fā)送方時(shí)間戳的時(shí)鐘是連續(xù)、單調(diào)增長的,即使在沒有數(shù)據(jù)輸入或發(fā)送數(shù)據(jù)時(shí)也是如此。
在靜默時(shí),發(fā)送方不必發(fā)送數(shù)據(jù),保持時(shí)間戳的增長,在接收端,由于接收到的數(shù)據(jù)分組的序號(hào)沒有丟失,就知道沒有發(fā)生數(shù)據(jù)丟失,而且只要比較前后分組的時(shí)間戳的差異,就可以確定輸出的時(shí)間間隔。
時(shí)間戳(2)
RTCP 中的 SR (Sender Report發(fā)送端報(bào)告)控制分組包含NTP(網(wǎng)絡(luò)時(shí)間)時(shí)間戳和RTP時(shí)間戳可用于同步音視頻媒體流。
RTP時(shí)間戳是依據(jù)鄰近的RTP數(shù)據(jù)包中的時(shí)間戳結(jié)合NTP時(shí)間差得到的。
公式表達(dá)為:RTP_tsi = tsi + NTPi - NTP'i
RTP_tsi表示RTCP中的RTP時(shí)間戳;tsi表示鄰近的RTP包中的時(shí)間戳;NTPi表示RTCP的網(wǎng)絡(luò)時(shí)間戳;NTP'i表示鄰近的RTP包對(duì)應(yīng)的網(wǎng)絡(luò)時(shí)間戳;下標(biāo)表示第i個(gè)源。
時(shí)間戳(3)
因此,i和源j之間的相對(duì)時(shí)差可以表示為:
- RTP_tsi - RTP_tsj = ( tsi + NTPi - NTP'i ) - ( tsj + NTPj - NTP'j )
- (RTP_tsi – tsi)-( RTP_tsj - tsj) = (NTPi –NTP'i) - (NTPj—NTP'j)
由于NTP同步,差值可以反映出兩個(gè)源的相對(duì)時(shí)差。因?yàn)橐讲煌瑏碓吹拿襟w流,必須使得同步他們的絕對(duì)時(shí)間基準(zhǔn),而NTP時(shí)間戳正是這樣的絕對(duì)時(shí)間基準(zhǔn)。
應(yīng)用RTP時(shí)間戳來保證同一來源的媒體流同步。
****************************************************************************************************
時(shí)延
影響時(shí)延的因素有多個(gè)方面:
其中有些是固定時(shí)延,如編解碼網(wǎng)絡(luò)速率等;有些是變化的,如防抖動(dòng)緩沖等,固定的時(shí)延可以通過改變編解碼方式和提高網(wǎng)絡(luò)速率來改變,而變化時(shí)延通常采用提高轉(zhuǎn)發(fā)效率來提高。
****************************************************************************************************
抖動(dòng)
到達(dá)時(shí)刻抖動(dòng)J的定義:一對(duì)包中接收機(jī)相對(duì)發(fā)射機(jī)的時(shí)間跨度差值的平均偏差。
該值等于兩個(gè)包相對(duì)傳輸時(shí)間的差值,相對(duì)傳輸時(shí)間是指包的RTP時(shí)間標(biāo)志和到達(dá)時(shí)刻接收機(jī)時(shí)鐘,以同一單位的差值.若Si是包i的RTP時(shí)間標(biāo)志,Ri是包i以RTP時(shí)間標(biāo)志單位的到達(dá)時(shí)刻值。對(duì)于兩個(gè)包i和j,D可以表達(dá)為
D(i,j) = (Rj - Ri) - (Sj - Si) = (Rj - Sj) - (Ri - Si)
到達(dá)時(shí)刻抖動(dòng)可以在收到從源SSRC_n來的每個(gè)數(shù)據(jù)包i后連續(xù)計(jì)算,利用該包和前一包i-1的偏差D。
根據(jù)公式J(i) = J(i-1) + (|D(i-1,i)| - J(i-1))/16計(jì)算
****************************************************************************************************
丟包率
丟包率是通過計(jì)算接收包數(shù)量和發(fā)送包數(shù)量的比率得到。
流程
發(fā)送方:每間隔一定時(shí)間讀取每個(gè)發(fā)送通道的發(fā)包數(shù)量和數(shù)據(jù)長度,組成一個(gè)此通道的RTCP報(bào)文發(fā)送給接收方,同時(shí)將發(fā)送數(shù)據(jù)包計(jì)數(shù)清零。
接收方:收到RTCP包后,讀取接收通道接收到的包數(shù)量,并計(jì)算出丟包率,通過一個(gè)RTCP接收匯報(bào)包發(fā)送給發(fā)送方,同時(shí)對(duì)接收數(shù)據(jù)包計(jì)數(shù)清零。
****************************************************************************************************
會(huì)話和流兩級(jí)分化
一個(gè)RTP會(huì)話包括傳給某個(gè)指定目的地對(duì)的所有通信量,發(fā)送方可能包括多個(gè)。而從同一個(gè)同步源發(fā)出的RTP分組序列稱為流(Stream),一個(gè)RTP會(huì)話可能包含多個(gè)RTP流。
一個(gè)RTP分組在服務(wù)器端發(fā)送出去的時(shí)候總是要指定屬于哪個(gè)會(huì)話和流,在接收時(shí)也需要進(jìn)行兩級(jí)分用,即會(huì)話分用和流分用。
只有當(dāng)RTP使用同步源標(biāo)識(shí)和分組類型把同一個(gè)流中的分組組合起來,才能夠使用序列號(hào)和時(shí)間戳對(duì)分組進(jìn)行排序和正確回放。
RTP協(xié)議應(yīng)用方案——單播
在客戶端與媒體服務(wù)器之間建立一個(gè)單獨(dú)的數(shù)據(jù)通道,從一臺(tái)服務(wù)器送出的每個(gè)數(shù)據(jù)包只能傳送給一個(gè)客戶端,這種傳送方式稱為單播。
RTP協(xié)議應(yīng)用方案——廣播
廣播指的是用戶被動(dòng)地接收流。
在廣播過程中,數(shù)據(jù)包的單獨(dú)一個(gè)拷貝將發(fā)送給網(wǎng)絡(luò)上的所有用戶,客戶端接收流,但不能控制流; 廣播方式中資料包的單獨(dú)一個(gè)拷貝將發(fā)送給網(wǎng)絡(luò)上的所有用戶, 而不管用戶是否需要,會(huì)非常浪費(fèi)網(wǎng)絡(luò)帶寬。
組播技術(shù)構(gòu)建的網(wǎng)絡(luò),允許路由器一次將數(shù)據(jù)包復(fù)制到多個(gè)通道上。采用組播方式,媒體服務(wù)器只需要發(fā)送一個(gè)信息包,所有發(fā)出請(qǐng)求的客戶端即可同時(shí)收到連續(xù)數(shù)據(jù)流而無延時(shí)。
組播吸收了單播和廣播兩種發(fā)送方式的長處, 克服了上述兩種發(fā)送方式的弱點(diǎn)。
RTP提供的安全性包括保密性、認(rèn)證與完整性、密鑰管理。
保密性
客戶端都支持缺省的加密算法 ,RTCP包頭隨機(jī)附加前綴加以迷惑,CBC模式具有隨機(jī)接入功能,實(shí)現(xiàn)加密的同時(shí)還能保證丟失的包不 被他自己或下一個(gè)包解密。
認(rèn)證與完整性
RTP標(biāo)準(zhǔn)協(xié)議對(duì)任何認(rèn)證過程都不加特別說明,除非在密鑰已知時(shí)采用內(nèi)部認(rèn)證。僅在通過其他方法認(rèn)證RTP流媒體時(shí),命令行認(rèn)證機(jī)制才啟動(dòng)工作。
密鑰管理
由SIP,SAP和SDP協(xié)議完成,這些協(xié)議有強(qiáng)大的認(rèn)證功能和密鑰管理功能。
聯(lián)系客服