9-WebRTC的SDP

SDP规范

       SDP的规范非常简单,它会将SDP分成两层,

第一层是会话层,会话层就相当于我们写程序时候的一个全局变量,我们写程序的时候有全局变量有局部变量,当局部变量没有设置的时候,那么我们这个全局变量在全局内都是有效的,我们在自己的函数里设置了局部变量,那么局部变量会覆盖全局变量,它也是这样一个层级关系,这个会话层就相当于全局变量的一些东西;

第二层是媒体层,媒体层就相当于我们自己 的一个个函数,或者按照SDP 的理解就是一个个媒体,比如一个音频流一个视频流,每一路视频每一路音频都是一个媒体层,那会话层是全局的,就是一旦设置了以后在全局内有效,在你媒体层没有设置自己的属性之前就可以使用全局层的。但是如果你设置了自己的 特殊的描述,那你就按照你这个媒体自己的描述,它就是这样一个简单的概念。

你可以把它想象成一棵树,那么树根就是会话层那么很多树干就是媒体层。

首先我们看看会话层都包括哪些内容

会话层

1 会话的名称与目的

2 会话的存活时间

3 会话中包括多个媒体信息

       会话层包含了基本的名称和目的,另外一个还有个存活时间,这个会话时间作用稍微大些,如果设置了十分钟 ,那么会话就是十分钟,设置二十分钟就是二十分钟,对于我们音视频传输来说呢,一般我们都睡设置成0,表示无限期,表示会话一直存在,不会主动将它结束掉,这两个就是会话层。没有太多的重要信息。

        那么重要的信息都包括在媒体层,也就是在一个会话层中,包含了多个媒体信息。

媒体层 

1 媒体格式  媒体信息首先有媒体格式,是音频还是视频还是应用数据,

2 传输协议  是IPV4还是IPV6,TCP还是UDP

3 传输IP和端口 具体使用的Ip地址和端口,对于webrtc来说,端口和ip并不少SDP这里描述的,它会使用专门的ICE收集到的candidate里面的IP地址和端口,所以在媒体信息中的这个IP地址和端口价值并不是很大,但是对于其他的非webrtc使用SDP就比较有意义。

4 媒体负载类型  你是VP8还是VP9还是H264还是H265,这些都是媒体的负载类型

SDP格式

由多个=组成

SDP都是由多个类型和值组成的,另外一个是只有一个会话层,每个SDP描述的都是一个会话,但是这个会话中是包含了多个媒体的描述信息,那么会话描述的具体内容我们看看

v = (protocol version) // 版本,一般是0,这里是说我们SDP使用的版本

o = (owner/create and session identifier) // 这个是创建的session的一个id标识

s = (session name) // session name可以不写,当不想写的时候写一个-,它就代表一个session name

c = *(conn info - optional if included at session-leve) // 连接相关的一些信息,我们整个会话的IP地址和端口号,以及这个地址类型是IPv4还是IPv6,还有这个网络类型,是互联网还是其他网络,这些都通过c可以设置,但这个其实在每个媒体中都会自己设置,所以会话层这个c意义也不大

a=*(zero or name session attribute lines) // 这个a代表设置一些全局的属性,这个其实 用处也不大,这个就是整个会话层的描述,所以大家对这个有一个基本的了解就可以了。

一提到v、o、s、c、a能够知道他们在会话层具体的含义是什么就够了。

时间属性,

Time Description

t = (time the session is active) // 表示存活的时间

r = *(zero or more repeat times) // 表示重复的次数

我们再来看媒体层

m = (media name  and transport address) // 媒体层就表示媒体的名字和传输地址

c = *(conn info - optional if included at session-leve)  // 媒体层也包括了传输相关的信息

b = *(bandwidth information) // 表示传输里的带宽信息是什么,多大 带宽可以设置

a = *(zero or name session attribute lines) // 还有一堆的属性,就是对m具体的解释,SDP复杂就在a的类型特别多,我们后期会对a作一个详细的介绍,对于整个媒体来说也非常简单,我们怎么来记忆,既然是媒体,它肯定和传输有关,传输要作一个限制,那么主要是对带宽的限制。那么另外的对这个媒体还有很大进一步的解释,通过这个a来解释

