SRTP参数及数据包处理过程
Moakap 2009-2-20
目录
1. 相关参数介绍... 1
1.1 SRTP. 1
1.1.1 两种Key. 1
1.1.2 与传输无关的参数... 1
1.1.3 SRTP流相关参数... 2
1.2 SRTCP. 2
1.3 关于加密上下文的标识... 2
2. 数据包处理过程... 2
2.1 SRTP数据包的处理... 2
2.1.1 发送端... 3
2.1.2 接收端... 3
2.2 SRTCP数据包的处理... 4
2.2.1 RTCP数据包类型... 4
2.2.2 RTCP数据包的传输限制... 4
2.3. 4
3. 其它... 4
3.1 关于加密算法标识... 4
3.2 密钥产生过程... 5
3.3 RTP协议... 5
3.3.1 RTP数据包格式... 5
3.3.2 RTCP数据包格式... 6
3.3.3 RTS会话建立过程... 8
参考文献... 8
1. 相关参数介绍
1.1 SRTP
1.1.1 两种Key
SRTP协议中定义了两种类型的key,分别为master key和session key。
Master key为一个随机位串,根据这个随机位串来生成相应的session key。
Session key指在加密传输中使用的key。其中,master key以及加密上下文中的其它参数都由密钥管理机制提供。
1.1.2 与传输无关的参数
1) ROC (Rollover Counter)
记录16位的RTP序列号重置(当序列号超过65525时将进行归零重置)的次数。根据ROC来产生SRTP数据包索引index。
index = 2^16 * ROC + SEQ
其中SEQ为RTP数据包序列号,从数据包中获取。
2) 仅对接收端:序列号s_l (16位)
可以认为是接收端接收到的RTP数据包序列号的最大值。
3) 加密算法标识
包括ciper,操作模式(Counter模式和f8模式)等。
4) 针对消息加密的:加密算法标识
5) 仅接收端:重播列表
当接受端提供认证和重播保护时,接收端会创建重播列表,其中包含最近接收和认证过的SRTP数据包索引。
6) MKI(Master Key Identifier)标识(0/1)
指示SRTP、SRTCP数据包中是否有MKI字段。
7) 当MKI设为1时:MKI字段的长度
8) Master key
必须是随机的,保密的。
9) 使用某个master key处理(发送)过的SRTP数据包的个数
10) 非负整数n_e和n_a
用来决定用于加密的session key的长度。
1.1.3 SRTP流相关参数
针对每个master key,SRTP数据流使用的参数有:
1) master salt
必须是随机的,并且公开的。从master key产生session key的过程中使用。
2) key_derivation_rate
产生session的速率,必须是{1,2,4,……2^24}中的一个,必须为2的幂数。
3) MKI值
4) —— 用来指示master key的生命周期
From,To分别为两个48位的时间值,在From和To之间的时间段内master key有效。
注意:参数对于MKI是可选的,在默认情况下,一个master key对应一个SRTP session key,session key必须定义参数,master key的默认有效期即为session key的。
5)
1.2 SRTCP
SRTCP默认情况下使用与SRTP相同的加密上下文,但是下面几个方面同:
1) SRTCP没有ROC参数和s_l
由于SRTCP索引被直接包含在SRTCP数据包中,因此SRTCP不需要维护ROC和s_l值。
2) SRTCP独立维护一个重播列表。
3) 虽然SRTCP与SRTP使用相同的master key(session key不同),但是SRTCP对master key进行独立计数。根据这个计数值,获取使用该master key处理过的SRTCP数据包的数量。
1.3 关于加密上下文的标识
不同的加密上下文之间使用一个三元组唯一标识,这个三元组成为context id:
Context id =
其中目的ip地址和端口从SRTP数据包获取。
注意:如果不能找到某个加密上下文标识符对应的数据包的加密上下文,数据包必须丢弃。
2. 数据包处理过程
2.1 SRTP数据包的处理
假设加密上下文已经通过密钥管理机制初始化,则
2.1.1 发送端
对于SRTP发送端
1) 确定加密上下文
2) 根据ROC、加密上下文中的最高序列号以及RTP数据包中的序列号,确定SRTP数据包索引。
Index = 2^16 * ROC + SEQ
其中,SEQ为RTP数据包序列号。
3) 根据步骤(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进行加密,作为数据包中的Encrypted Portion。
6) 如果MKI标志为1,则加入MKI字段。
7) 对于消息加密,使用当前的ROC、加密上下文中指定的加密算法以及session key,计算认证Tag以填充数据包的Authenticated Portion字段。
8) 根据需要,更新ROC和数据包索引。
2.1.2 接收端
认证、解密一个SRTP数据包,接收端的处理过程为:
1) 确定加密上下文
2) 根据下式获取SRTP数据包索引。
Index = 2^16 * v + SEQ
其中,SEQ为RTP数据包序列号,v从集合{ROC-1,ROC,ROC+1}(%2^32)中选取。
3) 确定master key和master salt。如果MKI标志为1,则使用NKI确定master key和master salt。否则,使用步骤(2)中确定的SRTP索引。
4) 根据master key、master salt、key_derivation_rate和session key-length确定session key和session salt。
5) 对于消息加密和重播保护,首先使用重播列表和步骤(2)确定的索引,检查数据包是否被重播,如果判断数据包被重播过,则丢弃数据包,记录log事件。
接着,使用步骤(2)的ROC、加密上下文中的加密算法以及步骤(4)获取的session key,执行认证Tag的验证。如果结果为FAILURE,丢弃数据包,记录log时间。
6) 使用加密上下文中指定的解密算法、步骤(4)中获取的session key和session salt,以及步骤(2)获取的索引,解密数据包的Encrypted Portion字段。
7) 根据步骤(2)获取的SRTP索引值,更新ROC、数据包的最大序列号、加密上下文中的s_l值。如果提供了重播保护功能,还要更新重播列表。
8) 充数据包中删除MKI和认证Tag字段。
2.2 SRTCP数据包的处理
2.2.1 RTCP数据包类型
RTCP主要有下面5种控制数据包:
SR (Sender Report):用来传输和接收来自活跃发送端的统计信息。
RR (Receiver Report):用来从非活跃发送端接收统计信息,同时,与SR配合完成活跃发送端报告。
SDES (Source Description Items):源描述项
BYE:参与者终止指示
APP:应用指明功能。
2.2.2 RTCP数据包的传输限制
为了完成RTCP对RTP的管理控制功能,RTCP数据包的传输必须满足一下条件:
w 在SR或RR数据包中的接收端统计信息,在带宽限制范围内必须必须尽量频繁地发送,以便使获取的统计信息最大化。
w 新加入的接收者需要尽快接收源端的CNAME,以便识别源,并开始关联媒体。因此,每个RTCP复合包必须包括SDES CNAME。
w 为了减少RTCP包验证成功的概率,在复合包中第一个packet type值必须尽量少。
所有的RTCP数据包必须以复合数据包的形式发送,至少包含两个单独的RTCP数据包,一般情况下建议格式为:
1) 加密前缀:只有在复合包需要加密时,才需要加密前缀。
2) SR或RR:在复合包中的第一个RTCP数据包必须为状态报告包,以便进行报头校验。
3) 关于额外的RR:如果接收统计信息对应的源端超过31,则需要在初始的报告数据包后添加额外的RR包。
4) SDES:在复合包中必须包括一个包含CNAME项的SDES包。其它的SDES根据应用的需要为可选项。
5) BYE或APP:其它RTCP数据包(包括未定义的)可以以任何顺序添加入复合包。但是BYE必须放在复合包的最后,且包含要终止的流的SSRC/CSRC值。
2.3
3. 其它
3.1 关于加密算法标识
在标准中,默认的加密算法为AES(Advanced Encryption Standard),并且定义了两种运行模式,分别为:
1) Counter模式
2) F8模式
实际上,还有另外一种加密算法,即NULL。当cipher设置为NULL时,表示RTP/RTCP无隐私,密钥流为“000…0”,加密过程为简单的将输入复制到输出,即不加密。
3.2 密钥产生过程
无论是使用加密传输还是消息认证传输,SRTP必须通过密钥生成器来产生session key。
图3-1 SRTP密钥产生过程
在SRTP传输过程中,至少有一个初始的密钥产生。接下来需要密钥的应用可以根据加密上下文中指定的密钥生成速率key_derivation_rate产生。在会话开始,密钥生成速率一旦被指定,使用SRTP密钥生成器的实体之间就不需要进行通信了。
不同的密钥的产生由一个8位的
令
r = index/key_derivation_rate;
key_id =
x = key_id XOR master salt;
然后,n位的密钥key通过以下的函数产生:
Key = PRF (key_id, x);
其中,
- k_e (SRTP encryption) :
- k_a (SRTP message authentication) :
- k_s (SRTP salting key) :
对于SRTCP密钥的产生来说,过程与SRTP相同,区别在于使用的
3.3 RTP协议
3.3.1 RTP数据包格式
一个协议的封装是为了满足协议的功能需求的。
图 3-2 RTP的头部格式
版本号(V):2比特,用来标志使用的RTP版本。
填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。
扩展位(X):1比特,如果该位置位的话,RTP固定头部后面就跟有一个扩展头部。
CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。
标记位(M):1比特,该位的解释由配置文档(Profile)来承担.
载荷类型(PT):7比特,标识了RTP载荷的类型。
序列号(SN):16比特,发送方在每发送完一个RTP包后就将该域的值增加1,接收方可以由该域检测包的丢失及恢复包序列。序列号的初始值是随机的。
时间戳:32比特,记录了该包中数据的第一个字节的采样时刻。在一次会话开始时,时间戳初始化成一个初始值。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加(时间在流逝嘛)。时间戳是去除抖动和实现同步不可缺少的。
同步源标识符(SSRC):32比特,同步源就是指RTP包流的来源。在同一个RTP会话中不能有两个相同的SSRC值。该标识符是随机选取的 RFC1889推荐了MD5随机算法。
贡献源列表(CSRC List):0~15项,每项32比特,用来标志对一个RTP混合器产生的新包有贡献的所有RTP包的源。由混合器将这些有贡献的SSRC标识符插入表中。SSRC标识符都被列出来,以便接收端能正确指出交谈双方的身份。
3.3.2 RTCP数据包格式
RTP需要RTCP为其服务质量提供保证,因此下面介绍一下RTCP的相关知识。
RTCP的主要功能是:服务质量的监视与反馈、媒体间的同步,以及多播组中成员的标识。在RTP会话期 间,各参与者周期性地传送RTCP包。RTCP包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,各参与者可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。
RTCP也是用UDP来传送的,但RTCP封装的仅仅是一些控制信息,因而分组很短,所以可以将多个RTCP分组封装在一个UDP包中。RTCP有如下五种分组类型。
类型
缩写表示
用途
200
SR(Sender Report)
发送端报告
201
RR(Receiver Report)
接收端报告
202
SDES(Source Description Items)
源点描述
203
BYE
结束传输
204
APP
特定应用
缩写表示
用途
200
SR(Sender Report)
发送端报告
201
RR(Receiver Report)
接收端报告
202
SDES(Source Description Items)
源点描述
203
BYE
结束传输
204
APP
特定应用
表 3-1 RTCP的5种分组类型
上述五种分组的封装大同小异,下面只讲述SR类型,而其它类型请参考RFC3550。
发送端报告分组SR(Sender Report)用来使发送端以多播方式向所有接收端报告发送情况。SR分组的主要内容有:相应的RTP流的SSRC,RTP流中最新产生的RTP分组的时间戳和NTP,RTP流包含的分组数,RTP流包含的字节数。SR包的封装如图3-3所示。
图 3-3 RTCP头部的格式
版本(V):同RTP包头域。
填充(P):同RTP包头域。
接收报告计数器(RC):5比特,该SR包中的接收报告块的数目,可以为零。
包类型(PT):8比特,SR包是200。
长度域(Length):16比特,其中存放的是该SR包以32比特为单位的总长度减一。
同步源(SSRC):SR包发送者的同步源标识符。与对应RTP包中的SSRC一样。
NTP Timestamp(Network time protocol)SR包发送时的绝对时间值。NTP的作用是同步不同的RTP媒体流。
RTP Timestamp:与NTP时间戳对应,与RTP数据包中的RTP时间戳具有相同的单位和随机初始值。
Sender’s packet count:从开始发送包到产生这个SR包这段时间里,发送者发送的RTP数据包的总数. SSRC改变时,这个域清零。
Sender`s octet count:从开始发送包到产生这个SR包这段时间里,发送者发送的净荷数据的总字节数(不包括头部和填充)。发送者改变其SSRC时,这个域要清零。
同步源n的SSRC标识符:该报告块中包含的是从该源接收到的包的统计信息。
丢失率(Fraction Lost):表明从上一个SR或RR包发出以来从同步源n(SSRC_n)来的RTP数据包的丢失率。
累计的包丢失数目:从开始接收到SSRC_n的包到发送SR,从SSRC_n传过来的RTP数据包的丢失总数。
收到的扩展最大序列号:从SSRC_n收到的RTP数据包中最大的序列号,
接收抖动(Interarrival jitter):RTP数据包接受时间的统计方差估计
上次SR时间戳(Last SR,LSR):取最近从SSRC_n收到的SR包中的NTP时间戳的中间32比特。如果目前还没收到SR包,则该域清零。
上次SR以来的延时(Delay since last SR,DLSR):上次从SSRC_n收到SR包到发送本报告的延时。
3.3.3 RTS会话建立过程
当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。目的传输地址由一个网络地址和一对端口组成,有两个端口:一个给RTP包,一个给RTCP包,使得RTP/RTCP数据能够正确发送。RTP数据发向偶数的UDP端口,而对应的控制信号RTCP数据发向相邻的奇数UDP端口(偶数的UDP端口+1),这样就构成一个UDP端口对。 RTP的发送过程如下,接收过程则相反。
1) RTP协议从上层接收流媒体信息码流(如H.263),封装成RTP数据包;RTCP从上层接收控制信息,封装成RTCP控制包。
2) RTP将RTP 数据包发往UDP端口对应的偶数端口;RTCP将RTCP控制包发往UDP端口对应的接收端口。