1、SDP: Session Description Protocol(会话描述协议 ) (RFC2327) 1. 概述 SDP 也是 MMUSIC 工作组的一个产品 ,在 MBONE 内容中用得很多。其目的就是在媒体会话中,传递媒体流信息,允许会话描述的接收者去参与会话。 SDP 基本上在 internet 上工作。他定义了绘画描述的统一格式 ,但并不定义多播地址的分配和 SDP 消息的传输 ,也不支持媒体编码方案的协商 ,这些功能均由下层传送协议完成 .典型的会话传送协议包括 :SAP(Session Announcement Protocol 会 话公告协议 ),SIP,RTSP,HTTP,
2、和使用 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) 可信赖的
3、接洽信息( Contact information) 2. 协议 Session description /格式及举例 v= (protocol version) /v=0 o= (owner/creator and session identifier). /o= /o=sname 1234567890 0987654321 IN /IP4 126.15.64.3 s= (session name) /会话名 i=* (session information) /会话信息 u=* (URI of description) /u=http:/ e=* (email address) /e=zt
4、eisi.edu(general text 如:王生 ) /或 e=Mr. Wang p=* (phone number) /p=+86-0755-26773000-7110(wang) /or p=+1 617 253 6011 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=: /b=CT:120 One or more ti
5、me descriptions (see below) z=* (time zone adjustments) /时区调整 k=* (encryption key) /k=:或 k= a=* (zero or more session attribute lines) /a= 或 a=: Zero or more media descriptions (see below) 各行严格按顺序 ,其中 : 时间描述: t= (time the session is active) /,单位秒,十 /进制 NTP /t=2873397468 2873404969 r=* (zero or more
6、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) /同 c k=* (encryption key)
7、 /会话级为摸认值 ,同 c a=* (zero or more media attribute lines) /两种形式: (也同 c)(见后说明) /a=如: / a=recvonly /a=: 注: v,o,s,t,m 为必须的 ,其他项为可选。 如果 SDP 语法分析器不能识别某一类型 (Type),则整个描述丢失 ; 如果 ”a=”的某属性值不理解 ,则予以丢失 整个协议区分大小写 “=”两侧不允许有空格 会话级的描述就是媒体级描述的缺省值 所有均格式为 = 3. SDP 在 IP 电话中的使用 SDP 用于构建 INVITE 和 200 OK 响应消息的消息体 ,供主 被叫用户交换
8、 媒体信息 . 1. 媒体流的配置 1) 主被叫的媒体描述必须完全对应 :主被叫的第 n 个媒体流 (“m=”)对应 ,都包含 ”a=rtpmap”.这样的目的是易于适应静态净荷类型到动态净荷类型的转换 . 2) 如被叫不想接收主叫提出的某个媒体流则在响应中设置该媒体流的端口号为 0.并且 ,必须返回对应的媒体流行 . 2. 单播 SDP 值的设定 1) 对于只发媒体流 ,端口号无意义 ,应设为 0. 2) 每个媒体流的净载荷类型例表应传送两个信息 :能接受 /发送的编译码 ,和用以标识这些编译码的 RTP 净载荷类型号 . 3) 如对于某一媒体流 ,主 /被叫没有公共的媒体格式 ,被叫仍然要
9、求返回媒体流的 ”m=”行 ,端口好为 0,同时 ,不列净载荷类型 . 4) 如果所有媒体流均无公共的媒体格式 ,则被叫回送 400 响应 (坏请求 ),并加入 304警告头字段 (无媒体类型 ) 3. 多播操作 1) 接受和发送的多播地址是相同的 2) 被叫不允许改变媒体流的只发 ,只收 ,或收 /发特性 3) 如果被叫不支持多播 ,则回送 400 响应和 330 警告 (多播不可用 ) 4. 延时媒体流 由于主叫可能实际上是一个和其他协议 (如 H.323)互同的协议 的网关 ,与 S 其互同的协议要求呼叫建立后进行媒体协商 .这样 ,主叫可以先发不带 SDP 的 INVITE,呼叫建立后
10、可以通过 ACK 或重新发一个 INVITE 请求修改被叫的会话描述 (SDP). 5. 媒体流保持 如果要求对方进入 HOLD,即暂时停止发送一个或多个媒体流 ,这可以用 Re-INVITE,其 会话描述 和原来的请求或响应中的描述相同 ,只是 ,”c=”行中的保持媒体流的地址置为 ”0.0.0.0”,还有就是 Re_INVITE 中的 Cseq 得递增 . 6. 对应于 SIP 中有 3 个实体字段 : 1) Content-Type: 指明消息体类型 ,有两种 : i. Application/sdp:表示是 SDP 会话描述 ii. Text/html:表示是普通文本或 HTML 格式
11、的描述 2) Content-Encoding:补充说明消息体类型 ,使用户可以采用压缩编码编辑消息体 3) Content-Length:给出消息体的字节数 7. SDP 各 type 的详细 解释 : 协议版本 o= SDP 版本 目前为 0,没有子版本 会话源 v= 用户在发起主机上登录名 ,如果主机不支持用户标识的概念 ,则为 ”-” 一般为数字串 ,其分配由创建工具决定 ,建议用网络时间协议 (NTP)时 戳 ,以 确保唯一性 . 该会话公告的版本 ,供公告代理服务器检测同一会话 的若干个公告哪个 是最新公告 .基本要求是会话数据修改后该版本值递增 ,建议用 NTP 时 戳 为文本串
12、 ”IN” ”IP4”(可为域名或点分十进制 )/”IP6”(域名或压 缩文本地址形式 ) 会话名 s= ISO 10646 字符表示的会话名 会话信息 v=ISO 10646 字符表示的会话信息 URI u= 能提供会议进一步信息的 URI 地址 E 妹地址 e= 给出会议负责人的联系信息 ,他不一定是创建会议公告的人 电话号码 p=给出会议负责人的联系信息 ,他不一定是创建会议公告的人 (国际通用形式 ) 连接数据 c=媒体连接数据,会话级为媒体级的摸认值 带宽 b=给出会话或媒体 所用带宽 ,单位为 kbit/s.修饰语: CT(会议总带宽 ,表示所有 地点所有媒体的总带宽 ), AS(
13、应用特定最大带宽 ,表示一个地点单一媒体带宽 ) 时间描述 t= 见上 r= 见上 时区调整 z= 见上 加密密钥 k=已定义的方法有 k=clear:密钥没有变换 k=base64:已编码,因为它含有 SDP 禁用的字符 k=uri: k=prompt。 SDP 没有提供密钥但该会话或媒体流是要求加密的。 属性 a=一个 m=行可有多个 a=行, SDP 建议 扩展 如下: (具体见 1.Page419) 会话级: a=cat:/给出点分层次式会话分类号 ,供接收方筛选会话 a=keywds:/供接收方筛选会话 a=tool:/创建会话描述的工具名和版本号 a=recvonly/sendre
14、cv/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=
15、lang:/会话描述的缺 省语言或媒体描述的语言 媒体描述 m= 有 5 种类型:音频 /视频 /应用 (如白板信息 )/数据 (不向用户显示的 )/控制 媒体流发往传输层的端口。取决于 c=行规定的网络类型和 接下来的传 送层协议:对 UDP 为 1024-65535; 对分层编码应用( c=行 没有 多播 地址), 要给出多播端口数,如 : m=video 49170/2 RTP/AVP 31(表示:端口 49170 和 49171 为第一对 RTP/RTCP 端口, 49172 和 49173 为第二对的端口) 。 与 c=行的地址类型有关。对大多的媒体在 RTP/UDP 上传送,定 义
16、 2 种: RTP/AVP: IETF RTP 协议,音 /视频应用文档 。在 UDP 上传诵。 Udp: UDP 协议 。 对音 /视频,就是音 /视频应用文档中规定媒体净荷类型 。列表中 都 有可能用,但 第一个 为 缺省 值,分为静态绑定和动态绑定 : 静态绑定即使媒体编码 方式 有净荷类型号完全确定,动态绑定 则媒体编码方式(如时钟频率,音频信道数等)没有完全确定,需要进一步的属性说明。 分别举例如下: Alaw 的 PCM 编码单信道 Audio,其净荷类型号为 8,把它发往 UDP 端口 49232,则: m=audio 49232 RTP/AVP 8 16bit 线性编码,双声道
17、立体声,抽样速率 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-fi
18、elds 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
19、CRLF information-field = “i=“ text CRLF uri-field = “u=“ uri CRLF email-fields = *(“e=“ email-address CRLF) phone-fields = *(“p=“ phone-number CRLF) connection-field = “c=“ nettype space addrtype space connection-address CRLF ;a connection field must be present ;in every media description or at the
20、;session-level bandwidth-fields = *(“b=“ bwtype “:“ bandwidth CRLF) time-fields = 1*( “t=“ start-time space stop-time *(CRLF repeat-fields) CRLF) zone-adjustments CRLF repeat-fields = “r=“ repeat-interval space typed-time 1*(space typed-time) zone-adjustments = time space “-“ typed-time *(space time
21、 space “-“ typed-time) key-field = “k=“ key-type CRLF key-type = “prompt“ | “clear:“ key-data | “base64:“ key-data | “uri:“ uri key-data = email-safe | “ | “ attribute-fields = *(“a=“ attribute CRLF) media-descriptions = *( media-field information-field *(connection-field) bandwidth-fields key-field
22、 attribute-fields ) media-field = “m=“ media space port “/“ integer space proto 1*(space fmt) CRLF media = 1*(alpha-numeric) ;typically “audio“, “video“, “application“ ;or “data“ fmt = 1*(alpha-numeric) ;typically an RTP payload type for audio ;and video media proto = 1*(alpha-numeric) ;typically “R
23、TP/AVP“ or “udp“ for IP4 port = 1*(DIGIT) ;should in the range “1024“ to “65535“ inclusive ;for UDP based media attribute = (att-field “:“ att-value) | att-field att-field = 1*(alpha-numeric) att-value = byte-string sess-id = 1*(DIGIT) ;should be unique for this originating username/host sess-versio
24、n = 1*(DIGIT) ;0 is a new session connection-address = multicast-address | 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 ttl = decimal-uchar start-time = time | “0“ stop-time = time | “0“ time =
25、 POS-DIGIT 9*(DIGIT) ;sufficient for 2 more centuries repeat-interval = typed-time typed-time = 1*(DIGIT) fixed-len-time-unit fixed-len-time-unit = “d“ | “h“ | “m“ | “s“ bwtype = 1*(alpha-numeric) bandwidth = 1*(DIGIT) username = safe ;pretty wide definition, but doesnt include space email-address =
26、 email | email “(“ email-safe “)“ | email-safe “ email = ;defined in RFC822 uri= ;defined in RFC1630 phone-number = 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 numbe
27、r. nettype = “IN“ ;list to be extended addrtype = “IP4“ | “IP6“ ;list to be extended addr = FQDN | unicast-address FQDN = 4*(alpha-numeric|“-“|“.“) ;fully qualified domain name as specified in RFC1035 unicast-address = IP4-address | IP6-address IP4-address = b1 “.“ decimal-uchar “.“ decimal-uchar “.
28、“ b4 b1 = decimal-uchar ;less than “224“; not “0“ or “127“ b4 = decimal-uchar ;not “0“ IP6-address = ;to be defined text = 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 byte-string = 1*(0x010x09|0x0b|0x0c
29、|0x0e0xff) ;any byte except NUL, CR or LF decimal-uchar = DIGIT | POS-DIGIT DIGIT | (“1“ 2*(DIGIT) | (“2“ (“0“|“1“|“2“|“3“|“4“) DIGIT) | (“2“ “5“ (“0“|“1“|“2“|“3“|“4“|“5“) integer = POS-DIGIT *(DIGIT) alpha-numeric = ALPHA | DIGIT DIGIT = “0“ | POS-DIGIT POS-DIGIT = “1“|“2“|“3“|“4“|“5“|“6“|“7“|“8“|“
30、9“ ALPHA = “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“|“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“ email-safe = safe | space | tab safe = alpha-numeric | “ | “ | “-“ | “.“ | “/“ | “:“ | “?“ | “ | “#“ | “$“ | “ | “=“ | “ | “ | “ | “ | “_“ | “ | “ | “|“ | “ | “+“ | “ | “ space = %d32 tab = %d9 CRLF = %d13.10 References 1. IP 网络电话技术人民邮电出版社,糜正琨编著