那么下面我们就来具体看看我们上面所讲的内容

字段含义(一)

Version必选

v=0 SDP的版本好,不包括次版本

Session Name必选

s = 会话名,s = - 表达忽略会话名

字段含义(二)

Origion/Owner必选

o =

例子: o=- 7017624586836067756 2 IN IP4 127.0.0.1

字段含义(三)

连接相关的包括

Connection Data可选

c=

例子:c=IN IP4 0.0.0.0

字段含义(四)

媒体相关的比较重要

Media Announcements必选

m = // 具体媒体类型、端口、传输地址、负载类型

例子:m=audio 1024  UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126

字段含义(五)

属性

Suggestted Attributes可选

a=或a=:

例子: a=framerate:<帧速率>

字段含义(六)

rtpmap可选

a=rtpmap:/[/]

rtpmap修饰的是payload type,对于不同的payload type,比如说vp8,它的这个编码名称、采样率是多少,包括一些编码的参数,都可以在这里设置

例子: a=rtpmap:103 ISAC/16000 // 就说明它的编解码器103对应的ISAC,使用频率是每秒钟采样16000次

字段含义(七)

fmtp也比较重要,这个是对rtpmap的参数作进一步的说明

fmtp可选

a=fmtp: parameters

例子:a = fmtp:103 apt=106 // 比如它这里是103的ISAC,那它这个是需要关联的,它与106这个payload type进行关联,也就是103与106进行关联

那么以上就是SDP的一个大体的规范,从我们刚刚描述的规范来看,其实蛮简单的,就是它将整个描述分成两层,会话层和媒体层,会话层是全局唯一的,描述的一些基本信息,意义不大,最重要的是媒体层,媒体层中描述了媒体的类型是音频还是视频,那么你的传输相关的地址类型是IPV4还是IPV6还有端口以及payload类型也就是媒体都支持哪些编解码器,对于每一种编解码器可以作进一步指定,通过Attribute属性来指定,那么在属性里有两个重要的类型,一个是rtpmap,在这里可以定义payload和编解码器的对应关系以及它的采样率等基本信息。那如果还需要进一步说明的话,我们就可以利用Attribute的fmtp作进一步说明。

那么以上就是整个SDP的规范。

WebRTC中使用的SDP

       在WebRTC中使用SDP相比正常的SDP规范有一些出入,那主要是为了让SDP更能适应WebRTC里面的一些设置以及会话的描述,那么下面我们来看一下,在WebRTC中的SDP组成是包括了5部分

第一部分是会话元也就是会话层,这个与上节所讲的是一致的。它是最不重要的。

第二、另外它有专门的网络描述信息,而不是利用以前SDP规范中媒体层的Ip地址和端口了,所以它要单独的进行网络端信息描述。

第三个以前在SDP中是没有的,这个是流的相关的描述,那么在 WebRTC中它将这个视频音频,每路视频每路音频都形成一个音频轨和视频轨,然后最终形成一个流,将音频轨、视频轨放入一个流中作处理。以前的SDP正常的规范就没有流相关的信息。

第四个是一些安全相关的描述,因为webRTC最主要的愿景是在浏览器与浏览器之间快速的创建音频与视频的应用,那么在浏览器中安全性就非常的重要,包括你是否有权利打开这个音频设备,那么在整个浏览器的数据传输之间你的数据的安全性这些都是非常重要的,所以它又加了这个安全相关的描述。

第五个再有的就是服务质量,在整个传输的过程中,网络的质量如何,会不会影响我这个视频音频 整体的感受,那么音频与视频的质量实际与这个传输的质量是密切相关的。

所以WebRTC的SDP就有五大部分组成了。网络描述、流描述、安全描述、服务质量这四大类实际是非常关键的。那下面我们就来看看每一项

  

会话元包括v=、t=、o=

网络描述包括c=、除了包括原始的这个c之外它还包括一个candidate,candidate通过属性a去描述,所以这个就特别重要,a能用到各种各样的地方。我们描述一个网络的属性candidate,那么网络主要是这两部分,一个是c一个是candidate

