- 相關(guān)推薦
基于SIP協(xié)議的forking功能的研究和實(shí)現(xiàn)
摘要:SIP協(xié)議是用于建立、更改和終止呼叫的應(yīng)用層協(xié)議,在IMS系統(tǒng)中使用非常廣泛。而Fork是SIP中一個(gè)非常實(shí)用非常重要的功能,本文闡述了在Fork功能的基本原理,并在已有的SIP架構(gòu)上,分析了此功能的實(shí)現(xiàn)方法和具體的流程。
關(guān)鍵詞:SIP; Fork; TU
SIP簡(jiǎn)介
SIP(會(huì)話(huà)初始協(xié)議,RFC3261)是IETF定義的通過(guò)IP網(wǎng)絡(luò)建立和管理多媒體會(huì)話(huà)的協(xié)議,它采用的是眾所周知的客戶(hù)機(jī)服務(wù)器模式,它借鑒了SMTP(簡(jiǎn)單郵件傳送協(xié)議,RFC2821)以及HTTP(超文本傳送協(xié)議,RFC2616)的原理,而這兩個(gè)協(xié)議是因特網(wǎng)上最成功的協(xié)議,同時(shí),SIP是一個(gè)基于文本的協(xié)議,這意味著它更易于擴(kuò)展、糾錯(cuò)和構(gòu)建各種業(yè)務(wù)。因此,在IMS(IP多媒體子系統(tǒng))中,選擇SIP作為其會(huì)話(huà)控制協(xié)議,更易于建立具有更大承載能力的業(yè)務(wù)。
根據(jù)協(xié)議標(biāo)準(zhǔn)定義及實(shí)際研制經(jīng)驗(yàn),協(xié)議平臺(tái)的SIP協(xié)議分析劃分為以下幾部分內(nèi)容: SIP事務(wù)用戶(hù)層(TU,Transaction User),事務(wù)層(TR,TRansaction),傳輸層(TP,TransPort),編解碼模塊(SIP PARSER/SDPPARSER,SIP協(xié)議編解碼及SDP編解碼),信令壓縮模塊(SIGCOMP)幾個(gè)協(xié)議主體部分。除了這幾個(gè)協(xié)議主體以外,SIP還需要實(shí)現(xiàn)和上層業(yè)務(wù)、數(shù)據(jù)庫(kù)以及底層承載之間的接口,方便進(jìn)行數(shù)據(jù)以及消息的交互。
SIP協(xié)議的TU層是SIP協(xié)議主體的重要組成部分,它的功能包含幾個(gè)方面:(1)負(fù)責(zé)SIP消息到上層應(yīng)用進(jìn)程的消息分發(fā);對(duì)上層應(yīng)用屏蔽底層協(xié)議實(shí)現(xiàn)和分布式處理的細(xì)節(jié);(2)對(duì)于需要?jiǎng)?chuàng)建對(duì)話(huà)的,維護(hù)對(duì)話(huà)的生命周期,管理對(duì)話(huà)的事務(wù)列表;(3)完成UAC, UAS或者代理pro xy的協(xié)議棧行為。
SIP采用的是一種offer/answer模型來(lái)描述會(huì)話(huà)。一個(gè)UA發(fā)起一個(gè)會(huì)話(huà)描述,稱(chēng)為offer,另一個(gè)UA以另一個(gè)會(huì)話(huà)描述來(lái)進(jìn)行響應(yīng)則為answer,一個(gè)offer/answer在一個(gè)Dialog上下文中進(jìn)行交互,因?yàn)樵诰唧w實(shí)現(xiàn)SIP協(xié)議棧時(shí),TU需要建立數(shù)據(jù)區(qū)來(lái)維護(hù)對(duì)話(huà)Dialog的相關(guān)信息,如圖1所示,TU是通過(guò)建立leg模型來(lái)維護(hù)dialog的,TU建立的數(shù)據(jù)區(qū)稱(chēng)作leg,leg將會(huì)保存對(duì)于會(huì)話(huà)創(chuàng)建、會(huì)話(huà)釋放,處理請(qǐng)求、處理響應(yīng)所需要的一些關(guān)鍵信息,而這些信息是通過(guò)SIP消息從相應(yīng)的頭部中進(jìn)行提取,和會(huì)話(huà)相關(guān)的主要頭部From,To以及Call-ID中的信息將都會(huì)保存在leg中。
數(shù)據(jù)區(qū)的創(chuàng)建根據(jù)協(xié)議棧的行為分為UA和proxy兩種情況。
Proxy方式下會(huì)存在一人一出兩個(gè)Leg對(duì)象,人呼側(cè)由TU收到事務(wù)層的初始請(qǐng)求而創(chuàng)建人呼側(cè)Leg對(duì)象,消息通過(guò)人呼側(cè)Leg處理后上報(bào)上層應(yīng)用,上層應(yīng)用處理結(jié)束后,轉(zhuǎn)發(fā)初始請(qǐng)求到TU的出呼側(cè),TU進(jìn)而創(chuàng)建出呼側(cè)Leg對(duì)象以及下發(fā)SIP消息。
UA方式下,作為被叫網(wǎng)元,TU協(xié)議棧收到事務(wù)的初始請(qǐng)求后,創(chuàng)建人呼Leg后,通過(guò)初始請(qǐng)求消息上報(bào)上層業(yè)務(wù),上層業(yè)務(wù)處理完業(yè)務(wù)邏輯后,通過(guò)人呼Leg回送響應(yīng)到事務(wù)層。后續(xù)請(qǐng)求和響應(yīng)都是通過(guò)人呼Leg傳送。作為主叫網(wǎng)元,上層應(yīng)用調(diào)用發(fā)送初始請(qǐng)求接口到TU,TU創(chuàng)建出呼側(cè)Leg后,初始請(qǐng)求消息通過(guò)該Leg發(fā)送至事務(wù)層,后續(xù)請(qǐng)求和響應(yīng)都是通過(guò)出呼側(cè)Leg傳遞。
一、forking功能
fork即常說(shuō)的分叉,一個(gè)請(qǐng)求可以分叉為發(fā)往多個(gè)目標(biāo)地址的請(qǐng)求。假定B用戶(hù)為一號(hào)多機(jī)用戶(hù),即一個(gè)SIP用戶(hù)可以同時(shí)在很多終端上注冊(cè),每種終端可以實(shí)現(xiàn)不同的功能,比如便攜PC支持視頻而固定SIP電話(huà)可能功能簡(jiǎn)潔,B用戶(hù)多個(gè)終端同時(shí)在線,當(dāng)A用戶(hù)呼叫B用戶(hù)時(shí),那么B用戶(hù)的多個(gè)終端都會(huì)收到呼叫請(qǐng)求,它的任意終端都可以去響應(yīng)這個(gè)呼叫。A最終會(huì)選擇一個(gè)終端創(chuàng)建會(huì)話(huà)。
在IMS中實(shí)現(xiàn)fork功能涉及到的網(wǎng)元類(lèi)型分為終端(UA行為)以及代理服務(wù)器(proxy)行為,根據(jù)協(xié)議的描述,梳理不同網(wǎng)元的處理原則。
1.1 終端處理原則
(1)請(qǐng)求
根據(jù)協(xié)議的描述,只有初始對(duì)話(huà)(獨(dú)立事務(wù))請(qǐng)求才會(huì)發(fā)生fork。終端可以在初始請(qǐng)求INVITE的碼流中的通過(guò)添加Request-Disposition頭部中指示代理進(jìn)行fork的相關(guān)處理。同時(shí),當(dāng)被叫終端注冊(cè)了多個(gè)時(shí),主叫終端可以添加Accept-Contact,Reject-Contact參數(shù),指示代理選擇符合用戶(hù)偏好的被叫以及優(yōu)先級(jí)更高的被叫。
(2)響應(yīng)
當(dāng)fork發(fā)生時(shí),多個(gè)被叫終端都會(huì)對(duì)主叫產(chǎn)生響應(yīng),未創(chuàng)建對(duì)話(huà)前,主叫終端可以接受或拒絕任何被叫終端的Fork應(yīng)答,如果終端拒絕fork臨時(shí)應(yīng)答,那么必須發(fā)送cancel或者bye請(qǐng)求,這些請(qǐng)求是針對(duì)每個(gè)終端即每一個(gè)fork的分支都需要發(fā)出。
主叫終端如果接收到被叫終端一個(gè)fork分支的成功應(yīng)答即2xx響應(yīng),開(kāi)始創(chuàng)建會(huì)話(huà);應(yīng)該釋放其他fork分支的早對(duì)話(huà)和非早對(duì)話(huà),具體釋放的方式根據(jù)各個(gè)fork分支的不同而不同。其中對(duì)于已經(jīng)收到了臨時(shí)響應(yīng)的fork分支,不管是否建立起了早對(duì)話(huà),則發(fā)送CANCEL請(qǐng)求來(lái)釋放;對(duì)于沒(méi)有收到任何的臨時(shí)響應(yīng)的fork分支,則不能發(fā)送CANCEL請(qǐng)求,通過(guò)TU設(shè)置的保護(hù)定時(shí)器超時(shí),來(lái)釋放該分支的相關(guān)資源。
主叫終端只能收到一條最終響應(yīng),如果收到2xx響應(yīng),則建立對(duì)話(huà),如果為2xx以上的響應(yīng),則認(rèn)為無(wú)法建立呼叫,則需要釋放呼叫。
1.2 代理處理原則
(1)請(qǐng)求
提取碼流中fork和用戶(hù)喜好相關(guān)的字段,處理fork請(qǐng)求,比如到被叫的歸屬的服務(wù)器,需要將初始INVITE請(qǐng)求分叉為多個(gè)發(fā)送到被叫終端,對(duì)于非初始請(qǐng)求,需要進(jìn)行轉(zhuǎn)發(fā)。
(2)響應(yīng)
立即轉(zhuǎn)發(fā)除100(Trying)以外的任何臨時(shí)響應(yīng)。立即轉(zhuǎn)發(fā)能成功建立對(duì)話(huà)的第一條2xx成功響應(yīng),如果其中任意一個(gè)地址接收呼叫,該網(wǎng)絡(luò)服務(wù)器應(yīng)該向其它地址發(fā)送CANCEL消息,如果由于網(wǎng)絡(luò)時(shí)延而導(dǎo)致在代理服務(wù)器接收到多個(gè)200消息,代理服務(wù)器應(yīng)當(dāng)將后續(xù)的200消息拒絕掉,不應(yīng)當(dāng)后向轉(zhuǎn)發(fā),這樣能保證只有一個(gè)終端能夠建立對(duì)話(huà)。
對(duì)于3xx類(lèi)以上的非成功響應(yīng),根據(jù)響應(yīng)碼的具體含義進(jìn)行處理,比如3xx需要優(yōu)先傳到主教終端進(jìn)行重定向,而對(duì)于4xx、5xx、6xx等非成功相應(yīng),即先保存這些響應(yīng),如果最后沒(méi)有收到任何2xx響應(yīng),則根據(jù)協(xié)議規(guī)定的優(yōu)選的原則選擇響應(yīng)碼發(fā)送到主叫終端,結(jié)束整個(gè)會(huì)話(huà)。
二、SIP中fork的實(shí)現(xiàn)原理
SIP協(xié)議實(shí)現(xiàn)fork的基本邏輯功能:包括fo rk呼叫狀態(tài)維護(hù),管理多個(gè)臨時(shí)響應(yīng)創(chuàng)建的對(duì)話(huà),并在會(huì)話(huà)創(chuàng)建之前維持多個(gè)早對(duì)話(huà)出/人呼側(cè)消息的正確關(guān)聯(lián)關(guān)系。上層業(yè)務(wù)維護(hù)多個(gè)Contact的上下文與分叉呼叫之間的關(guān)系,分別對(duì)早對(duì)話(huà)進(jìn)行承載控制。
2.1 確定是否發(fā)生fork
當(dāng)被叫終端注冊(cè)了多個(gè)Contact地址時(shí),SIP協(xié)議需要去提取碼流中的相關(guān)字段,通過(guò)Accept-Contact,Reject-Contact參數(shù)確定好被叫目標(biāo)集,并按照優(yōu)先級(jí)將多個(gè)被叫終端進(jìn)行排序,進(jìn)一步的提取Request-Disposition頭部的關(guān)鍵信息,對(duì)是否需要進(jìn)行fork進(jìn)行確定,該頭部的內(nèi)容如下:
proxy-directive=”proxy”
fork-directive="fork"/"no-fork"
parallel-directive="parallel"/"sequential"
其中proxy-directive確定當(dāng)前的網(wǎng)元是否為代理proxy,fork-directive是用來(lái)指示是否需要fork,當(dāng)指示為”no-fork”時(shí),雖然被叫有多個(gè),但是初始請(qǐng)求只會(huì)發(fā)送給優(yōu)先級(jí)最高的被叫終端并不會(huì)產(chǎn)生分叉,如果指示為”fork”時(shí),則進(jìn)一步的讀取parallel-directive指示的值,parallel-directive若為“parallel”為并行fork,并行fork則需要被叫歸屬的代理服務(wù)器將初始的INVITE請(qǐng)求同時(shí)發(fā)送給多個(gè)被叫終端,既并行呼叫;若為“sequential”為串行fork,串行fork則不需要代理服務(wù)器將初始請(qǐng)求同時(shí)發(fā)送給多個(gè)被叫終端,而是逐個(gè)的發(fā)送,先發(fā)給第一個(gè)優(yōu)先級(jí)最高的被叫,如果接通,則不需要進(jìn)行后續(xù)處理,如果沒(méi)有成功接續(xù),則繼續(xù)發(fā)送給第二個(gè)被叫,依次類(lèi)推。
2.2 TU中會(huì)話(huà)的維護(hù)
從前面SIP的簡(jiǎn)介我們得知,TU需要去維護(hù)會(huì)話(huà)dialog,而對(duì)于dialog的維護(hù),TU需要?jiǎng)?chuàng)建數(shù)據(jù)區(qū)Leg去保存相應(yīng)的信息,fork情況下,可能存在同時(shí)發(fā)起多路fork分支的呼叫,而多個(gè)被叫終端的對(duì)話(huà)信息是不完全相同的,如果把所有的信息都保存在簡(jiǎn)單情況下的一個(gè)Leg數(shù)據(jù)區(qū)里,則容易引起一些誤操作,邏輯很不清楚,所以,可以采用TU維護(hù)多對(duì)數(shù)據(jù)區(qū)的方式來(lái)解決。
普通呼叫情況下,SIP的TU層只需要維護(hù)人呼側(cè)和出呼側(cè)的一對(duì)Leg即可,這樣所有的消息都通過(guò)這一對(duì)Leg來(lái)進(jìn)行關(guān)鍵信息的記錄以及轉(zhuǎn)發(fā)。而fork情況下,由于終端有多個(gè),而每個(gè)終端都可以傳送不同的請(qǐng)求和響應(yīng)到主叫終端,為了對(duì)每個(gè)終端的信息進(jìn)行彼此獨(dú)立的進(jìn)行保存,TU為每一個(gè)終端建立對(duì)應(yīng)的數(shù)據(jù)區(qū)Leg,具體如圖2所示,圖2和圖1比較可以看出,fork情況下,TU的人呼側(cè)和出呼側(cè)分別有多個(gè)Leg,而且人呼側(cè)和出呼側(cè)是一一對(duì)應(yīng)的,比如In Leg(0)和Out Leg(0)是對(duì)應(yīng)第一個(gè)被叫終端,用來(lái)記錄第一個(gè)別叫終端和主叫之間的會(huì)話(huà)信息,并進(jìn)行這一分支呼叫的消息轉(zhuǎn)發(fā),而In Leg(l)和Out Leg(l)是為主叫終端和第二個(gè)被叫終端服務(wù)的。當(dāng)然,不管是fork的第一個(gè)分支還是第二個(gè)分支和主叫發(fā)生聯(lián)系,這都是屬于當(dāng)前的這一個(gè)完整的會(huì)話(huà),因此兩路分支之間也可能有信息的交互,此時(shí)可以通過(guò)CALL這樣的一個(gè)空間來(lái)保存兩者的數(shù)據(jù)區(qū)索引,方便通過(guò)一個(gè)人呼叫的Leg能很快的訪問(wèn)到另一個(gè)分支的Leg。
三、具體流程
SIP的具體流程要分為并行和串行兩種情形,分別進(jìn)行介紹:
3.1 并行流程
在并行流程中主叫的請(qǐng)求會(huì)同時(shí)被發(fā)送給兩個(gè)別叫用戶(hù),具體流程如圖3所示,其中User AgentA為主叫用戶(hù),User Agent B,C為被叫用戶(hù),Proxy Server是IMS系統(tǒng)中的某個(gè)具體的網(wǎng)元,是代理服務(wù)器,主要是起到消息轉(zhuǎn)發(fā)以及完成fork功能的作用。
各步驟的具體含義如下:
主叫用戶(hù)A發(fā)起請(qǐng)求INVITE到代理服務(wù)器,對(duì)應(yīng)圖上消息(1);
假定此代理服務(wù)器是被叫歸屬地的網(wǎng)元,它能檢測(cè)到有多個(gè)被叫聯(lián)系contact地址,同時(shí)通過(guò)Request-Disposition確定為發(fā)生并行fork,于是,向兩個(gè)被叫用戶(hù)B和C發(fā)起INVITE請(qǐng)求,對(duì)應(yīng)圖上消息(2)和(3);
兩個(gè)被叫用戶(hù)收到INVITE請(qǐng)求后,提示用戶(hù)并振鈴,都發(fā)送180( Ringing)消息通過(guò)代理服務(wù)器傳給主叫用戶(hù),主叫用戶(hù)能同時(shí)聽(tīng)到兩個(gè)被叫的回鈴音,對(duì)應(yīng)圖上消息(4)(5)(6)(7),此時(shí),兩路別叫的180消息中的To頭部的tag值是不一樣的,這樣代理服務(wù)器中實(shí)現(xiàn)SIP的TU層就可以維護(hù)兩個(gè)leg,來(lái)保存兩路的不同會(huì)話(huà)信息;
兩個(gè)被叫用戶(hù)都會(huì)送響應(yīng),上圖中被叫用戶(hù)B接通呼叫,產(chǎn)生2000K的應(yīng)答,而被叫用戶(hù)C則回送4XX消息,顯示忙,代理服務(wù)器接收到兩個(gè)被叫的不同應(yīng)答,需要進(jìn)行處理,它主動(dòng)地對(duì)被叫用戶(hù)C回送ACK,以結(jié)束被叫用戶(hù)C之間的呼叫,同時(shí)將被叫用戶(hù)B的200 OK轉(zhuǎn)發(fā)到主叫側(cè),具體對(duì)應(yīng)圖上的(8)(9)(10)(11); 主叫收到成功響應(yīng)后,回送ACK消息到被叫用戶(hù)B予以證實(shí),呼叫建立,對(duì)應(yīng)圖上的(12)和(13);
主叫掛機(jī),發(fā)送BYE消息,被叫回應(yīng)200 0K響應(yīng),整個(gè)通話(huà)結(jié)束,對(duì)應(yīng)圖上的(14)(15)(16)(17)。
3.2 串行流程
在并行流程中主叫的請(qǐng)求會(huì)按照優(yōu)先級(jí)先后發(fā)送給兩個(gè)被叫用戶(hù),具體流程如圖4所示:
各步驟的具體含義如下:
主叫用戶(hù)A發(fā)起請(qǐng)求INVITE到代理服務(wù)器,對(duì)應(yīng)圖上消息(1);
假定此代理服務(wù)器是被叫歸屬地的網(wǎng)元,它能檢測(cè)到有多個(gè)被叫聯(lián)系co ntact地址,同時(shí)通過(guò)Request-Disposition確定為發(fā)生串行fork,就需要根據(jù)兩個(gè)被叫用戶(hù)的優(yōu)先級(jí),優(yōu)先級(jí)通過(guò)Accept-Contact,Reject-Contact等參數(shù)按照RFC3841協(xié)議規(guī)定的原則進(jìn)行權(quán)值的計(jì)算,假定用戶(hù)B的優(yōu)先級(jí)高于用戶(hù)C,代理服務(wù)器現(xiàn)將INVITE轉(zhuǎn)發(fā)給用戶(hù)B,對(duì)應(yīng)圖上消息(2);
被叫用戶(hù)B收到INVITE請(qǐng)求后,提示用戶(hù)并振鈴,并發(fā)送180(Ringing)消息通過(guò)代理服務(wù)器傳給主叫用戶(hù),主叫用戶(hù)能聽(tīng)到被叫用戶(hù)B的回鈴音,對(duì)應(yīng)圖上消息(3)(4);
被叫用戶(hù)B忙,因此回送4XX消息,代理服務(wù)器接收后,由于是fo rk情況,因此不將此失敗響應(yīng)發(fā)送給主叫用戶(hù),直接給被叫用戶(hù)回送ACK確認(rèn),并將此初始請(qǐng)求消息INVITE繼續(xù)發(fā)送到第二個(gè)用戶(hù)C,對(duì)應(yīng)圖上消息(5)(6)(7);
被叫用戶(hù)C收到INVITE請(qǐng)求后,提示用戶(hù)并振鈴,并發(fā)送180(Ringing)消息通過(guò)代理服務(wù)器傳給主叫用戶(hù),并進(jìn)一步的發(fā)送200 0K響應(yīng)接續(xù)通話(huà),對(duì)應(yīng)圖上消息(8)(9)(10)(11);
主叫收到成功響應(yīng)后,回送ACK消息到被叫用戶(hù)B予以證實(shí),呼叫建立,對(duì)應(yīng)圖上的(12)和(13);
主叫掛機(jī),發(fā)送BYE消息,被叫回應(yīng)200 0K響應(yīng),整個(gè)通話(huà)結(jié)束,對(duì)應(yīng)圖上的(14)(15)(16)(17)。
四、結(jié)束語(yǔ)
總體來(lái)說(shuō),fork功能的實(shí)現(xiàn)是比較復(fù)雜的,SIP協(xié)議層面要考慮非常多的異常情況,比如所有被叫用戶(hù)都無(wú)法建議呼叫、或者兩個(gè)被叫同時(shí)回送2000K成功響應(yīng)等情況,而且整個(gè)功能的完成,還需要底層以及上層業(yè)務(wù)的配合,比如考慮如何對(duì)兩個(gè)被叫都建立媒體通道等問(wèn)題,這些在本文中沒(méi)有闡述,本文主要介紹的是在現(xiàn)有的SIP架構(gòu)的基礎(chǔ)上,通過(guò)TU層維護(hù)多路呼叫的數(shù)據(jù)區(qū)的方法去實(shí)現(xiàn)fork功能,目前此方案已經(jīng)在企業(yè)中采用并實(shí)現(xiàn)。
【基于SIP協(xié)議的forking功能的研究和實(shí)現(xiàn)】相關(guān)文章:
基于SIP的多媒體終端的研究與實(shí)現(xiàn)03-07
基于SIP(會(huì)話(huà)初始協(xié)議)的語(yǔ)音瀏覽器的研究與實(shí)現(xiàn)03-07
基于WIFI-SIP的固定移動(dòng)融合實(shí)現(xiàn)方案03-07
一種基于SIP和移動(dòng)IP的切換機(jī)制的研究03-07
基于功能實(shí)現(xiàn)的成本管理狀況評(píng)價(jià)內(nèi)容研究03-23
基于主機(jī)的3D網(wǎng)絡(luò)應(yīng)用的研究和實(shí)現(xiàn)03-03
基于ASP網(wǎng)絡(luò)銷(xiāo)售系統(tǒng)的實(shí)現(xiàn)與研究03-23