1、SIP注冊(cè)和重注冊(cè)處理
根據(jù)上一個(gè)章節(jié)中關(guān)于SIP技術(shù)架構(gòu)的討論中,我們可以發(fā)現(xiàn),SIP注冊(cè)需要通過(guò)定位服務(wù)器來(lái)發(fā)現(xiàn)其具體的地址信息。終端注冊(cè)需要通過(guò)注冊(cè)服務(wù)和定位查詢服務(wù)來(lái)找到其終端地址。具體的注冊(cè)流程如下圖所示,當(dāng)SIP終端開(kāi)始注冊(cè)時(shí),它會(huì)對(duì)注冊(cè)服務(wù)器發(fā)送當(dāng)前的地址和定位消息,注冊(cè)服務(wù)器然后通過(guò)定位服務(wù)器更新其定位信息。定位服務(wù)器來(lái)類(lèi)似于LADP服務(wù)或微軟的目錄服務(wù)(如 Active Directory)。一旦終端消息更新以后,其他用戶可以通過(guò)其“廣播”地址以及綁定的通過(guò)解析的IP地址聯(lián)系此終端用戶。這里的IP地址就是具體的物理終端地址或者軟電話地址。當(dāng)然,大部分情況下,注冊(cè)服務(wù)還可以要求UA進(jìn)行認(rèn)證處理,需要發(fā)送用戶名稱和密碼進(jìn)行驗(yàn)證。在后續(xù)章節(jié)我們將重點(diǎn)討論其驗(yàn)證流程。需要提醒讀者的是,一般讀者經(jīng)常使用B2BUA的服務(wù)器或者開(kāi)源的媒體服務(wù)器,在用戶遇到的SIP注冊(cè)中,我們僅看到的是一臺(tái)服務(wù)器實(shí)現(xiàn)注冊(cè),事實(shí)上,注冊(cè)服務(wù)和定位服務(wù)是可以互相獨(dú)立的,注冊(cè)服務(wù)器和定位服務(wù)器也可以是同一臺(tái)服務(wù)器。關(guān)于注冊(cè)綁定和呼叫的一些具體流程,用戶也可以參考?xì)v史文檔:
一封信讀懂SIP注冊(cè)消息關(guān)鍵詞
關(guān)于SIP Proxy處理中的八大疑問(wèn)討論
在RFC3261的8.1.1.8和10-1中,官方對(duì)contact有非常具體的定義,定位是對(duì)其具體IP地址的定位,contact最終是具體通信的地址(specific instance of the UA)。
除了注冊(cè)以外,在呼叫中也同樣需要進(jìn)行類(lèi)似的處理。其具體的注冊(cè)和定位綁定關(guān)系需要數(shù)據(jù)庫(kù)進(jìn)行不斷更新來(lái)保證,關(guān)于其URL替換處理流程,讀者可以參考:關(guān)于SIP Proxy處理中的八大疑問(wèn)討論
在UA發(fā)起注冊(cè)時(shí),除了需要知道終端的具體IP地址以外,UA注冊(cè)的另外一個(gè)目的是獲得其功能支持能力類(lèi)型。UA注冊(cè)時(shí)也會(huì)通知注冊(cè)服務(wù)其終端支持的功能類(lèi)型,例如是否僅支持語(yǔ)音不支持視頻,是否支持必要的methods,語(yǔ)言等。具體的功能支持完整列表,建議讀者參考RFC3840 規(guī)范。一般讀者關(guān)注contact 部分參數(shù)即可,具體實(shí)例如下:
REGISTER sip:example.com SIP/2.0
From: sip:user@example.com;tag=asd98
To: sip:user@example.com
Call-ID: hh89as0d-asd88jkk@host.example.com
CSeq: 9987 REGISTER
Max-Forwards: 70
Via: SIP/2.0/UDP host.example.com;branch=z9hG4bKnashds8
Contact: <sip:user@host.example.com>;audio;video
;actor="msg-taker";automata;mobility="fixed"
;methods="INVITE,BYE,OPTIONS,ACK,CANCEL"
Content-Length: 0
一般物理SIP電話的移動(dòng)的可能性不大,在一個(gè)企業(yè)內(nèi)網(wǎng)環(huán)境中,其地址不會(huì)經(jīng)常發(fā)生變化。但是,如果同一SIP賬號(hào)支持了多賬號(hào)注冊(cè)或者物理話機(jī)停用以后,SIP賬號(hào)IP地址也可能發(fā)生遷移。用戶使用軟電話或者APP 軟電話登錄了SIP賬號(hào)。在很多SIP運(yùn)營(yíng)場(chǎng)景中,如果用戶在筆記本電腦或者是手機(jī)端的APP發(fā)送了地址變化,此SIP賬號(hào)需要重新注冊(cè),通過(guò)查詢定位服務(wù)器,重新注冊(cè)找到自己新的IP地址。因此,SIP賬號(hào)重新注冊(cè)也是一個(gè)非常普遍的SIP注冊(cè)場(chǎng)景。
2、什么是SIP代理服務(wù)器以及使用代理服務(wù)器的原因
在一般的企業(yè)通信環(huán)境中,用戶都會(huì)經(jīng)常使用B2BUA代理服務(wù)器,例如IPPBX/UC這類(lèi)產(chǎn)品。這些產(chǎn)品可以支持用戶可以實(shí)際操作的典型的業(yè)務(wù)場(chǎng)景,比如,IVR,隊(duì)列,錄音等需求。SIP代理服務(wù)器對(duì)于一般用戶來(lái)說(shuō),他本身不支持呼叫的媒體業(yè)務(wù)功能,用戶也對(duì)SIP代理服務(wù)器相對(duì)比較陌生。但是,SIP代理服務(wù)器在整個(gè)SIP網(wǎng)絡(luò)中起著非常重要的重要,因此,這里筆者認(rèn)為有必要再次對(duì)其概念做一次梳理。
根據(jù)RFC3261-16對(duì)代理的定義,我們可以知道,SIP代理服務(wù)器其主要工作就是找到SIP請(qǐng)求需要通信的SIP服務(wù)器地址,并且前轉(zhuǎn)請(qǐng)求或者轉(zhuǎn)發(fā)SIP請(qǐng)求到下一個(gè)SIP服務(wù)器。它將會(huì)解析SIP請(qǐng)求消息,如有必要在轉(zhuǎn)發(fā)SIP請(qǐng)求之前對(duì)SIP請(qǐng)求進(jìn)行重寫(xiě)。它可以觸發(fā)請(qǐng)求和響應(yīng)消息,影響SIP客戶端和服務(wù)器端工作流程。從以上概念我們知道,SIP代理服務(wù)器其工作方式其實(shí)是非常抽象的,越抽象的概念往往在部署使用時(shí)越靈活。為了對(duì)SIP請(qǐng)求進(jìn)行各種必要的處理,SIP代理服務(wù)器必須按照請(qǐng)求要求做SIP狀態(tài)處理。SIP代理服務(wù)器可以設(shè)置支持有狀態(tài)代理服務(wù)器和無(wú)狀態(tài)代理服務(wù)器,并且SIP代理服務(wù)器可以對(duì)呼入SIP請(qǐng)求分叉處理,對(duì)SIP的多注冊(cè)定位地址進(jìn)行呼叫。因此,為了完整了解代理服務(wù)器的功能,讀者需要掌握四個(gè)SIP代理服務(wù)器(只有前兩種是RFC3261的定義)基本的概念:
- Stateful Proxy(有狀態(tài)代理):SIP請(qǐng)求經(jīng)過(guò)SIP有狀態(tài)代理,SIP代理會(huì)記住SIP呼入請(qǐng)求和SIP呼出請(qǐng)求。
- Stateless Proxy(無(wú)狀態(tài)代理):SIP請(qǐng)求經(jīng)過(guò)無(wú)狀態(tài)代理以后,無(wú)狀態(tài)代理一旦生成了SIP呼出請(qǐng)求,無(wú)狀態(tài)代理就會(huì)丟棄所有消息記錄。
- Dialog Stateful 和Transaction Stateful Proxy,這兩種SIP代理是基于有狀態(tài)代理基礎(chǔ)部署的更細(xì)分的應(yīng)用場(chǎng)景,對(duì)SIP會(huì)話和事務(wù)狀態(tài)進(jìn)行Dialog和事務(wù)層級(jí)的處理的代理模式。其用途和對(duì)服務(wù)器的處理能力有所不同,事務(wù)代理相對(duì)消耗比較少的系統(tǒng)資源。 筆者建議讀者參考?xì)v史文檔關(guān)于opensips 狀態(tài)代理處理的說(shuō)明。
各種SIP狀態(tài)代理比較典型的應(yīng)用場(chǎng)景對(duì)比如下:
無(wú)狀態(tài)代理 | Dialog Stateful 代理 | Transaction Stateful 代理 |
均衡負(fù)載, 轉(zhuǎn)發(fā)代理, SIP頭管理, |
呼叫計(jì)費(fèi), CDR 生成, 呼叫時(shí)代用戶狀態(tài) 支持所有transaction stateful代理的場(chǎng)景 |
調(diào)度呼叫 呼叫遇忙前轉(zhuǎn)/無(wú)應(yīng)答前轉(zhuǎn) SIP 注冊(cè) Call 分叉處理 |
通過(guò)以上定義,我們可以知道,有狀態(tài)代理通過(guò)保存的消息可以做更多業(yè)務(wù)處理,包括計(jì)費(fèi),重新發(fā)起呼叫,呼叫二次路由等功能。因?yàn)闊o(wú)狀態(tài)代理在生成SIP呼出請(qǐng)求以后,它會(huì)丟棄SIP消息,因此,其業(yè)務(wù)功能支持非常有限,在目前市場(chǎng)上幾乎看不到SIP無(wú)狀態(tài)代理應(yīng)用;谝陨险f(shuō)明,因?yàn)樗旧碓谵D(zhuǎn)發(fā)以后不會(huì)留存任何SIP請(qǐng)求,在性能支持方面,當(dāng)然無(wú)狀態(tài)代理會(huì)支持更多SIP呼叫。另外,根據(jù)RFC3261-16-1的說(shuō)明,因?yàn)橛袪顟B(tài)SIP代理服務(wù)器可以一直在保存其SIP請(qǐng)求狀態(tài)消息,如有必要,在處理SIP請(qǐng)求的過(guò)程中,任何時(shí)間,它可以從有狀態(tài)代理模式切換到無(wú)狀態(tài)代理SIP服務(wù)器狀態(tài)。與其相反的切換流程,在RFC3261并沒(méi)有說(shuō)明,讀者一定要注意。在具體應(yīng)用場(chǎng)景中,代理服務(wù)器可能會(huì)從無(wú)狀態(tài)代理切換為有狀態(tài)代理,例如在opensips的實(shí)現(xiàn)中。更多關(guān)于有狀態(tài)SIP代理服務(wù)器的深入討論,讀者可以閱讀:
- B2BUA/SBC/Proxy的SIP消息重構(gòu)和RFC7092詳解
- 關(guān)于SIP Proxy處理中的八大疑問(wèn)討論
- opensips學(xué)習(xí)筆記-關(guān)于stateless和stateful 模式討論和retransmissions演示
OpenSIPS學(xué)習(xí)筆記-ACC模塊/事務(wù)-CDR記錄以及BYE消息丟失-呼叫會(huì)話關(guān)閉時(shí)延影響計(jì)費(fèi)和配置示例
在上一個(gè)章節(jié)的討論中,我們已經(jīng)提到,兩個(gè)UA是可以直接通過(guò)IP直接呼叫而無(wú)需經(jīng)過(guò)SIP代理服務(wù)器。但是,那樣的操作在實(shí)際業(yè)務(wù)場(chǎng)景中沒(méi)有太多的意義,特別是在比較大的應(yīng)用場(chǎng)景中,用戶部署大量的SIP終端時(shí),需要各種管理機(jī)制來(lái)控制其終端以及幫助實(shí)現(xiàn)部署和高可靠性的功能。因此,SIP代理服務(wù)器是非常必要的。以下圖例說(shuō)明了SIP代理服務(wù)器借助DHCP服務(wù)器端來(lái)處理一些流程,設(shè)置自動(dòng)部署或者代理出現(xiàn)故障以后,DHCP通過(guò)Option實(shí)現(xiàn)的其他服務(wù)器注冊(cè)的流程示例。DHCP服務(wù)器可以通過(guò)DNS方式或者IP地址格式對(duì)終端發(fā)送其可選SIP代理服務(wù)器地址。
如果讀者不了解關(guān)于SIP和DHCP的配置細(xì)節(jié)的話,基于讀者查閱RFC3361學(xué)習(xí)關(guān)于SIP Option code 120的詳解說(shuō)明。如果用戶使用IPv6的話,建議用戶參考RFC3319。
3、SIP服務(wù)器拓?fù)鋵?shí)現(xiàn)模式
我們?cè)谇懊娴年P(guān)于SIP代理服務(wù)器的技術(shù)架提到了SIP代理之間的關(guān)聯(lián)關(guān)系。網(wǎng)絡(luò)上有很多關(guān)于SIP代理服務(wù)器拓?fù)涫纠瑸榱朔奖阏f(shuō)明,我們這里再次說(shuō)明關(guān)于SIP代理服務(wù)器呼叫的流程:
如果讀者想模擬整個(gè)完整SIP代理服務(wù)器呼叫的流程的話,可以參考筆者的視頻配置說(shuō)明,安裝兩個(gè)OpenSIPS代理服務(wù)器,通過(guò)UA呼叫來(lái)實(shí)現(xiàn)模擬場(chǎng)景和SIP流程抓包過(guò)程,通過(guò)OpenSIPS實(shí)現(xiàn)兩個(gè)SIP-Proxy完整呼叫測(cè)試
4、SIP服務(wù)器默認(rèn)代理模式和重轉(zhuǎn)發(fā)模式
SIP代理服務(wù)器根據(jù)呼叫要求不同,可以實(shí)現(xiàn)不同的工作模式。不同工作模式下其SIP消息處理方式也有非常大的不同,并且也影響著SIP服務(wù)器的負(fù)載和性能。具體來(lái)說(shuō),SIP代理服務(wù)器可以支持兩種工作模式,一種是默認(rèn)的代理工作模式,另外一種是轉(zhuǎn)發(fā)代理工作模式。
在以上默認(rèn)SIP代理模式下,正常UA雙方呼叫大概需要經(jīng)過(guò)九個(gè)步驟。其具體步驟已在圖例中標(biāo)識(shí)清楚,筆者在這里不再做更多文字說(shuō)明。在默認(rèn)的SIP代理模式環(huán)境中,所有的SIP消息都需要通過(guò)代理進(jìn)行處理。
在代理轉(zhuǎn)發(fā)模式的場(chǎng)景中,SIP代理服務(wù)器經(jīng)過(guò)查詢定位以后,對(duì)呼叫方返回一個(gè)contact 地址,呼叫方重新根據(jù)contact地址對(duì)呼叫目的地終端重新發(fā)起INVITE請(qǐng)求,通過(guò)雙方UA終端之間的交互,然后雙方發(fā)送媒體流數(shù)據(jù)。事實(shí)上,這種模式也是一種無(wú)狀態(tài)代理的模式。顯然,在高并發(fā)環(huán)境中,代理轉(zhuǎn)發(fā)模式下的SIP代理服務(wù)器承擔(dān)了相對(duì)比較少的處理流程,其負(fù)載也降低很多。通過(guò)SIP轉(zhuǎn)發(fā)代理模式,可以實(shí)現(xiàn)高并發(fā)呼叫中SIP的均衡負(fù)載的處理。
通過(guò)以上基于SIP轉(zhuǎn)發(fā)服務(wù)器的處理流程,讀者可以看出,在獲得用戶contact以后,轉(zhuǎn)發(fā)服務(wù)器不再介入任何的呼叫流程,兩個(gè)UA之間進(jìn)行協(xié)商處理,并且最終實(shí)現(xiàn)媒體流通信。因此,SIP 轉(zhuǎn)發(fā)服務(wù)器不會(huì)承擔(dān)太多的處理流程,也無(wú)需太多的系統(tǒng)資源。如果讀者對(duì)SIP 轉(zhuǎn)發(fā)服務(wù)器有興趣的話,可以參考RFC3261-8.3章節(jié)做進(jìn)一步了解,這里不再做太多細(xì)節(jié)說(shuō)明。
當(dāng)然,筆者介紹的兩種代理模式流程是基于一般正常呼叫設(shè)置環(huán)境,如果有其他配置不成功設(shè)置,或者終端之間協(xié)商有問(wèn)題的話,例如,編碼不支持,不支持轉(zhuǎn)發(fā)設(shè)置等,呼叫仍然需要更多流程來(lái)協(xié)助處理。
5、總結(jié)
在本章節(jié)的介紹中,筆者主要介紹了SIP代理的基本構(gòu)成,使用SIP代理服務(wù)器的原因,默認(rèn)SIP代理服務(wù)器的九大步驟,SIP轉(zhuǎn)發(fā)代理服務(wù)器的九大步驟的工作模式以及狀態(tài)代理的各種模式和應(yīng)用場(chǎng)景。在這些內(nèi)容中,筆者同時(shí)引用了歷史文檔中一些非常細(xì)節(jié)具體的配置示例來(lái)協(xié)助讀者了解SIP代理的操作流程,例如兩個(gè)OpenSIPS代理的互相呼叫的示例。
在下一個(gè)章節(jié),筆者將繼續(xù)介紹關(guān)于SIP定位服務(wù)器的知識(shí),SIP定位服務(wù)器的查詢流程以及SIP定位服務(wù)器資源支持等內(nèi)容,還有SIP UA終端配置方面的細(xì)節(jié)。
雖然筆者介紹了幾個(gè)關(guān)于SIP代理服務(wù)器的具體細(xì)節(jié),但是,因?yàn)镾IP代理服務(wù)器應(yīng)用場(chǎng)景非常靈活,為了讀者能夠完全掌握其工作場(chǎng)景,筆者仍然建議讀者自己不斷上手實(shí)踐,反復(fù)練習(xí),同時(shí)結(jié)合RFC3261的細(xì)節(jié)說(shuō)明做更深入了解。有了這些基礎(chǔ)知識(shí),讀者才能在后續(xù)的介紹中更好消化SIP技術(shù)體系的更多內(nèi)容。
參考資料:
https://datatracker.ietf.org/doc/html/rfc3840
www.asterisk.org.cn
www.dinstar.cn
https://www.rfc-editor.org/rfc/rfc3361.txt
https://www.ietf.org/rfc/rfc3319.txt