11. 查询能力 (Querying for Capabilities)
SIP方法OPTIONS允许UA查询另一个UA或代理服务器的能力。这允许客户端在不"振铃"对方的情况下发现有关支持的方法、内容类型、扩展、编解码器等的信息。例如, 在客户端将Require头字段插入INVITE中列出它不确定目标UAS支持的选项之前, 客户端可以使用OPTIONS查询目标UAS, 以查看此选项是否在Supported头字段中返回。所有UA必须支持OPTIONS方法。
OPTIONS请求的目标由Request-URI标识, 它可以标识另一个UA或SIP服务器。如果OPTIONS寻址到代理服务器, 则Request-URI的设置没有用户部分, 类似于为REGISTER请求设置Request-URI的方式。
或者, 接收到Max-Forwards头字段值为0的OPTIONS请求的服务器可以响应该请求, 而不管Request-URI如何。
此行为与HTTP/1.1常见。此行为可以用作"traceroute"功能, 通过发送一系列具有递增的Max-Forwards值的OPTIONS请求来检查各个跳服务器的能力。
与通用UA行为的情况一样, 如果OPTIONS没有产生响应, 事务层可以返回超时错误。这可能表明目标不可达, 因此不可用。
OPTIONS请求可以作为已建立对话的一部分发送, 以查询对等方在对话中稍后可能使用的能力。
11.1 构造OPTIONS请求 (Construction of OPTIONS Request)
OPTIONS请求使用第8.1.1节中讨论的SIP请求的标准规则构造。
Contact头字段可以出现在OPTIONS中。
Accept头字段应该包含在内, 以指示UAC希望在响应中接收的消息体类型。通常, 这被设置为用于描述UA的媒体能力的格式, 例如SDP (application/sdp)。
对OPTIONS请求的响应假定其范围限定为原始请求中的Request-URI。但是, 只有当OPTIONS作为已建立对话的一部分发送时, 才能保证将来的请求将由生成OPTIONS响应的服务器接收。
示例OPTIONS请求:
OPTIONS sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKhjhs8ass877
Max-Forwards: 70
To: <sip:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 63104 OPTIONS
Contact: <sip:[email protected]>
Accept: application/sdp
Content-Length: 0
11.2 处理OPTIONS请求 (Processing of OPTIONS Request)
对OPTIONS的响应使用第8.2.6节中讨论的SIP响应的标准规则构造。选择的响应代码必须与如果请求是INVITE时选择的代码相同。也就是说, 如果UAS准备接受呼叫, 将返回200 (OK), 如果UAS忙, 将返回486 (Busy Here), 等等。这允许使用OPTIONS请求来确定UAS的基本状态, 这可以指示UAS是否会接受INVITE请求。
在对话内接收到的OPTIONS请求会生成200 (OK) 响应, 该响应与在对话外构造的响应相同, 并且对对话没有任何影响。
由于代理对OPTIONS和INVITE请求的处理方式不同, OPTIONS的这种使用存在局限性。虽然分叉的INVITE可以导致返回多个200 (OK) 响应, 但分叉的OPTIONS将仅导致单个200 (OK) 响应, 因为它由代理使用非INVITE处理进行处理。有关规范性详细信息, 请参见第16.7节。
代理生成的响应
如果对OPTIONS的响应由代理服务器生成, 代理返回200 (OK), 列出服务器的能力。响应不包含消息体。
响应头字段
Allow、Accept、Accept-Encoding、Accept-Language和Supported头字段应该出现在对OPTIONS请求的200 (OK) 响应中。如果响应由代理生成, 则应该省略Allow头字段, 因为代理是方法不可知的, 所以这是模糊的。Contact头字段可以出现在200 (OK) 响应中, 并且具有与3xx响应中相同的语义。也就是说, 它们可以列出到达用户的一组替代名称和方法。Warning头字段可以出现。
消息体
可以发送消息体, 其类型由OPTIONS请求中的Accept头字段确定 (如果Accept头字段不存在, 则默认为application/sdp)。如果类型包括可以描述媒体能力的类型, UAS应该在响应中包含用于该目的的消息体。有关在application/sdp情况下构造此类消息体的详细信息, 请参见 [13]。
示例OPTIONS响应
由UAS生成的示例OPTIONS响应 (对应于第11.1节中的请求):
SIP/2.0 200 OK
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKhjhs8ass877
;received=192.0.2.4
To: <sip:[email protected]>;tag=93810874
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 63104 OPTIONS
Contact: <sip:[email protected]>
Contact: <mailto:[email protected]>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE
Accept: application/sdp
Accept-Encoding: gzip
Accept-Language: en
Supported: foo
Content-Type: application/sdp
Content-Length: 274
(SDP not shown)
OPTIONS方法应用场景
1. 能力协商
在发送INVITE之前查询目标是否支持特定扩展或功能。
场景: Alice想要使用扩展"foo", 但不确定Bob是否支持
步骤:
1. Alice发送OPTIONS到Bob
2. Bob返回200 OK, Supported头字段列出支持的扩展
3. Alice检查"foo"是否在列表中
4. 如果支持, Alice在INVITE中使用Require: foo
2. 媒体能力查询
查询对方支持的媒体类型和编解码器。
场景: 视频会议应用需要知道对方支持的视频编解码器
步骤:
1. 发送OPTIONS, Accept: application/sdp
2. 接收200 OK响应, 包含SDP描述的媒体能力
3. 根据能力信息选择合适的编解码器
3. 可用性检查
快速检查用户是否可用, 而不实际振铃。
场景: "在线状态"指示
步骤:
1. 定期发送OPTIONS到用户
2. 根据响应代码判断状态:
- 200 OK: 可用
- 486 Busy Here: 忙碌
- 480 Temporarily Unavailable: 暂时不可用
- 超时: 离线
4. 网络诊断 (Traceroute)
使用递增的Max-Forwards值来检查路径上每个服务器的能力。
场景: 诊断SIP网络路径
步骤:
1. 发送OPTIONS, Max-Forwards: 0 → 第一跳响应
2. 发送OPTIONS, Max-Forwards: 1 → 第二跳响应
3. 发送OPTIONS, Max-Forwards: 2 → 第三跳响应
...
OPTIONS与INVITE的关键区别
| 特性 | OPTIONS | INVITE |
|---|---|---|
| 目的 | 查询能力 | 建立会话 |
| 振铃 | 不振铃 | 振铃用户 |
| 对话 | 不建立对话 | 建立对话 |
| 分叉处理 | 返回单个200 OK | 可能返回多个200 OK |
| 状态影响 | 无状态影响 | 创建会话状态 |
| 响应代码 | 反映当前状态 | 反映是否接受会话 |
重要注意事项
-
所有UA必须支持: OPTIONS是强制性方法, 所有SIP实现都必须支持。
-
响应代码语义: OPTIONS的响应代码应该与INVITE相同, 以便客户端可以预测INVITE是否会成功。
-
分叉限制: 由于代理使用非INVITE处理, 分叉的OPTIONS仅返回一个200 OK, 这与INVITE不同。
-
对话中的使用: 可以在已建立的对话中发送OPTIONS来动态查询能力, 而不影响对话状态。
-
Accept头字段: 应该包含Accept头字段以指示期望的响应体类型, 通常是application/sdp。
本章小结:
第11章定义了OPTIONS方法, 这是SIP中用于能力查询的重要机制。OPTIONS允许客户端在不打扰用户的情况下发现服务器或用户代理的能力, 包括支持的方法、媒体类型、扩展等。这对于能力协商、可用性检查和网络诊断都非常有用。与INVITE不同, OPTIONS不建立对话, 也不会导致目标用户的设备振铃。