1、很多用戶可能對(duì)在線狀態(tài)功能非常迷惑,簡單來說,就是我們中看到的QQ在線不在線狀態(tài)基本一致。所以,在介紹本章節(jié)時(shí),大家可以隨時(shí)隨地結(jié)合QQ來對(duì)標(biāo)某些在線狀態(tài)功能。在線狀態(tài)中文翻譯為在線狀態(tài)或者呈現(xiàn)狀態(tài)。比較專業(yè)的說法個(gè)人認(rèn)為還是使用在線狀態(tài)比較合適,當(dāng)然有其他的的提法完全可能。顧名思義,在線狀態(tài)就是反映終端用戶當(dāng)前是否在線時(shí)的狀態(tài)情況。在討論到在線狀態(tài)時(shí),我們需要首先介紹一個(gè)名詞Presentity的概念。根據(jù)維基百科的定義,Presentity是由兩部分名稱構(gòu)成,一個(gè)是Entity, 另外一個(gè)就是Presence。這里,entity表示是實(shí)體,presence表示是一個(gè)實(shí)體和實(shí)體本身所關(guān)聯(lián)的狀態(tài)信息。這些狀態(tài)信息用來表示終端當(dāng)前狀態(tài),在線狀態(tài)可能包括是否空閑,是否有意愿和對(duì)端其他人進(jìn)行即時(shí)消息溝通。如果我們和實(shí)際工作場景結(jié)合起來,讀者就會(huì)發(fā)現(xiàn),事實(shí)上,這個(gè)在線狀態(tài)可能說明這個(gè)用戶可能正在開會(huì),可能正在忙于其他的事務(wù),也可能是吃飯時(shí)間或者其他的茶歇時(shí)間,如果對(duì)端用戶看到這個(gè)狀態(tài)時(shí),可能就不會(huì)過多打擾對(duì)方。
Presentity必須首先有一個(gè)實(shí)體,這里,我們叫presentity,還有另外一個(gè)對(duì)端用戶實(shí)體,我們稱之為watcher。它們之間的關(guān)系為訂閱者和被訂閱者關(guān)系。watcher訂閱者通過訂閱對(duì)端的在線狀態(tài)來實(shí)時(shí)獲得對(duì)端的消息,如果被訂閱者發(fā)生狀態(tài)改變,訂閱者可以獲得一個(gè)實(shí)時(shí)的回復(fù)消息,訂閱者的終端會(huì)看到對(duì)端狀態(tài),這樣可以方便進(jìn)行有效溝通。根據(jù)RFC 2778的定義,具體的實(shí)現(xiàn)方式如下:
Presentity發(fā)布自己本身的狀態(tài)信息PUBLISH,watcher發(fā)布SUBSCRIBE消息來訂閱對(duì)方的狀態(tài)。Presence Server工作方式類似于一個(gè)代理人身份,轉(zhuǎn)發(fā)更新雙方的消息。
具體的SIP訂閱實(shí)現(xiàn)流程圖如下圖所示:
2、通過SIP實(shí)現(xiàn)訂閱傳輸方式很多,但是,大部分的SIP應(yīng)用程序中使用的是XML的格式來傳遞訂閱和發(fā)布的消息內(nèi)容。這個(gè)內(nèi)容的全稱為Presence Information Data Format (PIDF)。發(fā)布的數(shù)據(jù)和訂閱數(shù)據(jù)通過PIDF+XML的格式互相發(fā)送。經(jīng)過多年的發(fā)展,PIDF文件格式支持了很多的拓展方式,它們包括:extended PIDF, xpidf+xml, rich PIDF和rpidf+xml,當(dāng)然還有微軟定義的格式。這些格式支持了更多的在線狀態(tài)的信息,使得在線狀態(tài)的支持能力得到了進(jìn)一步的提升,并且更好地支持了多種場景應(yīng)用。讓我們看看以下這個(gè)示例所表示的發(fā)布消息:
PUBLISH sip:Andrew@example.com SIP/2.0
Via: SIP/2.0/UDP pua.example.com;branch=z9hG4bK652hsge
To: <sip: Andrew@example.com>
From: <sip: Andrew@example.com>;tag=1234wxyz
Call-ID: 81818181@pua.example.com
CSeq: 1 PUBLISH
Max-Forwards: 70
Expires: 3600
Event: presence
Content-Type: application/pidf+xml
Content-Length: 241
<xml version=”1.0″ encoding=”UTF-8″>
<presence xmlns=”urn:ietf:params:xml:ns:pidf”
entity=”pres: Andrew@example.com”>
<tuple id=”efeef223″>
<status>
<basic>open</basic>
</status>
<timestamp>2014-05-01T17:00:19Z</timestamp>
</tuple>
</presence>
當(dāng)我們討論SIP訂閱時(shí),可能經(jīng)常會(huì)遇到終端聊天的功能或即時(shí)消息,語音的支持。IM(即時(shí)通訊)目前支持IM的方式包括:XMPP (Extensible Messaging and Presence Protocol)和SIMPLE (Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensions)。它們都是負(fù)責(zé)處理即時(shí)消息和在線狀態(tài)的標(biāo)準(zhǔn),XMPP在1999年由Jabber 開源社區(qū)提出,2004年由IETF修正。SIMPLE也是由IETF在2004年推出。比較有意思的是,這兩種方式幾乎在同一時(shí)間發(fā)布,實(shí)現(xiàn)的功能和幾乎完全相似。網(wǎng)絡(luò)上有很多類似的技術(shù)討論,我們這里僅簡單說明幾個(gè)比較明顯的不同,XMPP更多是一種CS架構(gòu)方式,希望通過服務(wù)器端來控制整個(gè)終端雙方的狀態(tài)信息,而SIMPLE這是繼承了SIP的基因,更傾向于使用在點(diǎn)對(duì)點(diǎn)的雙方通信方式。當(dāng)然,具體的數(shù)據(jù)結(jié)構(gòu),信令傳輸方式和認(rèn)證方式都有所不同。因?yàn),我們的重點(diǎn)不是討論IM本身,所以這里不再做過多闡述。
3、現(xiàn)在終端的千變?nèi)f化給狀態(tài)管理也帶來了很多挑戰(zhàn)。上面的介紹中,我們討論的環(huán)境中沒有涉及到終端用戶的多種狀態(tài)。事實(shí)上,一個(gè)SIP賬號(hào),用戶可能需要以多種方式注冊(cè)到企業(yè)服務(wù)器上面,例如,終端可能是SIP物理電話,可能是手機(jī)APP,可能是軟電話,同時(shí)也可能是桌面電腦的SIP軟電話等方式。這就要求服務(wù)器端支持多種狀態(tài)的在線方式處理能力。
通過下面的圖例我們可以看到,Alex目前可能使用兩個(gè)終端,兩個(gè)終端都會(huì)向在線服務(wù)器發(fā)送消息,服務(wù)器則需要根據(jù)自己的策略來打包發(fā)送或者獨(dú)立發(fā)送PIDF數(shù)據(jù)到訂閱端。
當(dāng)然,也可能通過點(diǎn)對(duì)點(diǎn)的方式訂閱和發(fā)布信息如下圖所示,點(diǎn)對(duì)點(diǎn)方式則是多方互相發(fā)送消息,無服務(wù)器轉(zhuǎn)發(fā)處理。
4、現(xiàn)在,讓我們看看在線服務(wù)器的基本工作原理。在線訂閱大致通過以下幾個(gè)步驟來獲取在線狀態(tài)消息。
訂閱流程具體經(jīng)過大概八個(gè)步驟,我們上圖已標(biāo)注,這里簡述幾個(gè)重要的步驟:
首先終端需要發(fā)送SUBSCRIBE消息,然后查詢DNS服務(wù)器找到被訂閱者服務(wù)器地址。
SIP Proxy然后通過地址URL繼續(xù)發(fā)送訂閱消息,中間可能經(jīng)過幾個(gè)轉(zhuǎn)發(fā)服務(wù)器。找到最終目的地服務(wù)器以后,查詢?cè)诰狀態(tài)服務(wù)器的數(shù)據(jù)庫,然后返回一個(gè)NOTIFY消息。
最后返回NOTIFY消息到本地的SIP Proxy,然后返回到訂閱用戶。
以上的示例中我們看到的SIP 服務(wù)器和在線狀態(tài)服務(wù)器可能是一個(gè)服務(wù)器,但是很多場景中的在線狀態(tài)服務(wù)器和SIP 服務(wù)器是互相獨(dú)立的,Ramiro Liscano 發(fā)表的論文中對(duì)SIP 服務(wù)器和在線服務(wù)器的三層結(jié)構(gòu)做了比較深入的討論,用戶可以參考,這里不再做過多解釋。
5、讓我們看看具體的數(shù)據(jù)包。PIDF主要包括幾個(gè)部分的數(shù)據(jù),包括XML 版本,Tuples,status和Medhtods。
以下示例表示了手機(jī)端Presnece中的文件格式和Tuples ID。每個(gè)Tuple 都有一個(gè)唯一的ID,所以終端可獲知不同的狀態(tài)數(shù)據(jù)。每個(gè)Tuple 處于不同的狀態(tài),如果Open,則可以進(jìn)行各種methods支持。另外,還有contact 信息,用戶可以對(duì)其發(fā)送SMS消息。
PUBLISH Method的消息內(nèi)容:
以下截圖是訂閱的消息內(nèi)容,如果用戶成功收到訂閱消息后,就從subscriber 變成了watcher狀態(tài)。
Watcher收到的NOTIFY消息:
如果雙方需要文本消息溝通,例如發(fā)送給對(duì)方文本信息時(shí),示例如下:
在文字溝通中,IM比較常見的IM功能 composing 功能。簡單來說,就是雙方在輸入文字時(shí),我們看到終端狀態(tài)的信息,例如可能形式“正在輸入"。這表示對(duì)端正在和你進(jìn)行通訊溝通。如果讀者對(duì)此功能有興趣的話,可以查閱RFC3994做進(jìn)一步了解。
即時(shí)通訊中另外一個(gè)比較有實(shí)用的功能的就是RPID(Rich Presence Extension)定義了更多的客戶端狀態(tài)類型,可以支持各種心情符號(hào)圖標(biāo)等等相關(guān)狀態(tài),這些拓展方式在RFC4480中進(jìn)行了規(guī)定,各種心情狀態(tài)支持類型如下:
6、我們?cè)谇懊娴挠懻撝袃H單純討論了簡單的企業(yè)內(nèi)網(wǎng)環(huán)境中的在線狀態(tài)。但是,在實(shí)際生產(chǎn)環(huán)境中,在線狀態(tài)服務(wù)可能會(huì)面對(duì)幾個(gè)方面的挑戰(zhàn):
內(nèi)網(wǎng)在線狀態(tài)服務(wù)器和外網(wǎng)服務(wù)器之間的互聯(lián)互通。為了安全保證,用戶可能需要TLS支持。
在線狀態(tài)管理的云部署方式可能面對(duì)很多問題,以下圖例是筆者公司使用的測試在線服務(wù)器后臺(tái)設(shè)置,在線服務(wù)器可以支持的多種設(shè)備類型和終端數(shù)量。但是因?yàn)閲鴥?nèi)防火墻的問題,和國外服務(wù)器連接時(shí)就可能出現(xiàn)問題,實(shí)際使用測試中確實(shí)也發(fā)現(xiàn)一些問題,一些功能可能被閹割。
不同終端同時(shí)登錄時(shí)的狀態(tài)響應(yīng)問題也是一個(gè)挑戰(zhàn),如果用戶使用不同的終端同時(shí)在線登錄時(shí),watcher 可能會(huì)面對(duì)狀態(tài)不一致的問題,這些問題最終取決于不同系統(tǒng)的處理方式。
連接不同在線服務(wù)器時(shí)的PIDF處理重發(fā)機(jī)制也是一個(gè)挑戰(zhàn),不同用戶終端和內(nèi)網(wǎng)用戶進(jìn)行在線服務(wù)連接時(shí),需要一個(gè)兼容性非常強(qiáng)大的PIDF網(wǎng)關(guān)服務(wù)器來進(jìn)行分發(fā)。
是否和目前主流的在線服務(wù)器兼容也是一個(gè)巨大的挑戰(zhàn),目前,SKYPE是相對(duì)比較熱門的首先在線服務(wù)器解決方案,如果需要大量用戶支持時(shí),用戶需要考慮這些市場的用戶群體,保證在線服務(wù)器可以完美兼容這些服務(wù)器接入。
壓力測試一直是衡量服務(wù)器是否穩(wěn)定的核心指標(biāo)。大家知道,如果在線服務(wù)器或者目前市場上的大部分媒體服務(wù)器支持在線功能的訂閱的話,事實(shí)上,內(nèi)網(wǎng)的數(shù)據(jù)交換量是非常驚人的,大部分用戶可能也沒有注意到這些細(xì)節(jié)。因?yàn)樵赟IP消息中,不僅僅包含SIP的本身的文本消息,而且還包含PIDF的XML消息,如果所有客戶都支持訂閱功能的話,服務(wù)器平臺(tái)可能會(huì)產(chǎn)生非常龐大的數(shù)據(jù)交互。所以,一般情況下,如果非用戶必須要求開啟訂閱的話,一般的企業(yè)IPPBX最好關(guān)閉這些應(yīng)用功能。在下面的圖例中,我們可以看到,如果真正進(jìn)行在線服務(wù)器的處理的話,大概需要經(jīng)過以下幾個(gè)步驟,其中一些流程或者參數(shù)可能影響在線服務(wù)器的性能,它們包括終端請(qǐng)求數(shù)量,privacy filter策略,composition policy, watcher filter,partial Notification, UDP/TCP/TLS 影響,DNS查詢時(shí)間,數(shù)據(jù)庫連接能力,XML解析格式等因素都會(huì)影響在線服務(wù)器的性能。具體在線服務(wù)器壓力測試的手段和方法,大家可以根據(jù)筆者的參考資料了解,了解更多的細(xì)節(jié)要素。
7、通過以上所羅列的各種環(huán)境的變量,我們可以看到,在線服務(wù)器或者企業(yè)IPPBX所支持的訂閱功能需要大量的帶寬來保證數(shù)據(jù)能夠穩(wěn)定暢通。如果網(wǎng)絡(luò)帶寬不足會(huì)導(dǎo)致很多問題,不僅僅是一個(gè)訂閱功能的問題。但是,網(wǎng)絡(luò)帶寬占用則可能和傳輸方式,訂閱,發(fā)布和提示消息的數(shù)量,不同的XML文件格式,用戶數(shù)量之間有著非常直接的關(guān)系。這里,SIMPLEstone給出了一個(gè)帶寬占用的相互關(guān)系公式,通過此關(guān)系可以計(jì)算出大概所需帶寬,用戶可以參考:
在本章節(jié)中,我們主要討論了關(guān)于Presence 在線狀態(tài)的功能的基本定義,使用場景和PIDF的數(shù)據(jù)內(nèi)容,我們還討論了各種訂閱信息的流程和在線服務(wù)器的實(shí)現(xiàn)流程,同時(shí),我們也討論了各種消息的具體內(nèi)容。在部署在線服務(wù)器時(shí),客戶可能需要面對(duì)的一些挑戰(zhàn),例如兼容性問題,網(wǎng)絡(luò)部署問題,壓力測試的影響要素等問題。最后,筆者介紹了如何計(jì)算在線服務(wù)器的帶寬的幾個(gè)依賴關(guān)系,讓用戶能夠充分了解訂閱服務(wù)具體帶寬占用情況。在線狀態(tài)功能是融合通信中一個(gè)必不可少的功能,它可以靈活支持各種終端的狀態(tài)信息,幫助客戶能夠非常迅速聯(lián)系到其他用戶。通過我們?cè)诒菊鹿?jié)的全面介紹,希望給讀者一個(gè)比較全面的分析幫助讀者全面了解這些細(xì)節(jié)。
參考資料:
https://www.packetizer.com/rfc/rfc3856/
https://msdn.microsoft.com/en-us/library/cc246201.aspx
SIMPLEstone - Benchmarking Presence Server Performance
Ramiro Liscano,Personalization for SIP Multimedia Communications with Presence
關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的行業(yè)分享。訪問5060社區(qū)-開源IPPBX論壇獲得技術(shù)幫助:www.ippbx.org.cn