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請求所必須的頭域字段。
Via |
To |
From |
Call-ID |
CSeq |
Contact |
Max-Forwards |