SDP协议总结

时间:2024-03-27 20:22:35

一、基本要求

1、SDP的表示

SDP(Session Description Portocol)会话描述协议,通常通过内容类型为"application/sdp"的MIME来表示。

2、媒体和传送信息

SDP可包括以下媒体信息:

  • 媒体类型(音频、视频等);
  • 传送协议(RTP/UDP/IP, H.320等);
  • 媒体格式(H264视频,AAC音频等);
  • 传输地址和端口;

二、语法内容

1、SDP编码

SDP完全是文本形式的,采样UTF-8(RFC 2044)编码的ISO 10646字符集。选用文本形式,是为了提高便携性和传送方式的多样性。由于声明会通过不可靠的方式来传送,或是被中间缓存服务器损坏,所以编码在设计时,就具有非常严格的顺序和格式规则,这样,即使存在会导致声明的格式异常的错误,也能轻易的检测出来并将其丢弃。

2、SDP语法结构

一个SDP会话描述由多个形式为<type>=<value>的文本行组成。
<type>是一个大小写敏感的字符。
<value>是一个结构化的文本串,它的格式由<type>决定,也是大小写敏感,除非有特定的字段另作定语。
=两边不能有白空格,一般是多个由单空格字符分割的字段,或者是一个任意格式的字符串。
一个会话描述包含一个会话级描述(应用于整个会话和所有媒体流)和多个可选的媒体级描述(仅应用于单个媒体流)。
一个声明包含一个会话级部分,并尾随零个或多个媒体级部分。会话级部分以v=行开头,紧跟着第一个媒体级部分。媒体级描述以m=开头,后跟下一个媒体描述,或者整个会话的结尾。会话级的值对所有的媒体来说是缺省的,除非媒体级部分定义了相同的字段值。

会话级描述(1个,以"v="行开头)
媒体级描述(0个或多个,以"m="行开头)

3、会话描述的文本行

每一个描述,有些行是必须的,而有些是可选的。但所有行必须严格按照表1、表2、表3中指定的顺序给出。固定顺序可以增强检错能力和降低解码要求。
SDP协议总结
如果声明中含有SDP解析器不能理解的type类型,SDP解析必须完全忽略这个声明。
属性机制a=是扩展SDP的基本途径。有些属性有特定的含义,会话必须忽略任何它不认识的属性。

3.1 协议版本(必选)

v=0
v=字段给出了SDP协议的版本。最小版本是0。

3.2 会话发起者(必选)

"会话发起者"行的语法格式如下:
o=<username> <sess-id> <serr-version> <nettype> <addrtype> <unicast-address>
共6个部分,每部分以单空格区分。
<username>始发主机用户名,如果始发主机不支持用户标识的概念,则该字段填“—”<username>中不能包含空格。
<sess-id>是一个数字串。建议使用时间戳以保证唯一性。
<sess-version>当前会话描述的版本号。如果会话数据做了修改,则这个会话的版本号要增加,具体做法取决于开发工具。建议但不强制要求使用时间戳。
<nettype>描述网络类型。目前先定义"IN",它表示互联网,其他值待定。
<addrtype>描述网络地址类型,这里先定义两种取值:"IP4""IP6"
<unicast-address>描述创建会话的主机地址。
总之,o=给出了这个版本会话描述的全球唯一标识。

3.3会话名(必选)

s=<session name>
s=字段描述会话名称,是基于文本的。每个会话描述中有且仅有一个s=字段,且不能为空。如果一个会话没有实际意义,可以这样表述:s=(通过一个空格来表示会话名称)。

3.4连接数据(可选)

c=<nettype> <addrtype> <connection-address>
一个会话描述必须在每个媒体描述中包含一个c=字段,或者必须包含一个会话级的c=字段。也可以是包含一个会话级的c=字段并在每个媒体描述中包含一个附加的c=字段,这种请求,对于相关的媒体,优先使用媒体描述中的取值。
<nettype> 网络类型,用"IN"表示互联网,将来也可能会定义其他值。
<addrtype>地址类型,目前只定义了"IP4""IP6"
<connection-address>IP地址

3.5时间设置(必选,至少1个)

t=<start-time> <stop-time>
t=字段明确了一个会话的开始时间和结束时间。
如果停止时间设成0,则会话是无下限的,但在会话开始前不会被**;如果开始时间也是0,则认为会话永远存活。

3.6属性(可选,0个或多个)

a=<attribute>
a=<attribute>:<value>
属性是扩展SDP的基本方式。属性可以被定义为会话级,或者是媒体级,或者两者都有。
属性字段有两种形式:

  • 特定属性:它的格式为a=<flag>。这种属性表示会话的一个特写,如a=recvonly
  • 带值属性:它的格式为a=<attribute>:<value>,可以是自定义的属性。
    对属性的解析取决于所使用的媒体工具,收到一个不认识的属性,接收方可以忽略它。
3.7媒体描述(可选,0个或多个)

m=<media> <port> <proto> <fmt> ... 如果包含媒体描述,则必须包含该行。
<media> 媒体类型。目前定义的媒体类型有:audiovideoapplicationtextmessage,这个列表可能会扩展。
<port>媒体流传输端口。传送端口取决于c=字段中指明的网络及<proto>中指明的传输协议。其他媒体应用所使用的端口(如:RTCP端口,见RFC3605)可通过一定的算法推导出来,或者在一个单独的属性中规定(如:RFC
3605中定义的a=rtcp:)。一般RTP使用偶数端口,RTCP使用奇数端口(RTP端口+1),如果使用非连续端口,或者不按照奇偶规则来实现,则必须使用a=rtcp:属性描述。

4、SDP属性

下面列一些SDP属性。编程人员可以根据需要添加新的属性,所以下面列出来的并不是全部。仅列出常见的属性。
4.1 a=framerate:<frame rate>
它给出最大视频帧率,单位帧/秒。允许使用十进制带小数的值。它是媒体级的属性,只对视频媒体有意义。
4.2 a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encoding parameters>]
该属性用来将一个RTP净荷类型编号(在m=行使用的)映射到一个表示净荷格式的编码名称。此外,它还提供时钟频率和编码参数的信息。
虽然能够静态给出净荷格式分配净荷类型编号,但更多是通过a=rtpmap:进行动态分配。例如:采样16bit线程编码、采样率为16KHz的立体声是一种动态净荷类型,如果我们想用动态RTP/AVP净荷类型98来表示这种流,则为了对其编码,还需提高的附加信息如下:
m=audio 59935 RTP/AVP 98
a=rtpmap:98 L16/16000/2
对于音频流,<encoding parameters>表示音频信道的数量,如果信道数量为1且不需要附加的参数,则这个参数可以省略。
对于视频流,目前还没有规定编码参数。
4.3 a=fmtp:<format> <format specific parameters>
这个属性允许特定的格式参数能在SDP不能识别它们的前提下依然能够传递。这种格式必须是媒体定义的格式中的一种。

三、示例

下图是RTSP抓包中的SDP描述
SDP协议总结