SIP 請求方法(1)-INVITE

        SIP請求的類型,也稱做SIP方法。RFC3261 中定義了六種方法。另外八種方法有獨立的RFC擴展描述。bash

        SIP請求或方法在協議中被視爲「動詞」,由於它們請求另外一個UA或服務器執行一項特定的動做。INVITE、 REGISTER、BYE、ACK、 CANCEL 和 OPTIONS是SIP最初定義的六種方法。REFER、SUBSCRIBE、NOTIFY、PUBLISH、MESSAGE、UPDATE、 INFO 和 PRACK這些方法是在擴展的RFC中定義的。服務器

        UA收到不支持的請求方法時,迴應501 Not Implemented response消息。方法名是大小寫敏感的,爲了區分頭域字段,方法名一般所有使用大寫字母,而頭域字段內容容許大小寫混合。注意:代理服務器轉發請求不須要理解請求的方法。代理服務器把未知的方法視爲OPTIONS處理,換句話說,它應該儘量地把請求轉發給宿端。這樣,UA引入新特性或方法就不須要中間代理的額外支持。UA應當在請求和應答消息中攜帶Allow頭域以說明它所支持的方法。app

INVITE

        INVITE方法用於UA之間創建媒體會話。在電信領域中,它相似於ISDN的Setup消息或ISUP裏的初始地址消息 (IAM)。 對於INVITE請求的最終應答,都須要用ACK方法確認。ui

        INVITE消息一般帶有消息體,消息體包含主叫方的媒體信息。消息體還能夠包含其它會話信息,好比說資源列表。若是INVITE消息中沒有攜帶媒體信息,那麼就要在UAC發出的ACK中攜帶。若是ACK中的媒體信息是不能接受的,那麼主叫方必須發一條BYE消息以終止會話。這時不能用CANCEL方法,由於會話已經創建了。媒體會話創建的時間點是UAC與UAS間INVITE, 200 OK, 和 ACK消息交互完成那一刻。成功的INVITE請求在兩個UA間創建一個dialog,它一直持續到其中一方發出BYE的時候,這時會話終止。spa

        UAC生成INVITE消息創建dialog時,建立一個全局惟一的Call-ID,這個ID在呼叫持續期間一直使用。同時初始化CSeq計數(它不必定爲1,但必須是整數),此後每發一個新的請求,CSeq值遞增,但Call-ID不變。To 和 From 頭域以遠端和本端地址填充。INVITE請求中攜帶From tag,UAS生成To tag並在應答消息中攜帶。ACK以及dialog內的後續請求沿用200 OK中的To tag。To tag、From tag,和Call-ID的組合構成dialog的惟一標識符。代理

        在dialog中發的INVITE請求,引用初始INVITE請求的Call-ID、To tag 和From tag。這類消息稱爲re-INVITE,用於變動會話的特徵或刷新dialog的狀態。CSeq命令序列號遞增,這樣UAS就能區分re-INVITE和初始INVITE的重發。code

        若是re-INVITE被拒絕或者處理失敗,那麼會話繼續,就像re-INVITE沒有發生同樣。若是初始INVITE還沒收到最終應答,那麼UAC不容許發re-INVITE,若是這時須要變動會話參數,能夠用UPDATE請求。還有一種場景,兩個UA同時向對方發re-INVITE。這個以經過Retry-After頭域來處理。這種狀況在電話中稱爲glare,當中繼兩端同時佔據中繼線時發生。ip

        INVITE消息中的Expires頭域告訴UAS請求的有效時間。UAS能夠在Expires頭域指定的時間範圍內一直顯示來提醒。一旦會話創建,Expires頭域馬上失去意義,它不表示媒體會話的持續時間。若是要限制媒體會話的持續時間,能夠經過Session-Expires頭域表達,若是攜帶這個頭域,以後還能夠經過re-INVITE 或 UPDATE 刷新。ci

如下是一個攜帶SDP消息體的INVITE請求實例:資源

INVITE sip:411@salzburg.example.org;user=phone SIP/2.0
Via: SIP/2.0/UDP salzburg.example.org:5060;branch=z9hG4bK1d32hr4
Max-Forwards:70
To: <sip:411@salzburg.at;user=phone>
From: Christian Doppler <sip:c.doppler@salzburg.example.org> ;tag=817234
Call-ID: 12-45-A5-46-F5-43-32-F3-C2
CSeq: 1 INVITE
Subject: Train Timetables
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, REFER, SUBSCRIBE, NOTIFY
Contact: sip:c.doppler@salzburg.example.org
Content-Type: application/sdp
Content-Length: ...

v=0
o=doppler 2890842326 2890844532 IN IP4 salzburg.example.org
s=
c=IN IP4 50.61.72.83
t=0 0 
m=audio 49172 RTP/AVP 97 98 0
a=rtpmap:97 iLBC/8000
a=rtpmap:98 SPEEX/8000
a=rtpmap:0 PCMU/8000

        除了頭域required以外,這個請求還攜帶了幾個可選頭域:Subject、Allow。注意Request-URI中包含的是電話號碼。

        下表中列出了INVITE請求所必須的頭域字段。

 

 

INVITE 中所必須的頭域字段

Via

To

From

Call-ID

CSeq

Contact

Max-Forwards
相關文章
相關標籤/搜索