1、SDP的引入
SDP最初用于Mbone(组播骨干网)上的多媒体会议。Mbone 是Internet 的一部分,它的主要特征是对IP组播技术的使用。IP组播技术比较适合实现多方会话。
基于组播的会议称为松耦合会议(loosely coupled conferences),它的主要特点是:1)基于组播地址完成多方之间的媒体传送,每个参与方都向指定的组播地址发送媒体,并且都能接收到发往该组播地址上的媒体;2)参与方之间没有紧密的信令关系,没有控制中心点或会议服务器。
松耦合会议的建立过程比较简单,基本上完全由会议创建者来完成,具体来说分两步:1)申请会议所需的组播地址,并确定会议的媒体构成以及每个媒体的格式的连接端口号;2)以某种形式描述这些信息,发布出去,参与者获得这些信息后,即可据此加入这个会话。
显然在松耦合会议的建立过程中,对会话信息的描述是非常重要一步。必须要有一种标准规范的形式来进行会话描述,这样才能保证会议创建者和参与者能够对一个会话描述有一致的认识。在IETF RFC2327中定义了SDP(会话描述协议),用来完成对会话的描述。通常,将基于SDP描述的会话信息称为SDP描述。SDP描述中包含了构成会话的媒体,媒体流的连接地址等信息。根据一个SDP描述,用户即可加入一个会话。
具体来说,一个SDP描述主要包括:会话名、会话目的、会话有效时间、构成会话的媒体及接受这些媒体的信息 (地址、端口、格式)等等 。
一个简单的SDP描述的例子如下:
v=0
s=SDP Seminar
c=IN IP4 224.2.17.12/127
t=3034423519 3042462419
m=audio 49170 RTP/AVP 0
m=video 51372 RTP/AVP 31
这个例子描述了这样一个会话:会议的标题是“SDP Seminar”,即“SDP研讨会”;会议使用连接地址是一个IP播组地址:224.2.17.12;会议的开始时间是3034423519,结束时间是3042462419;会议由音频和视频两种媒体构成,使用的传输端口分别是49170和51372。
得到这个SDP描述后,参与者只需加入到播组地址(224.2.17.12)指定的多播组中,并以指定的媒体格式向指定的端口上发送音频和视频即可参加会议。
在松耦合会议中,完成了会话描述后,会话描述的发布相对比较简单,实际上在不同的情况下可有有多种方法可用,例如HTTP、MIME扩展的Email等等。
2、SDP规范简介
SDP会话描述完全是纯文本的,使用ISO 10646 字符集,UTF-8 编码。
形式上一个SDP 会话描述包含若干行以下形式的文本:<type>=<value>
<type> 恰好是一个字符,并且是大小写敏感的。<value> 一个结构化的文本字符串,其格式依赖于<type>。它通常也是大小写敏感的,除非特定的域有明确定义。通常 <value> 或者是若干以单个空格分界的字段,或者是一个自由格式的字符串。
内容上,一个会话描述包括一个会话级部分,后面跟随0个或多个媒体级部分。会话级部分以 `v=' 行开始,直到第一个媒体级部分。媒体描述以 `m=' 行开始,直到下一个媒体描述或整个会话描述的结束。
具体来说一个会话描述的构成如下:
注意,一些描述行是必需的,一些描述行是可选的,但是所有的出现的行必须以上面给出的顺序出现。可选描述行以`*'标记。
下面介绍一下主要的描述行。
"v=" 行:给出SDP的版本。例如 v=0
"s=" 行:给出会话名。每个会话描述中必须有且仅有一个会话名。例如 s=SDP Seminar
"o=" 行:给出会话的发起者信息(用户名、主机地址),以及会话标识和会话版本号。具体形式为:o=<username> <session id> <version> <network type> <address type> <address>。其中:
- <network type> 文本串给出网络类型。最初定义的是"IN",含义是指"Internet"。<address type> 文本串,给出之后的地址的类型。最初定义了 "IP4" 和 "IP6"两种类型。
- <address> 是创建会话的机器的地址。
- <username> 是登录在发起主机上的用户的名。
- <session id> 是一个数字串。<session id> 的分配方法取决于会话描述的创建工具,但是SDP规范建议使用NTP时间戳以保证其唯一性。
- <version> 是会话描述的版本号。同样,它的使用取决于会话描述创建工具,只要保证修改会话数据时<version>是递增的即可。同样,推荐使用NTP时间戳。
一般来说,"o=" 域唯一的标识了本会话描述的当前版本。
"c=" 行:给出连接参数。具体形式为:c=<network type> <address type> <connection address>。其中:
- <network type>是网络类型。最初定义的是"IN",含义是指"Internet"。
- <address type> 是地址类型。这允许SDP被用于不是基于IP的会话。当前只定义了IP4。
- <connection address>是连接地址。可选的附加子域可以加在连接地址后面,这取决于 <address type> 域的值。地址类型是 IP4 的情况,典型的连接地址将会是D类的 IP 多播组地址。使用IP多播组地址作为连接地址时必须增加有一个会话的存活时间 (TTL) 值TTL 值范围是 0-255。。TTL 和IP多播组地址一起定义了会议中的多播包发送的范围。会话的TTL加在地址的后面,通过一个斜杠分隔。
一个例子:c=IN IP4 224.2.1.1/127。
"m="行:给出对媒体流的描述。其形式为:m=<media> <port> <transport> <fmt list>。其中:
- <media>给出媒体的类型。目前已定义的媒体类型有 "audio"、"video"、 "application"、 "data" 和 "control"。将来可能会由于新的通信形式(例如, telepresense)的出现而扩展新的媒体类型。
- <port>给出接受媒体流传输端口。传输端口的含义取决于在相关的"c=" 行中指定的网络类型,后面的<transport>中给出的传输协议。比如,对于基于UDP的端口,端口值范围为[1024 ~65535] 。为了符合RTP,应该是偶数。例如:m=video 49170/2 RTP/AVP 31 指定49170端口 和 49171端口形成一个 RTP/RTCP 对,49172 端口 和 49173 端口形成第二个 RTP/RTCP 对。
- <transport> 给出传输协议。传输协议值依赖于 "c=" 域的地址类型。对于 IP4,绝大多数媒体流通过 RTP/UDP传送。
- <fmt list> 给出媒体的格式列表。对于 audio 和 video,通常会有媒体净荷类型在 RTP Audio/Video Profile 中定义。当一个格式列表被给出时,这暗示了其中指定的格式的可能被用于这个会话,但是第一个格式是这个会话的缺省格式。例如 m=audio 49230 RTP/AVP 96 97 98 中给出了三种媒体格式96 97 98。
3、总结与后继
SDP最初被用于描述基于多播会话的松耦合会议中,但目前更广泛地应用于点到点的两方会话中。
在松耦合会议中,会话参数完全由会议创建者来确定,参与者能做的仅仅是根据这些会话参数来加入会议(当然也可以选择不加入)。这种情况下,主要要做的就是会话描述,在这里SDP本身就足够了。
但是在更为普遍的两方会话的情况下,由于用户终端能力的差异,任何一方不能假设对方一定支持某种会话参数,所以必须双方协商来最终就会话的参数达成一致。显然,SDP能做到准确的描述会话的参数,但是它缺少双方如何根据各自提供的会话描述形成最终一致的会话描述的语义及操作上的细节。在RFC3264中定义了一个基于SDP的简单的提议/应答模型来实现这一点。
本博客将会有后继的文章介绍基于SDP的提议/应答模型,敬请关注。
http://blog.sina.com.cn/s/blog_6b10255301012eoq.html