11. 查询能力
11 查询能力
SIP方法OPTIONS允许UA向另一UA或代理服务器查询其能力.这允许客户端发现有关支持的方法,Content-Type,扩展,编解码器等的信息,而无需"打电话"给另一方.例如,在客户机将Require头字段插入到INVITE中,列出一个不确定目标UAS支持的OPTIONS之前,客户机可以使用OPTIONS查询目标UAS,以查看该OPTIONS是否在支持的头字段中返回.所有UAs必须支持OPTIONS method.
OPTIONS请求的目标由Request-URI标识,该URI可以标识另一个UA或SIP服务器.如果这些OPTIONS指向代理服务器,则设置Request-URI时不使用用户部分,类似于为REGISTER request设置Request-URI的方式.
或者,接收Max-Forwards头字段值为0的OPTIONS request的服务器可以响应该请求,而不考虑Request-URI.
这种行为在HTTP/1.1中很常见.此行为可用作"跟踪路由"功能,通过发送一系列带有递增Max-Forwards值的OPTIONS request来检查各个跃点服务器的功能.
与一般UA行为一样,如果OPTIONS不产生响应,事务层可以返回超时错误.这可能表明目标无法到达,因此不可用.
OPTIONS request可以作为已建立对话的一部分发送,以查询对等方在该对话中稍后可能使用的功能.
11.1 OPTIONS request的构造
使用第8.1.1节中讨论的SIP请求标准规则构造OPTIONS request.
OPTIONS中可能存在Contact 头字段.
应包括Accept header字段,以指示UAC希望在响应中接收的消息体类型.通常,这被设置为用于描述UA的媒体能力的格式,例如SDP(应用程序/SDP).
假设对OPTIONS request的响应范围为原始请求中的Request-URI.但是,只有当OPTIONS作为已建立对话的一部分发送时,才能保证生成OPTIONS响应的服务器将收到未来的请求.
OPTIONS request示例:
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 request
对OPTIONS的响应使用第8.2.6节中讨论的SIP响应标准规则构建.选择的响应代码必须与请求为INVITE时选择的响应代码相同.也就是说,如果UAS准备好接受呼叫,将返回200(确定),如果UAS忙,将返回486(此处忙),等等.这允许使用OPTIONS request来确定UAS的基本状态,这可以指示UAS是否将接受INVITE请求.
在对话内接收的OPTIONS request生成200(确定)响应,该响应与在对话外构造的响应相同,并且不会对对话产生任何影响.
由于OPTIONS和INVITE请求的代理处理方式不同,因此使用OPTIONS具有局限性.虽然forked INVITE可能会返回多个200(OK)响应,但forked OPTIONS只会返回一个200(OK)响应,因为它由代理使用非INVITE处理进行处理.有关规范性详细信息,请参见第16.7节.
如果对OPTIONS的响应是由代理服务器生成的,则代理服务器将返回200(确定),列出服务器的功能.响应不包含消息体.
允许,接受,接受编码,接受语言和支持的头字段应出现在对OPTIONS request的200(确定)响应中.如果响应是由代理生成的,则应忽略Allow header字段,因为它是不明确的,因为代理是方法无关的.Contact 头字段可能出现在200(OK)响应中,并且具有与3xx响应相同的语义.也就是说,他们可以列出一组备选名称和联系用户的方法.可能存在警告头字段.
可以发送消息体,其类型由OPTIONS request中的Accept header字段确定(如果Accept header字段不存在,则默认为application/sdp).如果类型包括一个可以描述媒体能力的类型,UAS应该在响应中包含一个主体.[13]中描述了应用/sdp情况下此类主体的构造细节.
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)