Options用法

SIP方法OPTIONS允許一個UA來查詢另外一個UA或者proxy服務器的能力。這個提供個客戶端一個手段來查詢服務端支持的方法,內容類型,擴展,codecs等等。這些都不用”ringing”對方。比如,在客戶端試圖在INVITE請求頭中增加一個請求字段選項的時候,它並不知道對方UAS能否支持這個選項,它就可以用OPTIONS來查詢一下UAS,通過檢查OPTIONS返回的Supported頭域,就可以知道是否支持這個選項。所有的UA都必須支持OPTIONS方法。  
OPTIONS請求的目標是用Request-URI指明的,這個既可以是一個UA也可以是一個SIP服務器。如果OPTIONS指向一個proxy服務器,Request-URI設置成爲一個沒有用戶部分(user part)的,類似REGISTER請求中的Request-URI一樣。或者,一臺服務器收到一個OPTIONS請求並且Max-Forwards頭域值是0的時候,它就需要響應這個請求而不需要關心Request-URI的內容。 
這個機制就像HTTP/1.1一樣。這個機制可以用來實現類似”traceroute”功能來通過發出一系列的有着增量Max-Forwards頭域的OPTIONS請求來檢查每一個途徑節點的能力。 
就像對一般UA機制來說,如果OPTIONS沒有應答,transaction層能夠返回一個超時錯誤。這個可能標誌着對方無法到達因此無響應。OPTIONS請求可以作爲建立會話的一部分,用來查詢對方的能力使用,這樣在後續對話中可以使用雙方兼容的方式。 
構造OPTIONS請求 
一個OPTIONS請求可以根據RFC3261-8.1.1節中的標準構造方法來進行構造。 
Contact頭域在OPTIONS請求中可以存在,也可以不存在。 
Accept頭域應當包含在請求中,用來標誌UAC希望接收應答中的消息體的類型。通常情況下,這個設置成爲UA的多媒體兼容能力,比如SDP(應用/SDP)格式。 
對於一個OPTIONS請求的應答是假定是在原請求中的Request-URI範圍內的。但是,僅當一個OPTIONS請求作爲建立對話的一部分而發送的時候,後續的請求應當由收到並且響應這個OPTIONS請求的服務器進行處理。(就是說如果在建立會話的時候使用OPTIONS請求,那麼OPTIONS之後的這些請求都應該由這個OPTIONS查詢的服務器處理,這樣才能保證使用的特性和OPTIONS查詢出來的能力是一樣的)

OPTIONS請求的例子: 
OPTIONS sip: [email protected]  
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 
處理OPTIONS請求 
給OPTIONS的應答的構造遵循標準的構造規則(RFC3261—8.2.6節描述)。應答碼的選擇必須和處理INVITE請求一樣的應答碼(就像處理INVITE請求一樣的返回)。這就是說,200(OK)應當在UAS能夠接收請求的時候返回,486(忙)應當在UAS如果忙的時候返回。這樣OPTIONS可以用來檢測UAS的基本狀態,這就是說,我們可以用OPTIONS來知道UAS能否接收INVITE請求。 
在一個對話中的OPTIONS請求會產生一個200(OK)的應答,這是和在對話外創建的並且對對話沒有任何影響的請求相同。 
這個OPTIONS的使用有一定的限制,因爲對於proxy處理OPTIONS和INVITE請求的不同。一個分支的INVITE可以有多個200(OK)的應答返回,但是一個分支的OPTIONS只能有單個200(OK)應答返回。因爲這是由於proxy處理OPTIONS請求是當作非INVITE的處理。參見16.7節有詳細的說明。 
如果OPTIONS請求的應答是由proxy服務器給出的,proxy返回一個200(OK)的應答,列出這個服務器的各種選項和能力。 
應答沒有消息體 
Allow,Accept,Accept-Encoding,Accept-Language,和Supported頭域應當在200(OK)應答中出現。如果這個是由proxy產生的應答,那麼Allow頭域應當忽略,因爲proxy是方法無關的(也就是說不知道該如何處理方法的)。Contact頭域可以在200(OK)的應答中出現,並且與3xx應答有相同的語義。這就是說,他們可以列出指向客戶的一串名字和方法的集合(用以轉發請求)。一個Warning頭域是可以存在的。消息體也可以存在,消息體的類型是由OPTIONS請求的Accept頭域指明的(application/sdp是缺省的,如果Accpet頭域不存在的話)。如果Accept頭域中包含了一個類型能描述媒體接收能力,UAS應當在應答中包含一個消息體用於這個用途。詳細的application/sdp包體說明在[13]中描述。 
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)
本文轉自[水平網]:http://www.goalercn.com/article.php?id=368

發佈了25 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章