当前位置: 首页 > 工具软件 > IETF SDP > 使用案例 >

网络流媒体--SDP会话描述协议(RFC-4566)

衡翰翮
2023-12-01

1、SDP协议简介

SDP(Session Description Protocol)是为了描述多媒体会话而设计的,主要用来描述会话通告,会话邀请或者其他形式的多媒体会话初始化。为了初始化多媒体会话,需要对参与者提供媒体信息、传输地址以及其他与会话有的描述性的源数据,SDP为了描述这些信息提供了一个标准的形式。SDP只是一个单纯的会话描述的格式,他并不包括传输协议,在不同的场合SDP可以应用于不同的传输协议,如SIP,RTP等等;在网络流媒体中,常见于SIP和RTSP使用SDP描述。一般来说,SDP会话描述包含以下基本内容:

  • 会话名字和目的;
  • 会话持续的时间;
  • 会话的媒体类型;
  • 接受这些媒体数据所需的信息,包括地址、端口和格式等。

2、SDP协议会话描述

一个SDP会话描述是通过“application/sdp”来标识的,SDP会话采用UTF8编码,一个SDP会话描述一般包括如下若干行文本形式:
<type>=<value>
其中,type是一个区分大小写的字母的形式,value是一个结构化的文本,其形式取决于type,通常,value是由若干分隔符分开的字段组成,或者是一个字符串,其中“=”两边都不能有空格。一个SDP包含一个会话层部分,后续跟0个或者多个媒体层部分,会话起始于“v=”行,直到第一个媒体层部分。每个媒体层起始于“m=”行,直到下一个媒体层的开始或者直到SDP结束,通常,会话层的属性是全局的,除非媒体层被重写。
SDP会话某些行是必选的,某些行是可选的,但是出现的顺序必须如下所示,可以行用 * 标识。

  • 会话描述:
    v= (协议版本)
    o= (会话标识符)
    s= (会话名称)
    i=* (会话信息)
    u=* (URI标识)
    e=* (邮箱地址)
    p=* (电话号码)
    c=* (连接信息,)
    b=* (带宽信息)
    z=* (时域调整)
    k=* (加密秘钥)
    a=* (0个或者多个会话属性)

  • 时间描述:
    t= (会话有效时间)
    r=* (0个或者多个重复时间)

  • 媒体描述:
    m= (媒体名字和传输地址)
    i=* (媒体标题)
    c=* (连接信息)
    b=* (带宽信息)
    k=* (加密秘钥)
    a=* (媒体属性)

  • 注意:
    <type>的字母为小写字母并且不可扩展,SDP解析器如果碰到不认识的<type>,必须忽略它,属性机制(“a=”)是SDP扩展的主要手段。某些属性是已经被定义好的,而另外的则是在特定应用、媒体格式规范中才进行定义。SDP解析器必须忽略它不认识的属性。

3、关键SDP字段描述

下面对SDP协议各个字段详细介绍:

(1)协议版本(“v=”)

v=0
"v="字段给出了SDP的版本,当前规范的版本是0,这个版本没有小版本号。

(2)源(“o=”)

o=<用户名><会话ID><会话版本><网络类型><地址类型><单播地址>
"o="字段给出了当前会话的发起者,会话标志和版本号的信息。

  • <用户名>:是登陆源主机的用户的名字,如果不能提供,则用"-"表示,用户名不能包含空格。
  • <会话ID>:是一个数字字符串,<用户名><会话ID><网络类型>和<单播地址>这个组合形成了表示该会话的唯一标识,<会话ID>通常使用NTP格式的时间戳标识。
  • <会话版本>:是当前会话描述的版本号,如果当前会话的数据被修改时,这个版本号会递增,同样推荐使用NTP格式的时间戳。
  • <网络类型>:是一个文本字符串,标志当前网络的类型,最初"IN”标识"Internet",未来可能会定义其他的值。
  • <地址类型>:是一个文本字符串,标志当前地址的类型,最初只有"IP4"和"IP6"有定义,未来可能定义其他的值。
  • <单播地址>:是创建会话的主机的地址,可以是域名,也可以是"IP4"或"IP6"IP地址。域名是首先,除非域名不可获得。如果使用IP地址,则需要使用全球唯一的IP地址,不能使用本地IP地址。

(3)会话名字(“s=”)

s=<会话名字>
字段"s="是文本类型的会话名字,每个会话描述有且仅有一个"s="字段,"s="字段不能为空,并且应该为ISO 10646字体。如果一个会话没有有意义的名字,则此字段应该为一个空格。

(4)会话信息(“i=”)

i=<会话描述>
"i="字段提供会话的文本信息,在会话层和媒体层最多出现一次。

