RFC 4566 - SDP: 会话描述协议 (Session Description Protocol)
- 状态: Proposed Standard
- 发布日期: 2006 年 7 月
- Stream: IETF
- 废弃了: RFC2327, RFC3266
- 被废弃: RFC8866
- 勘误: 无勘误
摘要 (Abstract)
本备忘录定义会话描述协议 (Session Description Protocol, SDP). SDP 用于描述多媒体会话, 以支持会话公告, 会话邀请以及其他形式的多媒体会话发起.
相关资源 (Related Resources)
- Official RFC: RFC 4566
- Official Page: RFC 4566 DataTracker
- Errata: RFC Editor Errata
2. 术语表 (Glossary of Terms)
本文档中使用以下术语,它们在本文档上下文中具有特定含义.
Conference (会议): 多媒体会议是由两个或更多正在通信的用户以及他们用于通信的软件组成的集合.
Session (会话): 多媒体会话是一组多媒体发送者和接收者,以及从发送者流向接收者的数据流.多媒体会议是多媒体会话的一个示例.
Session Description (会话描述): 一种定义良好的格式,用于传达足够的信息以发现和参与多媒体会话.
本文档中的关键词 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 和 "OPTIONAL" 应按照 RFC 2119 [3] 中的描述进行解释.
3. SDP 使用示例 (Examples of SDP Usage)
3.1 会话发起 (Session Initiation)
会话发起协议 (Session Initiation Protocol, SIP) [15] 是一种应用层控制协议, 用于创建, 修改和终止会话, 如互联网多媒体会议, 互联网电话呼叫和多媒体分发. 用于创建会话的 SIP 消息携带会话描述, 使参与者能够就一组兼容的媒体类型达成一致. 这些会话描述通常使用 SDP 格式化. 当与 SIP 一起使用时, 提议/应答模型 (offer/answer model) [17] 为使用 SDP 进行协商提供了有限的框架.
3.2 流媒体 (Streaming Media)
实时流协议 (Real Time Streaming Protocol, RTSP) [16] 是一种应用级协议,用于控制具有实时属性的数据传递.RTSP提供了一个可扩展的框架,以实现对实时数据(如音频和视频)的受控按需传递.RTSP客户端和服务器协商一组适当的媒体传递参数,部分使用SDP语法来描述这些参数.
3.3 电子邮件和万维网 (Email and the World Wide Web)
传达会话描述的替代方法包括电子邮件和万维网 (World Wide Web, WWW).对于电子邮件和WWW分发,使用媒体类型 "application/sdp".这使得应用程序能够以标准方式从WWW客户端或邮件阅读器自动启动以参与会话.
请注意,仅通过电子邮件或WWW进行的多播会话通告不具有这样的特性:会话通告的接收者不一定能够接收会话,因为多播会话可能在范围上受到限制,而对WWW服务器的访问或电子邮件的接收可能在此范围之外.
3.4 多播会话通告 (Multicast Session Announcement)
为了协助广播多播多媒体会议和其他多播会话,并向潜在参与者传达相关的会话设置信息,可以使用分布式会话目录.这种会话目录的实例定期向一个众所周知的多播组发送包含会话描述的数据包.这些通告由其他会话目录接收,以便潜在的远程参与者可以使用会话描述来启动参与会话所需的工具.
用于实现这种分布式目录的一种协议是会话通告协议 (Session Announcement Protocol, SAP) [14].SDP为此类会话通告提供了推荐的会话描述格式.
4. 要求和建议 (Requirements and Recommendations)
SDP的目的是传达多媒体会话中媒体流的信息,以允许会话描述的接收者参与会话.SDP主要用于互联网络,尽管它足够通用,可以描述其他网络环境中的会议.媒体流可以是多对多的.会话不需要持续活跃.
到目前为止,基于互联网的多播会话与许多其他形式的会议不同之处在于,任何接收流量的人都可以加入会话(除非会话流量被加密).在这样的环境中,SDP有两个主要目的.它是传达会话存在的一种方式,也是传达足够信息以启用加入和参与会话的一种方式.在单播环境中,只有后一个目的可能相关.
SDP会话描述包括以下内容:
- 会话名称和目的
- 会话活跃的时间
- 组成会话的媒体
- 接收这些媒体所需的信息 (地址, 端口, 格式等)
由于参与会话所需的资源可能有限,一些附加信息也可能是需要的:
- 关于会话使用的带宽的信息
- 负责会话的人的联系信息
一般来说,SDP必须传达足够的信息以使应用程序能够加入会话(加密密钥可能是例外),并向可能需要知道的任何非参与者通告将要使用的资源.(后一个特性主要在SDP与多播会话通告协议一起使用时有用.)
4.1 媒体和传输信息 (Media and Transport Information)
SDP会话描述包括以下媒体信息:
- 媒体类型 (视频, 音频等)
- 传输协议(RTP/UDP/IP, H.320等)
- 媒体格式 (H.261 视频, MPEG 视频等)
除了媒体格式和传输协议之外,SDP还传达地址和端口详情.对于IP多播会话,这些包括:
- 媒体的多播组地址
- 媒体的传输端口
这个地址和端口是多播流的目标地址和目标端口, 无论是发送, 接收还是两者兼有.
对于单播IP会话,传达以下内容:
- 媒体的远程地址
- 媒体的远程传输端口
这个地址和端口的语义取决于定义的媒体和传输协议. 默认情况下, 这应该是发送数据的远程地址和远程端口. 某些媒体类型可能会重新定义此行为, 但这不推荐, 因为它会使实现复杂化 (包括必须解析地址以打开网络地址转换 (NAT) 或防火墙针孔的中间设备).
4.2 时间信息 (Timing Information)
会话在时间上可以是有界的或无界的.无论它们是否有界,它们可能仅在特定时间活跃.SDP可以传达:
- 限定会话的任意开始和停止时间列表
- 对于每个界限,重复时间,例如"每周三上午10点持续一小时"
这些时间信息是全局一致的,与本地时区或夏令时无关(参见第5.9节).
4.3 私有会话 (Private Sessions)
可以创建公共会话和私有会话.SDP本身不区分这些;私有会话通常通过在分发期间加密会话描述来传达.如何执行加密的详情取决于用于传达SDP的机制;目前为使用SAP [14] 和 SIP [15] 传输的SDP定义了机制,将来可能会定义其他机制.
如果会话通告是私有的,则可以使用该私有通告来传达解码会议中每个媒体所需的加密密钥,包括足够的信息以了解每个媒体使用哪种加密方案.
4.4 获取关于会话的更多信息 (Obtaining Further Information about a Session)
会话描述应该传达足够的信息以决定是否参与会话.SDP可能以统一资源标识符 (Uniform Resource Identifiers, URIs) 的形式包含关于会话的更多信息的附加指针.
4.5 分类 (Categorisation)
当SAP或任何其他通告机制正在分发许多会话描述时,可能需要从那些不感兴趣的会话通告中过滤感兴趣的会话通告.SDP支持能够自动化的会话分类机制("a=cat:" 属性;参见第6节).
4.6 国际化 (Internationalisation)
SDP规范建议使用UTF-8编码 [5] 中的ISO 10646字符集,以允许表示许多不同的语言.然而,为了协助紧凑表示,SDP还允许在需要时使用其他字符集,如ISO 8859-1.国际化仅适用于自由文本字段(会话名称和背景信息),而不适用于整个SDP.
5. SDP 规范 (SDP Specification)
SDP会话描述由媒体类型 "application/sdp" 表示(参见第8节).
SDP 会话描述完全使用 UTF-8 编码的 ISO 10646 字符集的文本形式. SDP 字段名和属性名仅使用 UTF-8 的 US-ASCII 子集, 但文本字段和属性值可以使用完整的 ISO 10646 字符集. 使用完整 UTF-8 字符集的字段和属性值永远不会被直接比较, 因此不需要 UTF-8 规范化. 选择文本形式 (而不是二进制编码如 ASN.1 或 XDR) 是为了增强可移植性, 支持各种传输方式, 并允许使用灵活的基于文本的工具包来生成和处理会话描述.
SDP描述格式
SDP会话描述由多行文本组成,格式为:
<type>=<value>
其中 <type> 必须是恰好一个区分大小写的字符, <value> 是结构化文本, 其格式取决于 <type>.
SDP描述结构
SDP 会话描述由一个会话级部分和零个或多个媒体级部分组成. 描述中的某些行是必需的, 某些是可选的, 但所有行必须按照这里给出的顺序出现. 可选项用 "*" 标记.
会话描述 (Session description):
v=(协议版本)o=(发起者和会话标识符)s=(会话名称)i=* (会话信息)u=* (描述的URI)e=* (电子邮件地址)p=* (电话号码)c=* (连接信息 - 如果所有媒体中都包含则不需要)b=* (零个或多个带宽信息行)- 一个或多个时间描述 ("t=" 和 "r=" 行)
z=* (时区调整)k=* (加密密钥)a=* (零个或多个会话属性行)- 零个或多个媒体描述
时间描述 (Time description):
t=(会话活跃的时间)r=* (零个或多个重复时间)
媒体描述 (Media description, if present):
m=(媒体名称和传输地址)i=* (媒体标题)c=* (连接信息 - 如果在会话级包含则可选)b=* (零个或多个带宽信息行)k=* (加密密钥)a=* (零个或多个媒体属性行)
SDP示例
v=0
o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
s=SDP Seminar
i=A Seminar on the session description protocol
u=http://www.example.com/seminars/sdp.pdf
[email protected] (Jane Doe)
c=IN IP4 224.2.17.12/127
t=2873397496 2873404696
a=recvonly
m=audio 49170 RTP/AVP 0
m=video 51372 RTP/AVP 99
a=rtpmap:99 h263-1998/90000
子章节
5.1 协议版本 ("v=") (Protocol Version)
v=0
"v=" 字段给出会话描述协议的版本.本备忘录定义版本0.没有次版本号.
5.2 发起者 ("o=") (Origin)
o=<username> `<sess-id>` `<sess-version>` <nettype> <addrtype> `<unicast-address>`
"o=" 字段给出会话的发起者(其用户名和用户主机的地址)以及会话标识符和版本号.
5.3 会话名称 ("s=") (Session Name)
s=<session name>
"s=" 字段是文本会话名称. 每个会话描述必须有且只有一个 "s=" 字段.
5.4 会话信息 ("i=") (Session Information)
i=<session description>
"i=" 字段提供关于会话的文本信息.每个会话描述最多可以有一个会话级 "i=" 字段,每个媒体最多可以有一个 "i=" 字段.
5.5 URI ("u=")
u=<uri>
"u=" 字段包含指向会话更多信息的URI.
5.6 电子邮件地址和电话号码 ("e=" and "p=") (Email Address and Phone Number)
e=`<email-address>`
p=`<phone-number>`
"e=" 字段包含负责会议的人员的电子邮件地址."p=" 字段包含负责会议的人员的电话号码.
5.7 连接数据 ("c=") (Connection Data)
c=<nettype> <addrtype> `<connection-address>`
"c=" 字段包含连接数据所需的信息.
5.8 带宽 ("b=") (Bandwidth)
b=<bwtype>:<bandwidth>
"b=" 字段表示建议的会话带宽.
5.9 时间 ("t=") (Timing)
t=`<start-time>` `<stop-time>`
"t=" 行指定会话的开始和停止时间.
5.10 重复时间 ("r=") (Repeat Times)
r=<repeat interval> <active duration> `<offsets from start-time>`
"r=" 行指定重复会话的时间.
5.11 时区 ("z=") (Time Zones)
z=<adjustment time> <offset> <adjustment time> <offset> ...
"z=" 行指定用于补偿夏令时或其他时区偏移变化的时区调整.
5.12 加密密钥 ("k=") (Encryption Keys)
k=<method>
k=<method>:<encryption key>
"k=" 字段用于传达加密密钥.
5.13 属性 ("a=") (Attributes)
a=<attribute>
a=<attribute>:<value>
属性是扩展SDP的主要手段.属性可以定义在会话级或媒体级.
5.14 媒体描述 ("m=") (Media Descriptions)
m=<media> <port> <proto> <fmt> ...
媒体描述开始于 "m=" 行,包含足够的信息来描述媒体流.
注意: 第5章包含大量技术细节和ABNF语法定义.完整规范请参考 RFC 4566官方文档.
6. SDP 属性 (SDP Attributes)
属性 (Attributes) 是扩展 SDP 的主要手段, 它们可以定义在会话级或媒体级. 会话级属性应用于整个会话 (除非被媒体级属性覆盖), 媒体级属性仅应用于特定媒体流.
属性行的格式为:
a=<attribute>
a=<attribute>:<value>
标准属性列表
以下是本规范定义的标准 SDP 属性:
cat (Category) (类别)
a=cat:<category>
用于对会话进行分类,便于过滤和搜索.
keywds (Keywords) (关键词)
a=keywds:<keywords>
提供关于会话的关键词列表.
tool (Tool) (工具)
a=tool:<name and version of tool>
标识创建会话描述的软件工具.
ptime (Packet Time) (数据包时间)
a=ptime:<packet time>
给出每个数据包中媒体的持续时间(毫秒).
maxptime (Maximum Packet Time) (最大数据包时间)
a=maxptime:<maximum packet time>
给出每个数据包的最大时长(毫秒).
rtpmap (RTP Mapping) (RTP 映射)
a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]
将RTP有效载荷类型映射到媒体编码名称.
recvonly (Receive Only) (仅接收)
a=recvonly
表示工具只能接收媒体,不能发送.
sendrecv (Send and Receive) (发送和接收)
a=sendrecv
表示工具既可以发送也可以接收媒体(这是默认值).
sendonly (Send Only) (仅发送)
a=sendonly
表示工具只能发送媒体,不能接收.
inactive (Inactive) (非活跃)
a=inactive
表示媒体流当前处于非活跃状态.
orient (Orientation) (方向)
a=orient:<whiteboard orientation>
用于白板媒体类型,指示白板方向.
type (Conference Type) (会议类型)
a=type:<conference type>
指定会议类型 (如 "broadcast", "meeting", "moderated", "test", "H332").
charset (Character Set) (字符集)
a=charset:<character set>
指定会话描述中文本字段使用的字符集.
sdplang (SDP Language) (SDP 语言)
a=sdplang:<language tag>
指定会话描述使用的语言.
lang (Language) (语言)
a=lang:<language tag>
指定媒体流使用的语言.
framerate (Frame Rate) (帧率)
a=framerate:<frame rate>
给出视频的帧率(帧/秒).
quality (Quality) (质量)
a=quality:<quality>
给出编码质量的建议值.
fmtp (Format Parameters) (格式参数)
a=fmtp:<format> <format specific parameters>
用于指定特定格式的参数.
注意: 本章列出了SDP的核心属性.各个媒体类型和应用可能定义额外的属性.完整的属性列表和详细说明请参考 RFC 4566官方文档 第6节.
7. 安全考虑 (Security Considerations)
SDP 会话描述本身不构成传输协议, 必须与传输协议一起使用以传送会话描述给参与者. 本节讨论 SDP 使用中的安全考虑.
机密性 (Confidentiality)
会话描述可能包含敏感信息,包括:
- 参与者身份信息
- 联系信息 (电子邮件, 电话号码)
- 加密密钥
- 网络拓扑信息 (IP 地址, 端口)
- 会话时间和主题
建议使用适当的加密机制 (如 TLS, S/MIME) 来保护会话描述在传输过程中的机密性.
完整性和真实性 (Integrity and Authenticity)
会话描述必须受到保护, 防止未授权的修改. 攻击者可能通过修改会话描述来:
- 重定向媒体流到恶意服务器
- 注入恶意属性
- 修改加密密钥
- 更改会话时间
建议使用数字签名或消息认证码 (MAC) 来验证会话描述的完整性和真实性.
拒绝服务 (Denial of Service)
攻击者可能利用会话描述发起拒绝服务攻击:
- 发送大量伪造的会话通告
- 创建极大的会话描述消耗解析器资源
- 指向不存在的地址以消耗网络资源
实现应该限制会话描述的大小和复杂度, 并对解析错误进行适当处理.
加密密钥分发 (Encryption Key Distribution)
虽然 SDP 提供了传达加密密钥的机制 ("k=" 字段), 但在许多情况下, 通过会话描述传递密钥可能不安全. 建议使用专用的密钥管理协议 (如 MIKEY, ZRTP) 或带外密钥交换方法.
隐私考虑 (Privacy Considerations)
"o=" 字段包含创建会话的用户名和IP地址,这可能泄露隐私信息.在需要隐私的场景中,可以使用任意用户名和私有地址,前提是不影响字段的全局唯一性.
网络地址转换 (NAT) 和防火墙
SDP 中包含的 IP 地址和端口信息可能在经过 NAT 或防火墙时变得无效. 应用程序应该使用交互式连接建立 (ICE) 等机制来处理这些情况.
8. IANA 考虑 (IANA Considerations)
本节描述 SDP 使用的各种参数的 IANA 注册要求.
8.1 "application/sdp" 媒体类型 (The "application/sdp" Media Type)
SDP 会话描述使用媒体类型 "application/sdp".
媒体类型名称: application 媒体子类型名称: sdp 必需参数: 无 可选参数: 无 编码考虑: SDP文件是文本文件,使用UTF-8编码的ISO 10646字符集. 安全考虑: 参见RFC 4566第7节 互操作性考虑: 参见RFC 4566 公开规范: RFC 4566 此媒体类型的应用: 多媒体会话设置和通告工具 附加信息:
- 文件扩展名: .sdp
- Macintosh文件类型代码: 'sdp '
8.2 参数注册 (Registration of Parameters)
SDP 使用多种参数类型, 这些参数可以由 IANA 注册.
8.2.1 媒体类型 ("media") (Media Types)
SDP 使用的媒体类型名称应该在 IANA 注册. 初始注册的媒体类型包括:
- audio (音频)
- video (视频)
- text (文本)
- application (应用)
- message (消息)
新的媒体类型可以通过IETF标准流程或专家审查注册.
8.2.2 传输协议 ("proto") (Transport Protocols)
初始注册的传输协议包括:
- RTP/AVP (RTP音视频配置文件)
- RTP/SAVP (RTP安全音视频配置文件)
- UDP (用户数据报协议)
新的传输协议可以通过IETF标准流程或专家审查注册.
8.2.3 媒体格式 ("fmt") (Media Formats)
媒体格式(如RTP有效载荷类型)的注册遵循RFC 3555中定义的程序.
8.2.4 属性名称 ("att-field") (Attribute Names)
SDP 属性名称在 IANA 注册. 新属性的注册应该包括:
- 属性名称
- 类型 (会话级, 媒体级或两者)
- 值(如果有)
- 用途和语义
- 参考规范
属性注册采用专家审查或IESG批准的注册程序.
8.2.5 带宽说明符 ("bwtype") (Bandwidth Specifiers)
初始注册的带宽说明符包括:
- CT (Conference Total, 会议总带宽)
- AS (Application Specific, 应用特定带宽)
新的带宽说明符可以通过IETF标准流程或专家审查注册.
8.2.6 网络类型 ("nettype") (Network Types)
初始注册的网络类型:
- IN (Internet, 互联网)
新的网络类型可以通过IETF标准流程注册.
8.2.7 地址类型 ("addrtype") (Address Types)
初始注册的地址类型:
- IP4 (IPv4地址)
- IP6 (IPv6地址)
新的地址类型可以通过IETF标准流程注册.
8.2.8 注册程序 (Registration Procedure)
除非另有说明,本节中描述的所有参数注册都使用以下程序之一:
- Standards Action (标准行动): 需要IETF RFC
- Expert Review (专家审查): 需要指定专家的审查
- IESG Approval (IESG批准): 需要IESG的明确批准
8.3 加密密钥访问方法 (Encryption Key Access Methods)
"k=" 字段使用的加密密钥访问方法应该在 IANA 注册. 初始注册的方法包括:
- clear (明文密钥)
- base64 (Base64编码的密钥)
- uri (密钥通过URI获取)
- prompt (提示用户输入密钥)
新的密钥访问方法可以通过专家审查注册.
10. 与 RFC 2327 的变更摘要 (Summary of Changes from RFC 2327)
RFC 4566废弃了RFC 2327和RFC 3266.本节概述了与RFC 2327相比的主要变更.
主要变更
规范性引用
- 更新了对其他RFC的引用,使用当前版本的规范性文档
- 添加了对RFC 3986 (URI语法) 的引用
国际化域名 (IDN)
- 明确要求国际化域名必须使用 ASCII 兼容编码 (ACE) 形式
- 禁止在SDP中直接使用UTF-8或其他编码表示IDN
媒体类型注册
- 更新了"application/sdp"媒体类型的注册信息
- 明确了编码考虑和安全考虑
ABNF语法
- 更新ABNF语法以反映当前实践
- 修正了一些语法规则的细微错误
- 使用RFC 4234 (现为RFC 5234) 的ABNF表示法
安全考虑
- 扩展了安全考虑章节
- 添加了关于NAT穿越和防火墙的讨论
- 强调了加密密钥分发的安全问题
IANA考虑
- 更新了参数注册程序
- 明确了各种SDP参数的注册要求
- 添加了新的注册类别
属性定义
- 澄清了某些属性的语义
- 更新了属性使用的示例
连接地址
- 澄清了"c=" 行中连接地址的使用
- 明确了IPv4和IPv6地址的表示
时间描述
- 澄清了时间字段的语义
- 更新了NTP时间戳的使用说明
编辑性变更
- 改进了文档结构和可读性
- 更新了示例以反映当前实践
- 修正了拼写和语法错误
- 统一了术语使用
向后兼容性
RFC 4566保持了与RFC 2327的向后兼容性.符合RFC 2327的实现应该能够处理符合RFC 4566的会话描述,反之亦然.
注意: 详细的变更列表和技术说明请参考 RFC 4566官方文档 第10节.
11. 致谢 (Acknowledgements)
SDP 的开发得益于 Multicast Backbone (MBONE) 社区的众多成员的贡献. 特别感谢 Eve Schooler, Steve Casner, Bill Fenner, Ron Frederick, Allison Mankin, Scott Shenker, Henning Schulzrinne 和其他许多人对 SDP 早期版本的评论和建议.
感谢MMUSIC工作组的所有成员对本文档各个版本的审查和评论.
特别感谢以下人员对RFC 4566的贡献和评论:
- Dave Singer
- Joerg Ott
- Jonathan Rosenberg
- Magnus Westerlund
- 以及所有提供反馈的IETF社区成员
完整的致谢名单请参考 RFC 4566官方文档 第11节.