跳到主要内容

5. SDP 规范

SDP 描述由媒体类型 "application/sdp" 表示 (见第 8 节).

SDP 描述完全是文本形式. SDP 字段名和属性名只使用 UTF-8 [RFC3629] 的 US-ASCII 子集, 但文本字段和属性值 MAY 使用 UTF-8 编码的完整 ISO 10646 字符集, 或使用 "a=charset:" 属性定义的其他字符集 (第 6.10 节). 使用完整 UTF-8 字符集的字段值和属性值从不直接比较, 因此不要求进行 UTF-8 规范化. 选择文本形式, 而不是 ASN.1 或 XDR 等二进制编码, 是为了增强可移植性, 支持使用多种传输方式, 并允许使用灵活的基于文本的工具包生成和处理会话描述. 然而, 由于 SDP 可能用于会话描述最大允许大小受限的环境, 其编码被有意设计得较为紧凑. 此外, 由于描述可能通过非常不可靠的方式传输, 或被中间缓存服务器损坏, 该编码采用了严格的顺序和格式规则, 使大多数错误会产生格式错误的会话描述, 从而能够被轻松检测并丢弃.

SDP 描述由若干文本行组成, 其形式如下:

<type>=<value>

其中 <type> 恰好是一个大小写敏感的字符, <value> 是结构化文本, 其格式取决于 <type>. 一般而言, <value> 要么是由单个空格字符分隔的若干子字段, 要么是自由格式字符串, 并且除非特定字段另有定义, 否则大小写敏感. "=" 符号两侧不使用空白分隔符, 但是值可以包含前导空白作为其语法的一部分, 即该空白属于值的一部分.

SDP 描述 MUST 符合第 9 节定义的语法. 以下是该语法的概览.

SDP 描述由一个 session-level 小节以及其后的零个或多个媒体描述组成. session-level 小节以 "v=" 行开始, 一直延续到第一个媒体描述 (或整个描述结束, 以先到者为准). 每个媒体描述以 "m=" 行开始, 一直延续到下一个媒体描述或整个会话描述结束, 以先到者为准. 一般而言, session-level 值是所有媒体的默认值, 除非被等效的 media-level 值覆盖.

每个描述中的某些行是必需的, 某些行是可选的, 但一旦出现, 它们必须严格按照这里给出的顺序出现. (固定顺序极大增强了错误检测能力, 并允许使用简单的解析器). 在以下概览中, 可选项以 "*" 标记.

Session description
v= (protocol version)
o= (originator and session identifier)
s= (session name)
i=* (session information)
u=* (URI of description)
e=* (email address)
p=* (phone number)
c=* (connection information -- not required if included in
all media descriptions)
b=* (zero or more bandwidth information lines)
One or more time descriptions:
("t=", "r=" and "z=" lines; see below)
k=* (obsolete)
a=* (zero or more session attribute lines)
Zero or more media descriptions

Time description
t= (time the session is active)
r=* (zero or more repeat times)
z=* (optional time zone offset line)

Media description, if present
m= (media name and transport address)
i=* (media title)
c=* (connection information -- optional if included at
session level)
b=* (zero or more bandwidth information lines)
k=* (obsolete)
a=* (zero or more media attribute lines)

类型字母集合被有意设计得很小, 且不打算扩展 -- SDP 解析器 MUST 完全忽略或拒绝任何包含其不理解的类型字母的会话描述. 属性机制 ("a=", 见第 5.13 节) 是扩展 SDP 并将其适配到特定应用或媒体的主要方式. 某些 attributes (第 6 节列出的那些) 具有已定义的含义, 但其他 attributes 可以基于 media-specific 或 session-specific 的方式添加.

SDP 描述可以在 "u=", "k=", 和 "a=" 行中包含引用外部内容的 URI. 在某些情况下, 这些 URI 可能会被解引用, 从而使会话描述不再是自包含的.

5.1. 协议版本 ("v=")

v=0

"v=" 行 (version-field) 给出 Session Description Protocol 的版本. 本文档定义版本 0. 不存在次版本号.

5.2. 源 ("o=")

o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>

"o=" 行 (origin-field) 给出会话的发起者 (其用户名和用户主机地址), 以及会话标识符和版本号.

5.3. 会话名称 ("s=")

s=<session name>

"s=" 行 (session-name-field) 是文本形式的会话名称. 每个会话描述中 MUST 有且只有一个 "s=" 行.

5.4. 会话信息 ("i=")

i=<session information>

"i=" 行 (information-field) 提供关于会话的文本信息.

5.5. URI ("u=")

u=<uri>

"u=" 行 (uri-field) 指定 Uniform Resource Identifier.

5.6. 电子邮件地址和电话号码

e=<email-address>
p=<phone-number>

"e=" 行 (email-field) 和 "p=" 行 (phone-field) 指定会议负责人的联系信息.

5.7. 连接信息 ("c=")

c=<nettype> <addrtype> <connection-address>

"c=" 行 (connection-field) 包含连接数据.

5.8. 带宽信息 ("b=")

b=<bwtype>:<bandwidth>

"b=" 行 (bandwidth-field) 表示会话或媒体拟使用的带宽.

5.9. 活跃时间 ("t=")

t=<start-time> <stop-time>

"t=" 行 (time-field) 指定会话的开始时间和停止时间.

5.10. 重复时间 ("r=")

r=<repeat interval> <active duration> <offsets from start-time>

"r=" 行 (repeat-field) 指定会话的重复时间.

5.11. 时区调整 ("z=")

z=<adjustment time> <offset> <adjustment time> <offset> ...

"z=" 行 (timezone-field) 指定时区偏移变化.

5.12. 加密密钥 ("k=")

k=<method>
k=<method>:<encryption key>

注意: "k=" 字段的使用已经废弃.

5.13. 属性 ("a=")

a=<attribute>
a=<attribute>:<value>

"a=" 行 (attribute-field) 用于扩展 SDP.

5.14. 媒体描述 ("m=")

m=<media> <port> <proto> <fmt> ...

一个会话描述可以包含若干媒体描述. 每个媒体描述都以 "m=" 行 (media-field) 开始.

5.14.1. <media>

<media> 是媒体类型. 已定义的媒体类型包括 "audio", "video", "text", "application", 和 "message".

5.14.2. <port>

<port> 是媒体流发送到的传输端口.

5.14.3. <proto>

<proto> 是传输协议.

5.14.4. <fmt>

<fmt> 是媒体格式描述.