SDP: Session Description Protocol(会话描述协议)
(RFC2327)
1.概述
SDP 也是 MMUSIC 工作组的一个产品,在 MBONE 内容中用得很多。其目的就是在媒体会话中,传递媒
体流信息,允许会话描述的接收者去参与会话。SDP 基本上在 internet 上工作。他定义了绘画描述的统一格
式,但并不定义多播地址的分配和 SDP 消息的传输,也不支持媒体编码方案的协商,这些功能均由下层传送协
议完成.典型的会话传送协议包括:SAP(Session Announcement Protocol 会话公告协议),SIP,RTSP,HTTP,和使
用 MIME 的 E-Mail.(注意:对 SAP 只能包含一个会话描述,其它会话传诵协议的 SDP 可包含多个绘画描述)
SDP 包括以下一些方面:
1) 会话的名称和目的
2) 会话存活时间
3) 包含在会话中的媒体信息,包括:
媒体类型(video, audio, etc)
传输协议(RTP/UDP/IP, H.320, etc)
媒体格式(H.261 video, MPEG video, etc)
多播或远端(单播)地址和端口
4) 为接收媒体而需的信息(addresses, ports, formats and so on)
5) 使用的带宽信息
6) 可信赖的接洽信息(Contact information)
2.协议
Session description
v= (protocol version)
o= (owner/creator and session identifier).
//v=0
//格式及举例
//o=<用户名><会话 id><版本><网络类
//型><地址类型><地址>
//o=sname 1234567890 0987654321 IN
//IP4 126.15.64.3
//会话名
//会话信息
//u=http://www.zte.com.cn/staff/sdp.ps
//e=zte@isi.edu(general text 如:王生)
//或 e=Mr. Wang
//p=+86-0755-26773000-7110(wang)
//or p=+1 617 253 6011
s= (session name)
i=* (session information)
u=* (URI of description)
e=* (email address)
p=* (phone number)
c=* (connection information -如已经包含在所有媒体中则该行不需要)
//c=<网络类型><地址信息><连接地址>
//多点会议包括 TTL
//连接地址: //
//c=IN IP4 224.2.13.23/127
//c=IN IP4 224.2.1.1/127/3
b=* (bandwidth information)
//b=<修改量(CT Conference Total
//IAS Application-specific Max)>:<带宽
//值(kb/s)>
//b=CT:120
One or more time descriptions (see below)
z=* (time zone adjustments)
k=* (encryption key)
a=* (zero or more session attribute lines)
//时区调整
//k=<方法>:<密钥>或 k=<方法>
//a=<属性> 或 a=<属性>:<值>
Zero or more media descriptions (see below)
各行严格按顺序,其中:
时间描述:
t= (time the session is active)
//<开始时间><结束时间>,单位秒,十
//进制 NTP
//t=2873397468 2873404969
r=* (zero or more repeat times)
//<重复时间><活动持续时间
//以开始时刻为参考的偏移列表>单位秒
//r=604800 3666 90000
//r=7d 1h 0 25h
或写成
媒体描述:
m= (media name and transport address) //m=<媒体><端口><传送><格式列表>
//m=audio 49170 RTP/AVP 0 3
//协议为 RTP,剖面为 AVP
//参考 rtp-parameters.txt
//
i=* (media title 媒体称呼)
c=* (connection information – 如已经包含在会话级描述则为可选)
b=* (bandwidth information)
k=* (encryption key)
a=* (zero or more media attribute lines)
//同 c
//会话级为摸认值,同 c
//两种形式:(也同 c)(见后说明)
//a=
如:
//
//a=:
a=recvonly
注:v,o,s,t,m 为必须的,其他项为可选。
如果 SDP 语法分析器不能识别某一类型(Type),则整个描述丢失;
如果”a=”的某属性值不理解,则予以丢失
整个协议区分大小写
“=”两侧不允许有空格
会话级的描述就是媒体级描述的缺省值
所有均格式为=
3.SDP 在 IP 电话中的使用
SDP 用于构建 INVITE 和 200 OK 响应消息的消息体,供主\被叫用户交换媒体信息.
1. 媒体流的配置
1) 主被叫的媒体描述必须完全对应:主被叫的第 n 个媒体流(“m=”)对应,都包含”a=rtpmap”.这样的目
的是易于适应静态净荷类型到动态净荷类型的转换.
2) 如被叫不想接收主叫提出的某个媒体流则在响应中设置该媒体流的端口号为 0.并且,必须返回对
应的媒体流行.
2. 单播 SDP 值的设定
1) 对于只发媒体流,端口号无意义,应设为 0.
2) 每个媒体流的净载荷类型例表应传送两个信息:能接受/发送的编译码,和用以标识这些编译码的
RTP 净载荷类型号.
3) 如对于某一媒体流,主/被叫没有公共的媒体格式,被叫仍然要求返回媒体流的”m=”行,端口好为 0,
同时,不列净载荷类型.
4) 如果所有媒体流均无公共的媒体格式,则被叫回送 400 响应(坏请求),并加入 304 警告头字段(无媒
体类型)
3. 多播操作
1) 接受和发送的多播地址是相同的
2) 被叫不允许改变媒体流的只发,只收,或收/发特性
3) 如果被叫不支持多播,则回送 400 响应和 330 警告(多播不可用)
4. 延时媒体流
由于主叫可能实际上是一个和其他协议(如 H.323)互同的协议的网关,与 S 其互同的协议要求呼叫建立
后进行媒体协商.这样,主叫可以先发不带 SDP 的 INVITE,呼叫建立后可以通过 ACK 或重新发一个
INVITE 请求修改被叫的会话描述(SDP).
5. 媒体流保持
如果要求对方进入 HOLD,即暂时停止发送一个或多个媒体流,这可以用 Re-INVITE,其会话描述和原来
的请求或响应中的描述相同,只是,”c=”行中的保持媒体流的地址置为”0.0.0.0”,还有就是 Re_INVITE 中
的 Cseq 得递增.
6. 对应于 SIP 中有 3 个实体字段:
1) Content-Type: 指明消息体类型,有两种:
i.
ii.
Application/sdp:表示是 SDP 会话描述
Text/html:表示是普通文本或 HTML 格式的描述
2) Content-Encoding:补充说明消息体类型,使用户可以采用压缩编码编辑消息体
3) Content-Length:给出消息体的字节数
SDP 各 type 的详细解释:
7.
协议版本 o=
会话源 v=
SDP 版本目前为 0,没有子版本
<用户名>用户在发起主机上登录名,如果主机不支持用户标识的概念,则为”-”
<会话 id>一般为数字串,其分配由创建工具决定,建议用网络时间协议(NTP)时
戳,以确保唯一性.
<版本>该会话公告的版本,供公告代理服务器检测同一会话的若干个公告哪个
是最新公告.基本要求是会话数据修改后该版本值递增,建议用 NTP 时戳
<网络类型>为文本串”IN”
<地址类型>”IP4”(可为域名或点分十进制)/”IP6”(域名或压缩文本地址形式)
<地址>
ISO 10646 字符表示的会话名
s=
u= 能提供会议进一步信息的 URI 地址
会话名
会话信息 v= ISO 10646 字符表示的会话信息
URI
E 妹地址 e= 给出会议负责人的联系信息,他不一定是创建会议公告的人
电话号码 p= 给出会议负责人的联系信息,他不一定是创建会议公告的人(国际通用形式)
连接数据 c=媒体连接数据,会话级为媒体级的摸认值
带宽
b= 给出会话或媒体所用带宽,单位为 kbit/s.修饰语:CT(会议总带宽,表示所有
地点所有媒体的总带宽),AS(应用特定最大带宽,表示一个地点单一媒体带宽)
时间描述 t= 见上
r= 见上
时区调整 z= 见上
加密密钥 k=已定义的方法有
k=clear:<加密密钥>密钥没有变换
k=base64:<编码密钥>已编码,因为它含有 SDP 禁用的字符
k=uri:<获得密钥的 URI>
k=prompt。SDP 没有提供密钥但该会话或媒体流是要求加密的。
属性
a=一个 m=行可有多个 a=行,SDP 建议扩展如下:(具体见[1].Page419)
会话级: a=cat:<类别>//给出点分层次式会话分类号,供接收方筛选会话
a=keywds:<关键词>//供接收方筛选会话
a=tool:<工具名和版本号>//创建会话描述的工具名和版本号
a=recvonly/sendrecv/sendonly//收发模式
a=type:<会议类型>//有:广播,聚会,主席主持,测试,H.323
a=charset:<字符集>//显示会话名和信息数据的字符集
a=sdplang:<语言标记>//描述所有语言
a=lang:<语言标记>//会话描述的缺省语言或媒体描述的语言
a=framerate:<帧速率>//单位:帧/秒
a=quality:<质量>//视频的建议质量(10/5/0)
a=fmtp:<格式>< 格式特定参数>//定义指定格式的附加参数
媒体级:a=ptime:<分组时间>//媒体分组的时长(单位:秒)
a=recvonly/sendrecv/sendonly//收发模式
a=orient:<白板方向>//指明白板在屏莫上的方向
a=sdplang:<语言标记>//描述所有语言
a=lang:<语言标记>//会话描述的缺省语言或媒体描述的语言
媒体描述 m= <媒体>有 5 种类型:音频/视频/应用(如白板信息)/数据(不向用户显示的)/控制
<端口>媒体流发往传输层的端口。取决于 c=行规定的网络类型和接下来的传
送层协议:对 UDP 为 1024-65535;对分层编码应用(c=行没有多播地址),
要给出多播端口数,如:m=video 49170/2 RTP/AVP 31(表示:端口 49170
和 49171 为第一对 RTP/RTCP 端口,49172 和 49173 为第二对的端口)。
<传送层协议>与 c=行的地址类型有关。对大多的媒体在 RTP/UDP 上传送,定
义 2 种:RTP/AVP:IETF RTP 协议,音/视频应用文档。在 UDP 上传诵。
Udp:UDP 协议。
<格式列表>对音/视频,就是音/视频应用文档中规定媒体净荷类型。列表中都
有可能用,但第一个为缺省值,分为静态绑定和动态绑定:静态绑定即使媒体编码方
式有净荷类型号完全确定,动态绑定则媒体编码方式(如时钟频率,音频信道数等)
没有完全确定,需要进一步的属性说明。分别举例如下:
Alaw 的 PCM 编码单信道 Audio,其净荷类型号为 8,把它发往 UDP 端口 49232,则:
m=audio 49232 RTP/AVP 8
16bit 线性编码,双声道立体声,抽样速率 16kHz,其动态净荷类型号 98,则:m=audio
49232 RTP/AVP 98
a=rtpmap:98 L16/16000/2
说明:1)a=rtpmap:<净荷类型号><编码名>/<时钟速率>[/<编码参数>]
对音频,编码参数为音频信道数;对视频没有定义
2)SDP 允许 rtpmap 规定实验性编码格式,但编码名必须以 X-起,
表示此格式还没正式登记。
4.SDP Grammar
announcement =
proto-version
origin-field
session-name-field
information-field
uri-field
email-fields
phone-fields
connection-field
bandwidth-fields
time-fields
key-field
attribute-fields
media-descriptions
proto-version =
"v=" 1*DIGIT CRLF
;this memo describes version 0
origin-field =
"o=" username space
sess-id space sess-version space
nettype space addrtype space
addr CRLF
session-name-field = "s=" text CRLF
["i=" text CRLF]
information-field =
["u=" uri CRLF]
uri-field =
email-fields =
*("e=" email-address CRLF)
*("p=" phone-number CRLF)
phone-fields =
connection-field =
["c=" nettype space addrtype space
connection-address CRLF]
;a connection field must be present
;in every media description or at the
;session-level
*("b=" bwtype ":" bandwidth CRLF)
1*( "t=" start-time space stop-time
*(CRLF repeat-fields) CRLF)
[zone-adjustments CRLF]
bandwidth-fields =
time-fields =
repeat-fields =
"r=" repeat-interval space typed-time
zone-adjustments =
time space ["-"] typed-time
1*(space typed-time)
*(space time space ["-"] typed-time)
key-field =
key-type =
["k=" key-type CRLF]
"prompt" |
"clear:" key-data |
"base64:" key-data |
"uri:" uri
key-data =
attribute-fields =
media-descriptions = *( media-field
email-safe | "~" | "
*("a=" attribute CRLF)
information-field
*(connection-field)
bandwidth-fields
key-field
attribute-fields )
media-field =
media =
fmt =
proto =
port =
attribute =
att-field =
att-value =
sess-id =
"m=" media space port ["/" integer]
space proto 1*(space fmt) CRLF
1*(alpha-numeric)
;typically "audio", "video", "application"
;or "data"
1*(alpha-numeric)
;typically an RTP payload type for audio
;and video media
1*(alpha-numeric)
;typically "RTP/AVP" or "udp" for IP4
1*(DIGIT)
;should in the range "1024" to "65535" inclusive
;for UDP based media
(att-field ":" att-value) | att-field
1*(alpha-numeric)
byte-string
1*(DIGIT)
;should be unique for this originating username/host
sess-version =
1*(DIGIT)
connection-address = multicast-address
;0 is a new session
| addr
multicast-address =
3*(decimal-uchar ".") decimal-uchar "/" ttl
[ "/" integer ]
;multicast addresses may be in the range
;224.0.0.0 to 239.255.255.255
decimal-uchar
time | "0"
time | "0"
POS-DIGIT 9*(DIGIT)
;sufficient for 2 more centuries
ttl =
start-time =
stop-time =
time =
typed-time
repeat-interval =
typed-time =
fixed-len-time-unit = "d" | "h" | "m" | "s"
1*(DIGIT) [fixed-len-time-unit]
bwtype =
bandwidth =
username =
1*(alpha-numeric)
1*(DIGIT)
safe
;pretty wide definition, but doesn't include space
email-address =
email | email "(" email-safe ")" |
email =
uri=
phone-number =
phone =
email-safe "<" email ">"
;defined in RFC822
;defined in RFC1630
phone | phone "(" email-safe ")" |
email-safe "<" phone ">"
"+" POS-DIGIT 1*(space | "-" | DIGIT)
;there must be a space or hyphen between the
;international code and the rest of the number.
nettype =
"IN"
addrtype =
"IP4" | "IP6"
;list to be extended
addr =
FQDN =
unicast-address =
IP4-address =
b1 =
b4 =
;list to be extended
FQDN | unicast-address
4*(alpha-numeric|"-"|".")
;fully qualified domain name as specified in RFC1035
IP4-address | IP6-address
b1 "." decimal-uchar "." decimal-uchar "." b4
decimal-uchar
;less than "224"; not "0" or "127"
decimal-uchar
;not "0"
IP6-address =
text =
;to be defined
byte-string
;default is to interpret this as IS0-10646 UTF8
;ISO 8859-1 requires a "a=charset:ISO-8859-1"
;session-level attribute to be used
1*(0x01..0x09|0x0b|0x0c|0x0e..0xff)
;any byte except NUL, CR or LF
byte-string =
decimal-uchar =
DIGIT
| POS-DIGIT DIGIT
| ("1" 2*(DIGIT))
| ("2" ("0"|"1"|"2"|"3"|"4") DIGIT)
| ("2" "5" ("0"|"1"|"2"|"3"|"4"|"5"))
POS-DIGIT *(DIGIT)
ALPHA | DIGIT
"0" | POS-DIGIT
"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
"a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|
"l"|"m"|"n"|"o "|"p"|"q"|"r"|"s"|"t"|"u"|"v"|
integer =
alpha-numeric =
DIGIT =
POS-DIGIT =
ALPHA =
"w"|"x"|"y"|"z"|"A"|"B"|"C "|"D"|"E"|"F"|"G"|
"H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|" Q"|"R"|
"S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z"
safe | space | tab
alpha-numeric |
"'" | "'" | "-" | "." | "/" | ":" | "?" | """ |
"#" | "$" | "&" | "*" | ";" | "=" | "@" | "[" |
"]" | "^" | "_" | "`" | "{" | "|" | "}" | "+" |
"~" | "
%d32
%d9
email-safe =
safe =
space =
tab =
CRLF =
[References]
1.《IP 网络电话技术》人民邮电出版社,糜正琨编著
%d13.10