Skip to main content

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), 列出服务器的能力。响应不包含消息体。

响应头字段

AllowAcceptAccept-EncodingAccept-LanguageSupported头字段应该出现在对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的关键区别

特性OPTIONSINVITE
目的查询能力建立会话
振铃不振铃振铃用户
对话不建立对话建立对话
分叉处理返回单个200 OK可能返回多个200 OK
状态影响无状态影响创建会话状态
响应代码反映当前状态反映是否接受会话

重要注意事项

  1. 所有UA必须支持: OPTIONS是强制性方法, 所有SIP实现都必须支持。

  2. 响应代码语义: OPTIONS的响应代码应该与INVITE相同, 以便客户端可以预测INVITE是否会成功。

  3. 分叉限制: 由于代理使用非INVITE处理, 分叉的OPTIONS仅返回一个200 OK, 这与INVITE不同。

  4. 对话中的使用: 可以在已建立的对话中发送OPTIONS来动态查询能力, 而不影响对话状态。

  5. Accept头字段: 应该包含Accept头字段以指示期望的响应体类型, 通常是application/sdp。


本章小结:

第11章定义了OPTIONS方法, 这是SIP中用于能力查询的重要机制。OPTIONS允许客户端在不打扰用户的情况下发现服务器或用户代理的能力, 包括支持的方法、媒体类型、扩展等。这对于能力协商、可用性检查和网络诊断都非常有用。与INVITE不同, OPTIONS不建立对话, 也不会导致目标用户的设备振铃。