RTP/RTCP 和 SRTP/SRTCP协议

此文章为转载,如有侵权,通知删除

原地址:https://blog.csdn.net/swallow_he/article/details/74202104


RTP/RTCP 和 SRTP/SRTCP协议

1 RTP

RTP 协议(Real TimeProtocol)提供具有实时特征的、端到端的数据传送服务,可用来传送声音和运动图像数据。在这项数据传送服务中包含了装载数据的标识符、序列计数、时戳和传送监视。通常 RTP 的协议元是用 UDP 协议元来装载的,并利用 UDP 的复用和校验和来实现 RTP 的复用。

1.1    固定报头的 RTP 报文结构

RTP协议报头结构
0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
V P X CC(4bit) M PT(7bit) Sequence Number(16bit)
timestamp(32bit)
SSRC标识符(32bit)
CSRC标识符(n个32bit)
playload

RTP分组头部的各字段含义为:

V:RTP版本号。为“10”。

P:填充指示位。P为“1”时表示分组结尾含有1个或多个填充字节,其中这部分不属于有效载荷

X:扩展指示位。X为“1”时,则表示固定头部后还有一个扩展头部,这种情况较复杂,很少使用。

CC:CSRC计数。指示固定头部后的CSRC的个数

M:标志。

PT:负载类型。表示RTP分组的负载类型。我们常用的有:

                                “0”: G.711μ

                                “8”: G.711A

                                “4”: G.723.1

                                “18”: G.729

序列号:序号顾名思义就是表示RTP分组的次序。初值为随机数,每发送一个增加1。可供接收方检测分组丢失和恢复分组次序。

时间戳:表示RTP分组第一个字节的取样时刻。其初值为随机数,每个采用周期加1。如果每次传送20ms的数据,由于音频的采样频率为8000Hz,即每20ms有160次采样,则每传送20ms的数据,时戳增加160。

SSRC:同步源标识(Synchronous Source)。表示信号的同步源,其值应随机选择,以保证同一个RTP会话中任意两个同步源的SSRC标识不同。

CSRC:分信源(贡献源)标识(Contributing Source)。识别该数据包中的有效载荷的贡献源。换句话说,CSRC标识由混合器插入,其值就是组成复合信号的各个分信号的SSRC标识,用以标识各个组成分信号的信源。RTP分组的头部最多可以包含15个CSRC标识,其数目由CC字段指明。

2 RTCP协议

         RTP本身没有提供任何确保及时传送的机制,也没有提供任何传输质量保证的机制,因而业务质量完全由下层网络的质量来决定。同时,RTP不保证数据包按序号传送,即使下层网络提供可靠性传送,也不能保证数据包的顺序到达。包含在RTP中的序列号就是供接收方重新对数据包排序之用。

        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

特定应用

 

发送端报告分组SR(SenderReport)用来使发送端以多播方式向所有接收端报告发送情况。SR分组的主要内容有:相应的RTP流的SSRC,RTP流中最新产生的RTP分组的时间戳和NTP,RTP流包含的分组数,RTP流包含的字节数。

2.2 报文结构

RTCP协议报头结构
0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
V P RC(5bit) PT=SR=200(8bit) length(16bit)
SSRC标识符(32bit)
NAP TimeStamp,most significant word
NAP TimeStamp,least significant word
RTP TimeStamp
sender packet count
sender octet count
SSRC 1 

3 SRTP协议(重点)

SRTP(SecureReal-time Transport Protocol) 安全实时传输协议,SRTP是在实时传输协议(Real-time Transport Protocol)基础上所定义的一个协议,旨在为单播和多播应用程序中的实时传输协议的数据提供加密、消息认证、完整性保证和重放保护安全实时传输协议。

3.1协议格式

SRTP协议的数据报文结构
   认证区
