SRTP参数及数据包处理过程
http://www.rosoo.net/a/201606/17449.html? 原鏈接
目錄
1.????? 相關(guān)參數(shù)介紹... 1
1.1???????????? SRTP. 1
1.1.1????????????????? 兩種Key. 1
1.1.2????????????????? 與傳輸無關(guān)的參數(shù)... 1
1.1.3????????????????? SRTP流相關(guān)參數(shù)... 2
1.2???????????? SRTCP. 2
1.3???????????? 關(guān)于加密上下文的標(biāo)識... 2
2.????? 數(shù)據(jù)包處理過程... 2
2.1???????????? SRTP數(shù)據(jù)包的處理... 2
2.1.1????????????????? 發(fā)送端... 3
2.1.2????????????????? 接收端... 3
2.2???????????? SRTCP數(shù)據(jù)包的處理... 4
2.2.1????????????????? RTCP數(shù)據(jù)包類型... 4
2.2.2????????????????? RTCP數(shù)據(jù)包的傳輸限制... 4
2.3. 4
3.????? 其它... 4
3.1 關(guān)于加密算法標(biāo)識... 4
3.2 密鑰產(chǎn)生過程... 5
3.3 RTP協(xié)議... 5
3.3.1 RTP數(shù)據(jù)包格式... 5
3.3.2 RTCP數(shù)據(jù)包格式... 6
3.3.3 RTS會話建立過程... 8
參考文獻(xiàn)... 8
?
?
1.???? 相關(guān)參數(shù)介紹
1.1??? ?SRTP
1.1.1??????? 兩種Key
SRTP協(xié)議中定義了兩種類型的key,分別為master key和session key。
Master key為一個隨機(jī)位串,根據(jù)這個隨機(jī)位串來生成相應(yīng)的session key。
Session key指在加密傳輸中使用的key。其中,master key以及加密上下文中的其它參數(shù)都由密鑰管理機(jī)制提供。
1.1.2??????? 與傳輸無關(guān)的參數(shù)
1)?? ROC (Rollover Counter)
記錄16位的RTP序列號重置(當(dāng)序列號超過65535時將進(jìn)行歸零重置)的次數(shù)。根據(jù)ROC來產(chǎn)生SRTP數(shù)據(jù)包索引index。
index = 2^16 * ROC + SEQ
其中SEQ為RTP數(shù)據(jù)包序列號,從數(shù)據(jù)包中獲取。
2)?? 僅對接收端:序列號s_l (16位)
可以認(rèn)為是接收端接收到的RTP數(shù)據(jù)包序列號的最大值。
3)?? 加密算法標(biāo)識
包括ciper,操作模式(Counter模式和f8模式)等。
4)?? 針對消息加密的:加密算法標(biāo)識
5)?? 僅接收端:重播列表
當(dāng)接受端提供認(rèn)證和重播保護(hù)時,接收端會創(chuàng)建重播列表,其中包含最近接收和認(rèn)證過的SRTP數(shù)據(jù)包索引。
6)?? MKI(Master Key Identifier)標(biāo)識(0/1)
指示SRTP、SRTCP數(shù)據(jù)包中是否有MKI字段。
7)?? 當(dāng)MKI設(shè)為1時:MKI字段的長度
8)?? Master key
必須是隨機(jī)的,保密的。
9)?? 使用某個master key處理(發(fā)送)過的SRTP數(shù)據(jù)包的個數(shù)
10)??????? 非負(fù)整數(shù)n_e和n_a
用來決定用于加密的session key的長度。
1.1.3??????? SRTP流相關(guān)參數(shù)
針對每個master key,SRTP數(shù)據(jù)流使用的參數(shù)有:
1)?? master salt
必須是隨機(jī)的,并且公開的。從master key產(chǎn)生session key的過程中使用。
2)?? key_derivation_rate
產(chǎn)生session的速率,必須是{1,2,4,……2^24}中的一個,必須為2的冪數(shù)。
3)?? MKI值
4)?? <From,to> —— 用來指示master key的生命周期
From,To分別為兩個48位的時間值,在From和To之間的時間段內(nèi)master key有效。
注意:<From, To>參數(shù)對于MKI是可選的,在默認(rèn)情況下,一個master key對應(yīng)一個SRTP session key,session key必須定義<From, To>參數(shù),master key的默認(rèn)有效期即為session key的<From, To>。
5)?? ?
1.2??? ?SRTCP
SRTCP默認(rèn)情況下使用與SRTP相同的加密上下文,但是下面幾個方面同:
1)?? SRTCP沒有ROC參數(shù)和s_l
由于SRTCP索引被直接包含在SRTCP數(shù)據(jù)包中,因此SRTCP不需要維護(hù)ROC和s_l值。
2)?? SRTCP獨立維護(hù)一個重播列表。
3)?? 雖然SRTCP與SRTP使用相同的master key(session key不同),但是SRTCP對master key進(jìn)行獨立計數(shù)。根據(jù)這個計數(shù)值,獲取使用該master key處理過的SRTCP數(shù)據(jù)包的數(shù)量。
1.3??? ?關(guān)于加密上下文的標(biāo)識
不同的加密上下文之間使用一個三元組唯一標(biāo)識,這個三元組成為context id:
Context id = <SSRC, 目的ip地址,目的端口>
其中目的ip地址和端口從SRTP數(shù)據(jù)包獲取。
注意:如果不能找到某個加密上下文標(biāo)識符對應(yīng)的數(shù)據(jù)包的加密上下文,數(shù)據(jù)包必須丟棄。
2.???? 數(shù)據(jù)包處理過程
2.1 SRTP數(shù)據(jù)包的處理
假設(shè)加密上下文已經(jīng)通過密鑰管理機(jī)制初始化,則
2.1.1??????? 發(fā)送端
?
對于SRTP發(fā)送端
1)?? 確定加密上下文
2)?? 根據(jù)ROC、加密上下文中的最高序列號以及RTP數(shù)據(jù)包中的序列號,確定SRTP數(shù)據(jù)包索引。
Index = 2^16 * ROC + SEQ
其中,SEQ為RTP數(shù)據(jù)包序列號。
3)?? 根據(jù)步驟(2)中確定的SRTP索引,確定master key和master salt
4)?? 使用master key、master salt、key_derivatio_rate以及session key-length確定session key和session salt。
5)?? 使用加密上下文中指定的加密算法、session key和session salt,對RTP payload進(jìn)行加密,作為數(shù)據(jù)包中的Encrypted Portion。
6)?? 如果MKI標(biāo)志為1,則加入MKI字段。
7)?? 對于消息加密,使用當(dāng)前的ROC、加密上下文中指定的加密算法以及session key,計算認(rèn)證Tag以填充數(shù)據(jù)包的Authenticated Portion字段。
8)?? 根據(jù)需要,更新ROC和數(shù)據(jù)包索引。
?
2.1.2??????? 接收端
認(rèn)證、解密一個SRTP數(shù)據(jù)包,接收端的處理過程為:
1)? 確定加密上下文
2)? 根據(jù)下式獲取SRTP數(shù)據(jù)包索引。
Index = 2^16 * v + SEQ
其中,SEQ為RTP數(shù)據(jù)包序列號,v從集合{ROC-1,ROC,ROC+1}(%2^32)中選取。
3)? 確定master key和master salt。如果MKI標(biāo)志為1,則使用NKI確定master key和master salt。否則,使用步驟(2)中確定的SRTP索引。
4)? 根據(jù)master key、master salt、key_derivation_rate和session key-length確定session key和session salt。
5)? 對于消息加密和重播保護(hù),首先使用重播列表和步驟(2)確定的索引,檢查數(shù)據(jù)包是否被重播,如果判斷數(shù)據(jù)包被重播過,則丟棄數(shù)據(jù)包,記錄log事件。
接著,使用步驟(2)的ROC、加密上下文中的加密算法以及步驟(4)獲取的session key,執(zhí)行認(rèn)證Tag的驗證。如果結(jié)果為FAILURE,丟棄數(shù)據(jù)包,記錄log時間。
6)? 使用加密上下文中指定的解密算法、步驟(4)中獲取的session key和session salt,以及步驟(2)獲取的索引,解密數(shù)據(jù)包的Encrypted Portion字段。
7)? 根據(jù)步驟(2)獲取的SRTP索引值,更新ROC、數(shù)據(jù)包的最大序列號、加密上下文中的s_l值。如果提供了重播保護(hù)功能,還要更新重播列表。
8)? 充數(shù)據(jù)包中刪除MKI和認(rèn)證Tag字段。
2.2 SRTCP數(shù)據(jù)包的處理
2.2.1??????? RTCP數(shù)據(jù)包類型
RTCP主要有下面5種控制數(shù)據(jù)包:
SR (Sender Report):用來傳輸和接收來自活躍發(fā)送端的統(tǒng)計信息。
RR (Receiver Report):用來從非活躍發(fā)送端接收統(tǒng)計信息,同時,與SR配合完成活躍發(fā)送端報告。
SDES (Source Description Items):源描述項
BYE:參與者終止指示
APP:應(yīng)用指明功能。
2.2.2??????? RTCP數(shù)據(jù)包的傳輸限制
為了完成RTCP對RTP的管理控制功能,RTCP數(shù)據(jù)包的傳輸必須滿足一下條件:
w?? 在SR或RR數(shù)據(jù)包中的接收端統(tǒng)計信息,在帶寬限制范圍內(nèi)必須必須盡量頻繁地發(fā)送,以便使獲取的統(tǒng)計信息最大化。
w?? 新加入的接收者需要盡快接收源端的CNAME,以便識別源,并開始關(guān)聯(lián)媒體。因此,每個RTCP復(fù)合包必須包括SDES CNAME。
w?? 為了減少RTCP包驗證成功的概率,在復(fù)合包中第一個packet type值必須盡量少。
?
所有的RTCP數(shù)據(jù)包必須以復(fù)合數(shù)據(jù)包的形式發(fā)送,至少包含兩個單獨的RTCP數(shù)據(jù)包,一般情況下建議格式為:
1)?? 加密前綴:只有在復(fù)合包需要加密時,才需要加密前綴。
2)?? SR或RR:在復(fù)合包中的第一個RTCP數(shù)據(jù)包必須為狀態(tài)報告包,以便進(jìn)行報頭校驗。
3)?? 關(guān)于額外的RR:如果接收統(tǒng)計信息對應(yīng)的源端超過31,則需要在初始的報告數(shù)據(jù)包后添加額外的RR包。
4)?? SDES:在復(fù)合包中必須包括一個包含CNAME項的SDES包。其它的SDES根據(jù)應(yīng)用的需要為可選項。
5)?? BYE或APP:其它RTCP數(shù)據(jù)包(包括未定義的)可以以任何順序添加入復(fù)合包。但是BYE必須放在復(fù)合包的最后,且包含要終止的流的SSRC/CSRC值。
2.3?
3.???? 其它
3.1 關(guān)于加密算法標(biāo)識
在標(biāo)準(zhǔn)中,默認(rèn)的加密算法為AES(Advanced Encryption Standard),并且定義了兩種運行模式,分別為:
1)??? Counter模式
2)??? F8模式
實際上,還有另外一種加密算法,即NULL。當(dāng)cipher設(shè)置為NULL時,表示RTP/RTCP無隱私,密鑰流為“000…0”,加密過程為簡單的將輸入復(fù)制到輸出,即不加密。
3.2 密鑰產(chǎn)生過程
無論是使用加密傳輸還是消息認(rèn)證傳輸,SRTP必須通過密鑰生成器來產(chǎn)生session key。
圖3-1 SRTP密鑰產(chǎn)生過程
?
在SRTP傳輸過程中,至少有一個初始的密鑰產(chǎn)生。接下來需要密鑰的應(yīng)用可以根據(jù)加密上下文中指定的密鑰生成速率key_derivation_rate產(chǎn)生。在會話開始,密鑰生成速率一旦被指定,使用SRTP密鑰生成器的實體之間就不需要進(jìn)行通信了。
不同的密鑰的產(chǎn)生由一個8位的<label>字段來區(qū)分。
令
r = index/key_derivation_rate;
key_id = <label> || r;
x = key_id XOR master salt;
然后,n位的密鑰key通過以下的函數(shù)產(chǎn)生:
Key = PRF (key_id, x);
其中,<label>根據(jù)產(chǎn)生密鑰類型的不同而不同,具體為:
?? - k_e (SRTP encryption) : <label> = 0x00, n = n_e.
?? - k_a (SRTP message authentication) : <label> = 0x01, n = n_a.
?? - k_s (SRTP salting key) : <label> = 0x02, n = n_s.
?
對于SRTCP密鑰的產(chǎn)生來說,過程與SRTP相同,區(qū)別在于使用的<label>不同,針對SRTCP,<label>分別為:
<label> = 0x03 for the SRTCP encryption key
<label> = 0x04 for the SRTCP authentication key
<label> = 0x05 for the SRTCP salting key.
3.3 RTP協(xié)議
3.3.1 RTP數(shù)據(jù)包格式
一個協(xié)議的封裝是為了滿足協(xié)議的功能需求的。
圖 3-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)識符都被列出來,以便接收端能正確指出交談雙方的身份。
3.3.2 RTCP數(shù)據(jù)包格式
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ù)。
RTCP也是用UDP來傳送的,但RTCP封裝的僅僅是一些控制信息,因而分組很短,所以可以將多個RTCP分組封裝在一個UDP包中。RTCP有如下五種分組類型。
類型 | 縮寫表示 | 用途 |
200 | SR(Sender Report) | 發(fā)送端報告 |
201 | RR(Receiver Report) | 接收端報告 |
202 | SDES(Source Description Items) | 源點描述 |
203 | BYE | 結(jié)束傳輸 |
204 | APP | 特定應(yīng)用 |
表 3-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所示。
?
圖 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ā)送本報告的延時。
3.3.3 RTS會話建立過程
當(dāng)應(yīng)用程序建立一個RTP會話時,應(yīng)用程序?qū)⒋_定一對目的傳輸?shù)刂贰D康膫鬏數(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端口對應(yīng)的偶數(shù)端口;RTCP將RTCP控制包發(fā)往UDP端口對應(yīng)的接收端口。
?
參考文獻(xiàn)
[1] RFC 3550 RTP: A Transport Protocol for Real-Time Applications
[2] RFC 3771 The Secure Real-time Transport Protocol (SRTP)
(Moakap )
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的SRTP参数及数据包处理过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据仓库与数据挖掘的OLAP技术----
- 下一篇: 360屏保壁纸android,“如何删除