(5)统一资源描述(“u=”)

URI是统一资源描述符,用户www的客户端。URI标志的是有关会话信息的外部的一个指针。这个字段是可选的。但是如果一旦出现,就必须先于第一个媒体轨出现,并且不能多于一个。

(6)电子邮件和电话号码(“e=” “p=”)

e=<电子邮件地址>
p=<电话号码>
这两个字段描述了会议拥有者的联系信息。这个并不一定标识的是发起会话的那个人,这两个字段都是可选的,需要注意的是在前一个版本的规范中,这两个字段必须出现一个,但是现在这个版本中,这个限制去掉了。如果出现两个字段,则必须先于第一个媒体轨出现,这两个字段都可以出现多次。

(7)连接信息(“c=”)

c=<网络类型><地址类型><连接地址>
这个字段包含连接数据,一个会话描述必须在每个媒体层都包含"c="字段或者在会话层包含一个"c="字段。如果这两个层都出现的话,则媒体层出现的"c="会覆盖会话层出现的"c="字段的值。

  • <网络类型>:是一个文本字符串,标志当前网络的类型,最初"IN”标识"Internet",未来可能会定义其他的值。
  • <地址类型>:是一个文本字符串,标志当前地址的类型,最初只有"IP4"和"IP6"有定义,未来可能定义其他的值。
  • <连接地址>标志连接的地址,当<连接地址>为IP4或者IP6时,连接的定义如下:
    i)当回话是多播时,地址为多播地址;当会话是单播时,地址为单播地址,并且为媒体数据的原地址。
    ii)如果地址是IPv4,则还需要给出TTL的值,TTL标识包的生存时间,范围是0~255.

(8)带宽(“b=”)

b=<带宽类型>:<带宽值>
这个字段的意识是本会话或者媒体需要占用的带宽

  • <带宽类型>:本规范制定了两种带宽类型,分别如下:
    i)CT(Conference Total)表示多会话广播中会话或者媒体使用的最大带宽建议值,CT值相当于所有会话带宽值。
    ii)AS(Application-Specific)是指具体某个应用程序所占用的总带宽建议值,相当于最大应用程序带宽值,它仅值单媒体在单点所占用的带宽。
  • <带宽值>:单位是kbit/s。

(9)时间信息(“t=”)

t=<起始时间><结束时间>
"t=“子弹标志了会话的起始时间和结束时间,如果会话在不规则的多个时间段内有效,则可能会出现多个字段的"t=”。如果时间段是规则的,则应该使用"r="字段,后面将会介绍。

(10)重复时间(“r=”)

r=<重复的间隔><持续时长><相对起始时间的偏移链表>
字段"r="标志会话的重复时间。例如:一个会话的有效时间为每个星期一早上10点和星期二上午11点,每次持续一个小时,总共三个月。则字段"r="的<起始时间>为第一个星期一的早上10点,<重复间隔>为一个星期,<有效时长>为1个小时,<相对起始时间的偏移链表>为0和25。字段"t="的<结束时间>为三个月后。缺省情况下,单位都为s。
因此"r="和"t="字段如下:
t=3034423619 3042462419
r=604800 3600 0 90000
通常为了紧凑的表示,也可以使用天、小时、分钟为单位例如r=7d 1h 25h

(11)时域(“z=”)

为了在夏令时和标准时间之间转换,有必要知道对基准时间的偏移量。为了标识一个会话在夏天和冬天的一个时间,有必要指出是哪个时域的。"z="字段允许列举一系列基于基准时间的调准时刻及其偏移量。如:
z=2882844526 -1h 2898848070 0
这表示在时刻2882844526,基准时刻需要往前调1个小时;在时刻2898848070则不需要调准。

(12)加密秘钥(“k=”)

k=<方法>
k=<方法>:<秘钥>
如果在一个安全信道上进行传输,则可以通过SDP来传达秘钥,最简单的方式采用字段"k="来协商,不过这种方式已经是不推荐的了。
字段"k="可以在所有媒体轨之前,这表示应用于所有的媒体轨,或者单独用于某个媒体轨,本规范定义了如下几种方式:

  • k=clear:<秘钥>
  • k=base64:<编码后的秘钥>
  • k=uri:<URI,通过此来获得秘钥>

(13)属性(“a=”)

a=<属性>
a=<属性>:<值>
属性是扩展SDP的主要方式,有会话层属性和媒体层属性。会话层的属性应用于所有的媒体轨,媒体层的属性只应用于当前的媒体轨。
属性有两种方式:

  • 特性属性:以a=<特性>表示,比如:a=recvonly
  • 值属性:以a=<属性>:<值>表示,比如:a=orient:landscape
    属性的名字必须使用US-ASCII子集,属性的值是字符串,出了0x00,0x0a,0x0d这是哪个字符外。缺省情况下,会使用UTF-8字体集,这个字段是唯一不受"a=charset"影响的。