0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
V P X CC(4bit) M PT(7bit) Sequence Number(16bit)
时间戳(32bit)
SSRC标识符(32bit)
CSRC标识符(n个32bit)
RTP extension(可选)
加密的payload(末尾可能包含RTP padding和RTP pad count)  加密区
SRTP MKI(可选),master key identifier,是用来生成session加密密钥的随机位串标识符
认证标签(Authentication tag)
说明:
V:版本号,目前是2
P:填充位,当负载的长度不够32bit的整数倍时,需要填充
X:扩展位,若为1,则固定的包头后增加一个32bits的扩展
CC:CSRC的数目
M:标志,允许在比特流中标记重要的事件
PT:负载的格式
序列号:每发送一个RTP数据包,序列号加1
时间戳:
SSRC标识符:synchronizating source identifier 识别同步源
CSRC标识符:contributing source identifiers 识别负载重的有效贡献源
与RTP包的主要区别是负载加密、SRTP MKI(主密钥标识符,由密钥管理协议决定)、认证标签

3.2 SRTP加密环境

在SRTP中,发送方和接收方需要为每一个SRTP流维护一份加密状态信息,该信息称为加密环境。一个加密环境ID号由SSRC,目的网络地址和目的传输端口号唯一确定。

Context ID=<SSRC,dest address,drstv port>

注意:如果不能找到某个加密上下文标识符对应的数据包的加密上下文,数据包必须丢。

加密环境保存两类参数,分别为变换相关参数和变换无关参数。变换相关参数指与所使用具体加密变换方法和认证变换方法有关的参数,如密码组大小,会话密钥,初始化向量信息数据等。变换无关参数包括:

(1)  一个32位的循环计数器(ROC),用来记录16bit的RTP序列号有多少次超过65535后被置位0。根据ROC来产生SRTP数据包索引index,其中index = 2^16 * ROC + SEQ,SEQ为RTP数据包序列号,从数据包中获取。

(2)      一个16bit序列号保存接收方接收到的最高RTP序列号。

(3)      加密算法的标识符,标识使用哪种加密算法。

(4)      消息认证算法的标识符,标识使用的哪种认证算法。

(5)      重放列表,若启用了消息认证则接收方需保存一张重放列表,记录最近收到并通过认证的SRTP数据包索引号,该列表长度不得低于256。

(6)      MKI指示器(0/1),标识是否包中有MKI。

(7)      MKI值,如果MKI指示器为1,则保存MKI字段长度,发送方当前使用的KMI值。

(8)      主密钥,需要随机和保密,每个主密钥有以下相关参数:

1)主salt,用来从主密钥推导会话秘钥,是个随机数,可以公开。

2)密钥推导率,也是用来从主密钥推导会话密钥,是2的幂次方。

3)对应的MKI值。

4) <From,To>定义主密钥的存活时间,From,To是两个48bit的SRTP包索引号。

5)一个计数器,记录用该主密钥处理的SRTP包数量。

(9) 两个非负整数n_e和n_a来表示加密会话密钥和认证会话密钥的长度。

3.3 SRTP密钥

         SRTP使用两种密钥:主密钥(masterkey)和会话密钥(session key)

master key用来生成相应的session key,一个加密环境可以有多个masterkey,处理某个SRTP包时决定使用哪个master key有两种方法:一是在数据包里加MKI字段直接指定,但是这样增加了数据包的长度,加重了网络负担。二是通过加密环境中<From,To>值为每一个主密钥指定其处理的数据包索引号范围,超过该范围,该主密钥失效,但是此方法只能应用于单向或者双向通行中,在多方通信中不能采用。

session key是在加密传输中使用,用于加密变换或者消息认证变换,它由主密钥,主Salt,密钥推导率,会话密钥长度和SRTP索引号决定。

无论是使用加密传输还是消息认证传输,SRTP必须通过密钥生成器来产生sessionkey。



密钥产生过程


r = index/key_derivation_rate;

key_id = <label> || r;

x = key_id XOR master salt;(XOR为异或运算符)

n位的密钥key通过以下的函数产生

key_session = PRF (key_master, x);PRF是一个AES-cm的对称加密函数。

