SRTP参数及数据包处理过程

http://www.rosoo.net/a/201606/17449.html  原链接

目录

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序列号重置(当序列号超过65535时将进行归零重置)的次数。根据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)   <From,to> —— 用来指示master key的生命周期

From,To分别为两个48位的时间值,在From和To之间的时间段内master key有效。

注意:<From, To>参数对于MKI是可选的,在默认情况下,一个master key对应一个SRTP session key,session key必须定义<From, To>参数,master key的默认有效期即为session key的<From, To>。

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 = <SSRC, 目的ip地址,目的端口>

其中目的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位的<label>字段来区分。

r = index/key_derivation_rate;

key_id = <label> || r;

x = key_id XOR master salt;

然后,n位的密钥key通过以下的函数产生:

Key = PRF (key_id, x);

其中,<label>根据产生密钥类型的不同而不同,具体为:

   - 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密钥的产生来说,过程与SRTP相同,区别在于使用的<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协议

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

特定应用

表 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端口对应的接收端口。

 

参考文献

[1] RFC 3550 RTP: A Transport Protocol for Real-Time Applications

[2] RFC 3771 The Secure Real-time Transport Protocol (SRTP)

(Moakap )



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3

2.1.1 IoC是什么 Ioc—Inversion of Control&#xff0c;即“控制反转”&#xff0c;不是什么技术&#xff0c;而是一种设计思想。在Java开发中&#xff0c;Ioc意味着将你设计好的对象交给容器控制&#xff0c;而不是传统的在你的对象内部直接控制。如何理解好Ioc呢&#xff1…

排队 题解 组合数学+高精度

因为实在是写不动了&#xff0c;所以菜鸡颓博客为了信奥发展的伟大未来作出一点小小的贡献 题目描述 某中学有 n 名男同学&#xff0c;m 名女同学和两名老师要排队参加体检。他们排成一条直线&#xff0c;并且任意两名女同学不能相邻&#xff0c;两名老师也不能相邻&#xff0c…

在window下搭建TensorFlow

网站&#xff1a;https://blog.csdn.net/chduguxue/article/details/793922201.首先查看TensorFlow目前对Windows支持的python版本要求 https://pypi.python.org/pypi/tensorflow/1.1.0rc2截止本文2018年2月27日&#xff0c;要求python是3.5&#xff0c;操作系统64位 如果pytho…

广播、组播、点播的区别

原网站:https://blog.csdn.net/z502521809/article/details/53007932 今天学习的时候发现了广播、组播、点播这三个用来描述网络节点之间通讯方式的术语&#xff0c;那么这几种“播”到底有什么区别&#xff1f;于是乎百度总结了一下。 ----------------------------------点播…

Arm架构下VUE环境的安装

最近因为项目需要在arm环境下搭建vue环境&#xff0c;网上有基于Linux的 教程&#xff0c;路径略有不同&#xff0c;现整理如下 1、安装文件下载 1、下载地址&#xff1a;http://nodejs.cn/download/ 2、选择一个合适的版本下载 2、安装步骤 1、将安装包上传到指定位置(我习惯放…

网络安全技术之端口隔离

端口隔离技术是一种实现在客户端的端口间的足够的隔离度以保证一个客户端不会收到另外一个客户端的流量的技术。通过端口隔离技术&#xff0c;用户可以将需要进行控制的端口加入到一个隔离组中&#xff0c;实现隔离组中的端口之间二层、三层数据的隔离&#xff0c;既增强了网络…

python解释器、pycharm安装及环境变量配置

python解释器、pycharm安装及环境变量配置 1.python解释器安装 下载地址&#xff1a;https://www.python.org/ 打开官网&#xff0c;点击downloads,选择操作系统&#xff0c;以windows为例&#xff1a; 选择python2与python3解释器版本&#xff08;以python3.6.6及python2.7.16…

RHEL6.4 Keepalive+LVS(DR)部署文档

1、简介LVSKeepalived 能实现的功能:利用 LVS 控制器主备模式避免单点故障以及自动删除故障 WEB 服务器结点并当它恢复后再自动添加到群集中。拓扑图:2、系统环境系统平台:RHEL6.4硬件平台:dell R720*4硬件参数:cpu(e5-2609)两颗;内存 32G;磁盘 600G*6;RAID 5 ;双电源LVS 版本:…

非阻塞I/O多路复用机制

题外话&#xff1a;我们现在要仔细的说一说I/O多路复用机制&#xff0c;因为这个说法实在是太通俗了&#xff0c;通俗到一般人都不懂是什么意思。博主打一个比方&#xff1a;小曲在S城开了一家快递店&#xff0c;负责同城快送服务。小曲因为资金限制&#xff0c;雇佣了一批快递…

Windows平台WebRTC编译-VS2017

转载网站&#xff1a;https://blog.jianchihu.net/webrtc-build-vs2017.html 在音视频领域&#xff0c;想深入研究的话&#xff0c;必定会接触WebRTC。WebRTC是一个庞大的工程&#xff0c;就像是音视频领域的百科全书&#xff0c;音视频采集&#xff0c;编解码&#xff0c;传输…

Hadoop--初识Hadoop

什么是Hadoop&#xff1f; 搞什么东西之前&#xff0c;第一步是要知道What&#xff08;是什么&#xff09;&#xff0c;然后是Why&#xff08;为什么&#xff09;&#xff0c;最后才是How&#xff08;怎么做&#xff09;。但很多开发的朋友在做了多年项目以后&#xff0c;都习惯…

VS2019编译 当前最新版chromium

VS2019编译 当前最新版chromium 之前编译过webrtc和chromium&#xff0c; 由于长时间没用&#xff0c;被我删除了&#xff0c; 最近在最新版本的google浏览器上遇到了播放器兼容性问题&#xff0c;老版本的google浏览器是没问题&#xff0c;IE, 火狐浏览器也没问题&#xff0…

37signals为何砍掉中层?个人点评,高素质人才队伍工作,靠的是全体发挥综合能力,而不是靠......

为什么80%的码农都做不了架构师&#xff1f;>>> 37signals为何砍掉中层? 分享到 本文来源于&#xff1a;中欧商业评论 作者&#xff1a;潘芸 发表于&#xff1a;2013-08-21 11:09:41 http://www.cyzone.cn/a/20130821/244571.html 37signals有多位程序员&#…

ExtAspNet学习-利用AppBox框架快速创建项目(五)—完成项目含源代码

我们前边四个部分已经完成了框架需要的基础配置&#xff0c; 现在我们来完成项目 1、Subsonic 配置&#xff0c;首先在OraSurvey.DAO中添加App.config配置相关信息 View Code 1 <?xml version"1.0" encoding"utf-8" ?> 2 <configuration> 3…

linux+apache+mysql+php

linuxapachemysqlphp设置mysqll测试1网站注意&#xff1a;在安装或者测试的时候出现乱码的话&#xff0c;可以修改浏览器的编码一项将其改为适合的编码输入站点http://服务器地址/ecshop url会自动跳转到服务器地址/ecshop/install/index.php安装过程中会提示目录文件不可写&am…

android4.0.3 修改启动动画和开机声音

1. Linux 系统启动&#xff0c;出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片)&#xff1b;2. Android平台启动初始化&#xff0c;出现"A N D R I O D"文字字样画面&#xff1b;3. Android平台图形系统启动&#xff0c;出现含闪动的ANDROID字样…

VMWare虚拟机NAT模式静态IP联网配置

使用静态IP&#xff0c;而不选用DHCP的主要原因是避免每次重启计算机后&#xff0c;虚拟机系统的IP发生变化&#xff0c;导致常常需要修改宿主机器远程连接虚拟机服务(例如Mysql) 环境 项目版本号VmwareVmware Workstation Pro 15UbuntuUbuntu 18.04.2 LTS关键配置 虚拟网络编辑…

ffmpeg调整缩放裁剪视频的基础知识(转)

源网址&#xff1a;ffmpeg调整缩放裁剪视频的基础知识 - yongfengnice - 博客园 1. resize and scale video 调整视频的大小和尺寸 1-1.调整视频大小(resize)是改变视频的宽度和高度。 使用-s参数实现&#xff0c;语法&#xff1a;ffmpeg -i input_file -s wxh output_fi…

Babel+vscode实现APICloud开发中兼容ES6及以上代码

本文出自APICloud官方论坛&#xff0c; 感谢论坛版主 penghuoyan 的分享。 使用APICloud开发时&#xff0c;考虑到兼容问题一直使用ES5开发&#xff0c;时间越久感觉越落后&#xff0c;整理了一个兼容ES6的开发环境&#xff0c;供大家参考。 步骤1&#xff1a; 安装Node开发环境…

如何在工作组环境win 7远程管理Hyper-v server R2 SP1配置(三)

在 如何在工作组环境win 7远程管理Hyper-v server R2 SP1配置&#xff08;二&#xff09; 文中末尾&#xff0c;出现下图报错&#xff1a; 一般情况下&#xff0c;按上篇提到的hvremote.wsf 脚本配置说明文件HVRemote Documentation操作后&#xff0c;不会出现此报错&#xff0…