RTPRTCP和SRTPSRTCP协议
此⽂章为转载,如有侵权,通知删除
RTP/RTCP 和 SRTP/SRTCP协议
1 RTP
RTP 协议(Real TimeProtocol)提供具有实时特征的、端到端的数据传送服务,可⽤来传送声⾳和运动图像数据。在这项数据传送服务中包含了装载数据的标识符、序列计数、时戳和传送监视。通常 RTP 的协议元是⽤ UDP 协议元来装载的,并利⽤ UDP 的复⽤和校验和来实现 R TP 的复⽤。
1.1 固定报头的 RTP 报⽂结构
RTP协议报头结构
0123
01234567012345670123456701234567
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的数据,由于⾳频的采样频率为80 00Hz,即每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有如下五种分组类型。
类型缩写表⽰⽤途
200SR(Sender Report)发送端报告
201RR(Receiver Report)接收端报告
202SDES(Source Description Items)源点描述
203BYE结束传输
204APP特定应⽤
发送端报告分组SR(SenderReport)⽤来使发送端以多播⽅式向所有接收端报告发送情况。SR分组的主要内容有:相应的RTP流的SSRC ,RTP流中最新产⽣的RTP分组的时间戳和NTP,RTP流包含的分组数,RTP流包含的字节数。
2.2 报⽂结构
RTCP协议报头结构
0123
01234567012345670123456701234567
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 协议的数据报⽂结构
认证区
012301
234
5
6
7
01
2
3
4
5
6
7
1
2
3
4
5
6
7
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 数据包索引in dex ,其中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-SH A1认证密钥。但是它不能抵御重放攻击;重放保护⽅法建议接收⽅维护好先前接收到的消息的索引,将它们与每个新接收到的消息进⾏⽐对,并只接收那些过去没有被播放过的新消息。这种⽅法⼗分依赖于完整性保护的使⽤。
(3)安全实时传输协议还允许彻底禁⽤加密,此时使⽤的是所谓的“零加密算法”。零加密算法并不进⾏任何加密,也就是说加密算法把密钥流想像成只包含“0”的流,并原封不动地将输⼊流复制到输出流。
AES加解密的流程图:
3.5数据包的处理过程
3.5.1发送⽅⼯作流程