不同的密钥的产生由一个8位的<label>字段来区分,对于生成的不同密钥,8位的label有不同的值:

session_en_key:会话加密密钥,<label>=0x00

session_au_key:会话认证密钥,<label>=0x01

session_salt_key:会话salt密钥,<label>=0x02

3.4加密算法

(1)在标准中,默认的加密算法为AES(Advanced Encryption Standard),这种加密算法有两种加密模式,它们能将原始的AES块密文转换成流密文并且定义了两种运行模式,加密模式分别为:

1)Counter模式(分段整型计数器模式):AES in Counter Mode  128-bit

2)f8模式 : AES inf8-mode    128-bit

(2)为了进行消息认证并保护消息的完整性,安全实时传输协议使用了HMAC-SHA1算法。这种算法使用的是默认160位长度的HMAC-SHA1认证密钥。但是它不能抵御重放攻击;重放保护方法建议接收方维护好先前接收到的消息的索引,将它们与每个新接收到的消息进行比对,并只接收那些过去没有被播放过的新消息。这种方法十分依赖于完整性保护的使用。

3)安全实时传输协议还允许彻底禁用加密,此时使用的是所谓的“零加密算法”。零加密算法并不进行任何加密,也就是说加密算法把密钥流想像成只包含“0”的流,并原封不动地将输入流复制到输出流。

AES加解密的流程图:


3.5数据包的处理过程

3.5.1发送方工作流程

1   确定加密上下文

2  根据ROC、加密上下文中的最高序列号以及RTP数据包中的序列号,确定SRTP数据包索引。Index = 2^16* ROC + SEQ,其中,SEQRTP数据包序列号。

3  根据步骤(2)中确定的SRTP索引,确定master keymaster salt

4  使用master keymaster saltkey_derivatio_rate以及session key-length确定session keysession salt

5  使用加密上下文中指定的加密算法、session keysession salt,对RTP payload进行加密,作为数据包中的EncryptedPortion

6  如果MKI标志为1,则加入MKI字段。

7  对于消息加密,使用当前的ROC、加密上下文中指定的加密算法以及session key,计算认证Tag以填充数据包的AuthenticatedPortion字段。

8  根据需要,更新ROC和数据包索引。

3.5.2接收端流程(认证、解密一个SRTP数据包

1 确定加密上下文

2 根据下式获取SRTP数据包索引。

Index = 2^16 * v + SEQ

其中,SEQRTP数据包序列号,v从集合{ROC-1ROCROC+1}%2^32)中选取。

3 确定master keymaster salt。如果MKI标志为1,则使用NKI确定masterkeymaster salt。否则,使用步骤(2)中确定的SRTP索引。

4 根据master keymaster saltkey_derivation_ratesession key-length确定session keysession salt

5 对于消息加密和重播保护,首先使用重播列表和步骤(2)确定的索引,检查数据包是否被重播,如果判断数据包被重播过,则丢弃数据包,记录log事件。

接着,使用步骤(2)的ROC、加密上下文中的加密算法以及步骤(4)获取的session key,执行认证Tag的验证。如果结果为FAILURE,丢弃数据包,记录log时间。

6 使用加密上下文中指定的解密算法、步骤(4)中获取的session keysession salt,以及步骤(2)获取的索引,解密数据包的EncryptedPortion字段。

7 根据步骤(2)获取的SRTP索引值,更新ROC、数据包的最大序列号、加密上下文中的s_l值。如果提供了重播保护功能,还要更新重播列表。

8  充数据包中删除MKI和认证Tag字段。

4 SRTCP协议

 

对于SRTCP密钥的产生来说,过程与SRTP相同,区别在于使用的<label>不同,针对SRTCP,<label>分别为:

<label> = 0x03 for the SRTCPencryption key

<label> = 0x04 for the SRTCPauthentication key

<label> = 0x05 for the SRTCP saltingkey.

 

 

5 RTP和SRTP区别

我们通过抓包将数据来分析来那个协议的主要不通点:



SRTP传输的数据包

 


 

 

 

 



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页