(14)媒体描述(“m=”)

m=<媒体类型><端口><协议><格式类型>
一个会话描述可能包括多个媒体描述。每个媒体描述都以"m="字段开始的,结束于下一个"m="或者整个会话结束。

  • <媒体类型>:本规范定义了视频、音频、文本、应用和消息这几种类型。
  • <端口>:被房媒体流的端口,这个字段的意义依赖于"c="字段和<协议>字段。如果不适用连续的端口或者没有按照偶数RTP端口,奇数RTCP端口,则必须使用"a=rtcp:"来标识RTCP的端口。应用程序被发送到一个端口,此端口是一个奇数端口,并且出现”a=rtcp:”行时,此媒体一定不能从RTP端口减一,应用程序必须发送RTP数据到指定的端口,并且发送RTCP到”a=rtcp”属性设定的端口。对于某些应用程序,它们的媒体流通过层级解码发送到单播地址时,它们有必要设定多个传输端口。使用语法和多播地址的方式类似: m= / …。这种场景中,使用的端口依赖于传输协议类型。一些读者可能明白,通常默情况下,RTP使用偶数端口传输数据,它的RTCP使用高一位数的奇数端口控制RTP会话。表示RTP会话数量。
  • <协议>:它是传输协议。这里的传输协议依赖于”c=”行定义的地址类型。目前支持的主要的几个类型包括:UDP,RTP/AVP,RTP/SAVP。这里专门针对媒体格式设定不同的传输协议是因为同一网络协议时,标准的媒体格式可以通过不同的传输协议来进行传输。这样的设定可以支持不同的网络传输和满足不同检测工具部署。
  • <格式类型>:它表示一种媒体格式描述。前面第四个子项或者其他后续子项都表示媒体格式。媒体格式描述的解析依赖于子项的值。如果 子项是”RTP/AVP”或者”RTP/SAVP,媒体格式描述会包含RTP payload 类型号码。当给定了一个payload类型列表时(静态方式,从96-127),这表示所有的媒体格式可以适用于此会话中,但是,通常列表中的第一个格式应该作为此会话默认支持格式。如果payload类型列表是动态的payload类型列表的话,SDP使用”a=rtpmap:”属性来执行一个映射(从RTP payload 类型号码到媒体解码名称),通过媒体类型号码到媒体解码名称的对应关系来确认payload格式。”a=fmtp:” 行可以用来设定具体的媒体格式参数。

3、SDP协议属性

除了我们前面介绍的会话描述和媒体描述说明以外,SDP以支持了特征属性的拓展,通过拓展的属性可以支持更多的属性参数。SDP属性支持了会话级和媒体级属性两种。会话级属性顾名思义,它是针对会话层级的属性,媒体级属性针对媒体属性设置所设置的属性。下面介绍几种常用的扩展属性。

  • a=ptime:包的时长
    这个属性给出了每个媒体包的时长,以毫秒为单位,者通常只用于音频数据,当然如果在其他情况下也有意义,也可以使用。对于解码来说,这不是一个必要的属性,它通常作为编码/打包的时长的建议,这是一个媒体层的属性,不依赖于字符集。
  • a=rtpmap: / [/] 媒体负载匹配属性
    这个属性是用来匹配RTP负载编号和编码负载格式。它也提供时钟频率和编码参数,这是一个媒体层的属性,不依赖于字符集。
  • a=recvonly 只接受模式
    这个属性标志工具应使用只接受模式。这个属性可能术语会话层,也可能属于媒体层,不依赖于字符集。注意,recvonly只用于媒体,不用于控制协议。
  • a=sendonly 只发送模式
    这个属性标志工具应使用只发送模式。在某些情况下,双方通信可能一方只发送,一方只接受,这个时候使用这个参数。这个属性可能术语会话层,也可能属于媒体层,不依赖于字符集。注意,sendonly只用于媒体,不用于控制协议。
    其他的扩展属性请参考RFC4566

4、应用举例

下面是GB28181使用sdp协议发送的数据格式,可以参考上述讲解进行分析:

v=0
o=34020000001320000001 0 0 IN IP4 172.16.10.22
s=Play
c=IN IP4 172.16.10.22
t=0 0
m=video 15062 RTP/AVP 96
a=setup:active
a=sendonly
a=rtpmap:96 PS/90000
a=username:34020000001320000001
a=password:12345678
a=filesize:0
y=0365961830

参考文档:
《RFC4566 https://datatracker.ietf.org/doc/html/rfc4566》

 类似资料: