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

原地址: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,其中,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进行加密,作为数据包中的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

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

3) 确定master key和master salt。如果MKI标志为1,则使用NKI确定masterkey和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)获取的索引,解密数据包的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传输的数据包

RTP/RTCP 和 SRTP/SRTCP协议相关推荐

  1. SRTP/SRTCP协议

    SRTP(Secure Real Time Protocol)安全实时传输协议,SRTCP(Secure Real Time Controle Protocol)安全实时传输控制协议.了解这个两个协议 ...

  2. 【网络通信 -- 直播】网络通信协议简介 -- SRTP/SRTCP

    [网络通信 -- 直播]网络通信协议简介 -- SRTP/SRTCP [0]简介 安全实时传输协议 (Secure Real-time Transport Protocol,SRTP) 是在实时传输协 ...

  3. 视频码流传输协议srtp/srtcp详细介绍

      RTP/RTCP 协议并没有对它的负载数据进行任何保护.因此,如果攻击者通过抓包工具,如 Wireshark,将音视频数据抓取到后,通过该工具就可以直接将音视频流播放出来,这是非常恐怖的事情,这里 ...

  4. Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作过程

    整体而言,RTSP 通常工作于可靠的传输协议 TCP 之上,就像 HTTP 那样,用于发起/结束流媒体传输,交换流媒体元信息.RTP 通常工作于 UDP 之上,用于传输实际的流媒体数据,其中的载荷格式 ...

  5. RTP/RTMP/RTSP/RTCP/SRTP/SRTCP等基础协议了解

    文章目录 一.前言 二.RTP 三.RTCP 四.SRTP & SRTCP 五.RTSP 六.RTSP 和RTP的关系 一.前言 实现流媒体实现推流拉流跨平台跨浏览器访问,收集整理了一下相关协 ...

  6. 智能终端会议系统(20)---网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系

    网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系 RTP/RTCP/RTSP/SIP/SDP 关系 1. RTP Real-time Transport Protocol,是用 ...

  7. 流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)

    RTP     参考文档 RFC3550/RFC3551     Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细说明 ...

  8. WebRTC学习进阶之路 --- 五、WebRTC网络知识详解(三)(最全流媒体协议(RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL)/SDP)

    WebRTC学习进阶之路系列总目录:https://blog.csdn.net/xiaomucgwlmx/article/details/103204274 RTP:实时传输协议(Real-time ...

  9. 最全流媒体协议详细总结介绍(RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL) /SDP)

    RTP:实时传输协议(Real-time Transport Protocol)          RTP是一种基于包的传输协议,它用来传输实时数据.在网络上传输数据包的延迟和误差是不可避免的,对此R ...

最新文章

  1. python中json的使用
  2. “北航Clubs” Beta版本开发目标
  3. 去除tab、空格、回车符等使用replace语句
  4. 自动化运维平台中的统一认证接入与单点登录实现
  5. 操作系统饥饿现象_操作系统复习
  6. maven之pom深入
  7. Tensorflow 2.0 打印 Tensor
  8. 《CLR via C#》读书笔记 之 泛型
  9. 软件需求工程与UML建模——第九组第六周工作总结
  10. thinkphp与传统php,老生常谈php中传统验证与thinkphp框架(必看篇)
  11. WEBPACK+ES6+REACT入门(2/7)-在项目中使用react以及JSX语法介绍
  12. 关于在线答题系统设计的一些想法
  13. 种群竞争模型 --- (Lotka-Volterra模型) Logistic回归
  14. 横向扩展文件服务器,如何在 VMM 中创建横向扩展文件服务器
  15. 推荐花椒直播服务端的 4 个开源项目
  16. LINKERD 2.11 中文实战手册
  17. 今天准备出发去珠海横琴,去长隆海洋乐园看鲨鱼宝宝了
  18. 服务于离群点检测的无监督特征选择值-特征层次耦合模型
  19. 超实用的新加坡两日游攻略来啦
  20. JS判断客户端是否是iOS或者Android手机移动端

热门文章

  1. Coursera | Introduction to Data Science in Python(University of Michigan)| Assignment1
  2. 离散数学:数学语言与证明方法(练习题)
  3. 推箱子游戏java毕业答辩ppt_基于Java推箱子游戏的设计与实现
  4. CV-2022:CodeFormer【最强的AI 视频、图片修复】【南洋理工大学 S-Lab】
  5. JS将秒数换算成时分秒 以及转化为年月日 时分秒以及多长时间以前
  6. Eclipse如何查看jdk源码
  7. 微信小程序web-view使用audio标签播放音频文件时无法自动播放的问题
  8. html图片背景属性,css 背景(background)属性、背景图定位
  9. 树梅派应用47:用树莓派给智能手机发送推送通知
  10. 【机器人基础】机器人阻抗控制概念