流描述里面实际就是m媒体,在webRTC中把整个流当作一个媒体来看待,那么多个媒体可以绑定到一起,首先的是m(media),然后紧接着是它的属性a=rtpmap,对m这个的进一步的说明。还有一个是对每一个payload type格式的详细的设置a=fmtp,这也是一个属性。这就是流相关的一些描述。

安全描述 第一个是使用的算法,加密算法是通过属性a=crypto,那么整个WebRTC是通过整个ICE收集的整个网络地址和连通性检测,最终选出一个最有效的路径来,那么选出这个最有效的路径怎么知道这两台机子的会话是合法的呢?那就是通过这个a=ice-frag,它代表的是一个用户名的片段也就是整个用户名需要加一个片段,还有一个是a=ice-pwd,那就是通过这个ice-frag和ice-pwd然后对这个用户进行连通性检测的时候,对这个用户进行判断,也就是如果我通过SDP将对方的frag和pwd传给你,那当真正建立连接性检测的时候,它就通过这个密码去验证,跟你连通的时候我将这个ice-frag和这个ice-pwd传给你,传给你之后如果你验证通过了,那说明咱们确实是应该建立连接的,那如果你是一个第三方,你想和我进行偷偷的连接,我传给你的用户名和密码,然后你在给我发回来,发出来的用户名和密码与我真正放出去的用户名和密码是不一致的,那说明你是一个非法用户。通过这种方式来保证整个链路的连接是安全的。这就是安全描述。还有一个就是a=fingerprint也就是指纹,那指纹是用来干什么的呢?指纹就是用来我们进行数据加密的时候,来验证这个证书的。那它首先通过信令层将SDP中的证书的指纹下发给对方,那么下次对数据加密的时候跟之前的它进行一下数据证书的交换,交换证书的时候通过的是DPLS,那么通过DPLS进行证书交换的时候,通过这个指纹去验证你这个证书的有效性,那如果这个证书验证是有效性的,然后后面你才能进行数据加密然后进行传输。如果通过指纹这个证书不匹配,那说明你这个连接也是有问题的。那这个时候就不能进行传输。通过以上种种方式呢,在打通的时候进行一次验证,在传数据的时候在交换证书的时候也要进行验证,那么通过这个层层的安全的验证,才能保证整个webRTC传输的安全性。以上就是安全性相关的一些描述。当然最后进行算法加密的时候你可以使用这个a=crypto指定的加密算法,也可以通过DPLS交换的证书里的指定的加密算法进行加密,那就是具体的加密算法 了,就是另外的话题了。

服务质量 那么对于WebRTC它的整个服务质量包括网络质量的反馈,包括丢包重传的反馈,那么这些是通过a=rtcp-fb进行信息的反馈,通过这个信息反馈无论是发送方还是接收方,它的这个网络质量的是什么样子的,然后我使用的评估方法是什么?这些它都可以获取到的,所以这个就是用户服务质量的rtcp-fb,那它里面有很多的参数 ,后面我们讲具体的例子的时候,大家会看到。a=group是可以将多个音频媒体绑定到一起形成一个媒体流,比如说音频和视频绑定到一起,那它们可以用同样的数据通道,底层的网络通道是可以复用的,他们绑定一起就可以复用,就是通过这种方式。

像这些网络安全和服务质量的都属于attribute属性的描述,作进一步说明的,所以说SDP复杂在哪呢?就是它的整个规范并不复杂,但是你真正用的时候就可以通过这个属性attribute去作各种各样的限制,那么这个时候每一套限制都有一套这个规范,这样就增加了这个SDP的复杂性,但是实际如果你了解了这个整个的过程的话,了解它这个整个规范的话其实就很容易理解它了。还有一个是a=rtcpmux复用,也就是这个rtcp与这个rtp复用同样的网络地址和端口,一般情况下这个rtcp与rtp的端口是不一致的,比如说我的rtp端口是1024,那么一般rtcp就是在rtp的端口号加1是1025,那么你如果设置了这个属性之后那么rtp和rtcp就复用了同一个端口,这个就是服务质量相关的,那么通过这个质量介绍。

那么就可以看到WebRTC的SDP是由5大部分组成。

WebRTC Offer/Answer SDP

m及m以下是媒体层

以上就是offer的一个SDP的认识。

你可能感兴趣的:(webrtc,webrtc)