- SIP/2.0200 OK
- Via: SIP/2.0/UDPserver10.biloxi.com ;branch=z9hG4bKnashds8;received=192.0.2.3
- Via: SIP/2.0/UDPbigbox3.site3.atlanta.com ;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
- Via: SIP/2.0/UDPpc33.atlanta.com ;branch=z9hG4bK776asdhds ;received=192.0.2.1
- To:Bob <sip:bob@biloxi.com>;tag=a6c85cf
- From:Alice <sip:alice@atlanta.com>;tag=1928301774
- Call-ID:a84b4c76e66710@pc33.atlanta.com
- CSeq:314159 INVITE
- Contact:<sip:bob@192.0.2.4>
- Content-Type:application/sdp
- Content-Length:131
- (Bob'sSDP not shown)
響應(yīng)消息的第一行包含了響應(yīng)碼(200)和響應(yīng)原因短語(yǔ)習(xí)語(yǔ)(OK)。其余其他行消息包含 header值域消息。Via,To, From,Call-ID,和 CSeq header 值域都是從 INVITE請(qǐng)求中拷貝過來的。(注意,這里有三個(gè)Via 頭值–一個(gè)是Alice軟電話添加的,另外一個(gè)是atlanta.com代理服務(wù)器添加到,還有一個(gè)是biloxi.com代理添加的)。Bob的軟電話已經(jīng)在header中添加了一個(gè)taq標(biāo)簽參數(shù)To。這個(gè)標(biāo)簽將會(huì)在兩個(gè)終端的dialog中使用,也將會(huì)在此呼叫將來的請(qǐng)求和響應(yīng)使用。
Contact頭包含了一個(gè)URL地址,這個(gè)URL就是Bob可以直接訪問的軟電話地址。 Content-Type 和 Content-Length參考消息體(這里沒有列出),這個(gè)消息包含了BobSDP 媒體的信息。
另外,在這個(gè)示例中,DNS和定位查詢顯示代理服務(wù)器可以做一個(gè)靈活的路由決定,它可以決定往哪里發(fā)送請(qǐng)求。例如,如果Bob軟電話返回一個(gè)486 (Busy,忙狀態(tài))響應(yīng)的話,biloxi.com 代理服務(wù)器可以代理這個(gè)INVITE到Bob的語(yǔ)音郵箱服務(wù)器。代理服務(wù)器也可以同時(shí)發(fā)送一個(gè)INVITE到多個(gè)地址。這種類型的并行查詢方式稱之為forking(分支)處理方式。
在這個(gè)示例中,200 (OK) 消息通過兩個(gè)代理服務(wù)器返回到Alice,Alice軟電話收到響應(yīng)消息,軟電話停止回鈴音,表示呼叫已應(yīng)答。最后,Alice軟電話發(fā)送一個(gè)確認(rèn)消息ACK,這個(gè)消息發(fā)送到Bob軟電話來確認(rèn)最終響應(yīng) (200 (OK))已收到。在這個(gè)示例中,這個(gè)ACK是通過Alice軟電話直接被發(fā)送到了Bob軟電話,發(fā)送過程繞開了兩個(gè)代理服務(wù)器。這樣處理的原因就是因?yàn)閮蓚(gè)終端已經(jīng)通過互相學(xué)習(xí)知道對(duì)方的地址,雙方地址是通過INVITE/200(OK)交互時(shí)的Contact頭獲得,當(dāng)然這個(gè)地址在初始時(shí)的INVITE是雙方都不知道的。兩個(gè)代理服務(wù)器的查詢服務(wù)也不需要。因此,代理服務(wù)器則會(huì)退出這個(gè)呼叫流程。這個(gè)處理過程成功實(shí)現(xiàn)了 INVITE/200/ACK 三方握手,并且創(chuàng)建了SIP會(huì)話。完整的關(guān)于SIP會(huì)話創(chuàng)建的細(xì)節(jié),請(qǐng)參考Section 13。
注意,為了幫助讀者非常清晰地理解rfc3261,在本章節(jié)和未來的章節(jié)中筆者會(huì)適當(dāng)增加一些第三方的資料和流程圖,這樣比完全介紹rfc3261協(xié)議本身更加清晰,以便幫助讀者更好理解SIP協(xié)議。但是,為了保證rfc3261的權(quán)威性和完整性,如果是第三方的資料,筆者會(huì)盡量注明是非rfc3261協(xié)議資料。
非rfc3261協(xié)議資料
Alice和Bob之間的媒體會(huì)話啟動(dòng),他們之間的軟電話開始發(fā)送媒體數(shù)據(jù)包,媒體數(shù)據(jù)包的格式是他們之間的SDP交互互相同意支持的格式。一般來說,端對(duì)端的媒體數(shù)據(jù)通過不同的路徑發(fā)送,而不是使用SIP信令消息的路徑。
在這個(gè)會(huì)話過程中,Alice或Bob任何一方都可以有權(quán)決定修改媒體會(huì)話的屬性。修改會(huì)話屬性是通過發(fā)送一個(gè)re-INVITE消息,在此消息中包含一個(gè)新的媒體描述來實(shí)現(xiàn)。這個(gè)re-INVITE涉及到了已存在的dialog,因此其他的參與方知道這個(gè)消息是修改了現(xiàn)在的會(huì)話,而不是重新建立的新會(huì)話。其他方發(fā)送一個(gè)200(ok)接受這個(gè)修改。請(qǐng)求方對(duì)200(ok)發(fā)送一個(gè)ACK。如果其他方不能接受這個(gè)修改的話,它會(huì)發(fā)生一個(gè)錯(cuò)誤響應(yīng),例如488 (Not Acceptable Here),同樣也接收一個(gè)ACK確認(rèn)消息。但是,這個(gè)re-INVITE失敗不會(huì)導(dǎo)致目前的呼叫失敗-這個(gè)會(huì)話仍然會(huì)繼續(xù)使用以前協(xié)商的屬性。完整的話會(huì)修改細(xì)節(jié),請(qǐng)閱讀Section14。
在呼叫結(jié)束后,Bob首先掛機(jī)(hangs up),并且生成一個(gè)BYE消息。這個(gè)BYE會(huì)直接路由返回到Alice的軟電話,這里仍然繞過了代理。Alice確認(rèn)了BYE接收,發(fā)送一個(gè)200(ok),結(jié)束這個(gè)會(huì)話和BYE消息事務(wù)。這里沒有ACK發(fā)送-ACK發(fā)送僅發(fā)生在對(duì)INVITE請(qǐng)求的響應(yīng)中。對(duì)于對(duì)INVITE特別處理的原因會(huì)在后續(xù)的章節(jié)中討論,這里涉及了SIP中的可靠性機(jī)制問題,振鈴應(yīng)答的時(shí)間程度和分叉處理等因素。因?yàn)檫@個(gè)原因,SIP中的請(qǐng)求處理經(jīng)常被劃分為INVITE或者non-INVITE兩個(gè)層面,除了INVITE method以外,還涉及其他的所有methods 。完整的關(guān)于會(huì)話結(jié)束的詳情將在Section 15進(jìn)行討論。
Section 24.2 描述了在 Figure 1的完整的消息構(gòu)成。
在某些案例中,對(duì)于代理來說可能非常有用,在整個(gè)會(huì)話期間可以看到兩個(gè)終端之間在SIP信令路徑上的所有消息。例如,如果 biloxi.com 代理服務(wù)器希望保持除了初始INVITE以外的SIP消息,它對(duì)INVITE添加一個(gè)要求的路由header值,這個(gè)值我們稱之為Record-Route,用來解析主機(jī)或者代理的IP地址。因?yàn)锽ob軟電話(這個(gè)消息會(huì)通過200(ok)傳送會(huì)Bob)和Alice軟電話將會(huì)收到這個(gè)消息,在整個(gè)dialog過程中保存這個(gè)消息。biloxi.com 代理服務(wù)器將收到和對(duì)BYE代理轉(zhuǎn)發(fā)這個(gè)ACK,BYE和200(OK)。每個(gè)代理可以獨(dú)立決定收到的后續(xù)的消息,消息將被通過所有選擇接收的代理發(fā)送,這些代理來接收這個(gè)消息。這個(gè)能力經(jīng)常被代理使用,代理通過這個(gè)能力可以提供mid-call 功能或者呼叫期間的控制功能。
注冊(cè)是另外一個(gè)SIP常用的操作。注冊(cè)是一種方法,它可以使得biloxi.com服務(wù)器獲知當(dāng)前Bob的位置。Bob軟電話基于初始化處理,在一定周期內(nèi)Bob軟電話對(duì)在biloxi.com的服務(wù)器發(fā)送REGISTER消息,我們稱之為SIP registrar或者SIP注冊(cè)。REGISTER 消息關(guān)聯(lián)Bob的SIP軟電話或者SIPS URI (sip:bob@biloxi.com),這個(gè)機(jī)器是當(dāng)前Bob寫入記錄的地址(它在Contact頭中傳輸SIP或者SIPURL)。這個(gè)注冊(cè)會(huì)寫入此關(guān)聯(lián),也被稱之為在數(shù)據(jù)庫(kù)中的綁定或者定位服務(wù),此定位服務(wù)可以使用在biloxi.com 域的代理中。經(jīng)常,對(duì)于一個(gè)域的注冊(cè)服務(wù)器需要和這個(gè)域的代理協(xié)同工作。這里一定要注意,區(qū)分不同類型的SIP服務(wù)器功能概念是非常重要的,它們區(qū)別是在于邏輯處理的不同,而不是物理上,形體上的不同。
Bob不僅僅局限于從一臺(tái)設(shè)備注冊(cè)。例如,Bob的兩個(gè)終端設(shè)備,一臺(tái)在家里面,另外一臺(tái)在辦公室都發(fā)送注冊(cè)消息。兩臺(tái)設(shè)備的消息都保存在定位服務(wù)中,允許代理執(zhí)行各種對(duì)Bob 終端的定位查詢。
同樣的道理,同一時(shí)間,多個(gè)用戶可以注冊(cè)到一臺(tái)單個(gè)設(shè)備上。
定位服務(wù)僅是一個(gè)抽象概念。通常情況下,它包括一些必要的信息,它支持代理輸入一個(gè)URL,并且接收零個(gè)或多個(gè)URL,這些URL告訴代理往什么地址發(fā)送請(qǐng)求。注冊(cè)是一種方式來創(chuàng)建這些信息,但也不僅僅是這一種方式。任意映射功能可以通過管理員自行決定。
最后,一定要注意,在SIP中注冊(cè)是用來路由入局的SIP請(qǐng)求的,它不能充當(dāng)出局的授權(quán)請(qǐng)求的角色。在SIP中,簽權(quán)和身份認(rèn)證的處理可以基于逐一請(qǐng)求的方式,使用 challenge/response 機(jī)制的方式來處理,或使用更低一層的方案來處理,這種方案的討論在Section26有所描述。
完整的關(guān)于SIP注冊(cè)的消息細(xì)節(jié)示例在Section 24.1討論。
其他的SIP操作,例如查詢SIP服務(wù)器的能力或終端使用OPTIONS,或使用CANCEL取消正在進(jìn)行的請(qǐng)求等流程將會(huì)在后續(xù)之間進(jìn)行討論。
5 SIP 協(xié)議結(jié)構(gòu)
SIP 是按照一定的層級(jí)結(jié)構(gòu)創(chuàng)建的協(xié)議,這表示它的行為是根據(jù)一系列各自相對(duì)獨(dú)立的處理流程來實(shí)現(xiàn),每個(gè)處理階段之間是松耦合關(guān)系。協(xié)議行為描述為多個(gè)層級(jí),這樣是為了支持呈現(xiàn)的目的,支持標(biāo)準(zhǔn)的函數(shù)描述,這些描述涉及了單一環(huán)境的多個(gè)要素。它不能通過任何方式來決定部署。當(dāng)我們說一個(gè)要素“包含”一個(gè)層級(jí)時(shí),我們的意思是它符合一系列在這個(gè)層級(jí)所定義的規(guī)范規(guī)則。
不是每個(gè)通過協(xié)議設(shè)定的要素都包含在每個(gè)層級(jí)。進(jìn)一步說,在SIP協(xié)議中設(shè)定的要素是邏輯要素,不是物理形態(tài)的要素。一種物理實(shí)現(xiàn)可以選擇不同的邏輯要素來執(zhí)行,也許可以基于依次事務(wù)對(duì)事務(wù)的處理方式進(jìn)行。
非rfc3261協(xié)議資料
SIP結(jié)構(gòu)的最低層是語(yǔ)法和解碼層。解碼是通過增強(qiáng)的Backus-Naur Form grammar (BNF)語(yǔ)法來實(shí)現(xiàn)的。完整的BNF在Section 25有介紹。整個(gè)SIP消息結(jié)構(gòu)的總覽在Section 7介紹。
第二層是傳輸層。它定義了用戶如何發(fā)送請(qǐng)求,如何接收響應(yīng)和服務(wù)器如何通過網(wǎng)絡(luò)接收請(qǐng)求和發(fā)送響應(yīng)。所有SIP要素都包含一個(gè)傳輸層。傳輸層是在Section 18進(jìn)行描述。
參考資料:
https://www.rfc-editor.org/rfc/pdfrfc/rfc3262.txt.pdf
關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的Asterisk行業(yè)分享
Asterisk freepbx 中文官方論壇:http://bbs.freepbx.cn/forum.php
Asterisk freepbx技術(shù)文檔: www.freepbx.org.cn
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
Asterisk/FreePBX中國(guó)合作伙伴,官方qq技術(shù)分享群(3000千人):589995817