摘要:針對(duì)SIP服務(wù)在部署中出現(xiàn)的“單點(diǎn)失效”、“性能瓶頸”以及P2P的標(biāo)準(zhǔn)化與互聯(lián)互通、NAT穿越、安全與授權(quán)和用戶(hù)移動(dòng)性等問(wèn)題,提出了基于P2P技術(shù)的SIP服務(wù)網(wǎng)絡(luò)的結(jié)構(gòu)。給出了實(shí)現(xiàn)方案,重點(diǎn)分析了P2P-SIP網(wǎng)絡(luò)處理注冊(cè)和呼叫的流程。
關(guān)鍵詞:SIP;P2P;Chord算法;P2P-SIP Node
引言
SIP(session Initiation Protoc01)是一個(gè)類(lèi)似于HTTP和SMTP的基于文本的信令協(xié)議,主要被用來(lái)開(kāi)發(fā)和實(shí)現(xiàn)VoIP、語(yǔ)音,視頻會(huì)議、文本聊天、即時(shí)消息、交互游戲等業(yè)務(wù)的系統(tǒng)和終端。SIP服務(wù)器在運(yùn)行的過(guò)程中也存在一些不足,最典型的是“單點(diǎn)失效”和“性能瓶頸”問(wèn)題。
P2P(peer-to-peer)是一種基于對(duì)等的計(jì)算模型和基于對(duì)等的應(yīng)用層重疊網(wǎng)絡(luò)架構(gòu)。純P2P模式的應(yīng)用系統(tǒng)只存在對(duì)等的客戶(hù)端。P2P充分利用了客戶(hù)端的內(nèi)容、計(jì)算、帶寬等資源,其擴(kuò)展性極強(qiáng)。但也存在一些缺陷:標(biāo)準(zhǔn)化與互聯(lián)互通問(wèn)題、NAT穿越問(wèn)題、安全和授權(quán)問(wèn)題和用戶(hù)移動(dòng)性問(wèn)題。
P2P和SIP在某些方面的功能是互補(bǔ)的,本項(xiàng)目用P2P(Point to Point,點(diǎn)對(duì)點(diǎn))機(jī)制解決了上述SIP的兩個(gè)問(wèn)題。本文把網(wǎng)絡(luò)節(jié)點(diǎn)分為超級(jí)和普通兩種。超級(jí)節(jié)點(diǎn)通過(guò)P2P機(jī)制互聯(lián),為普通節(jié)點(diǎn)提供注冊(cè)服務(wù)。當(dāng)超級(jí)節(jié)點(diǎn)失效時(shí),它所管理的普通節(jié)點(diǎn)會(huì)注冊(cè)到其他超級(jí)節(jié)點(diǎn)上,避免了“單點(diǎn)失效”。當(dāng)網(wǎng)絡(luò)處理能力不夠時(shí),部分普通節(jié)點(diǎn)會(huì)轉(zhuǎn)換成超級(jí)節(jié)點(diǎn)以增大網(wǎng)絡(luò)容量,打破了“性能瓶頸”。
1 基于SlP的P2P的Chord算法
Chord是結(jié)構(gòu)化的oveday。所謂overlay,是指P2P系統(tǒng)在物理連接的基礎(chǔ)上構(gòu)建的邏輯網(wǎng)絡(luò)。而結(jié)構(gòu)化的overlay,是指在overlay中,特定的資源由特定的節(jié)點(diǎn)管理;對(duì)資源的查詢(xún),就是根據(jù)某種路由規(guī)則,找到管理該資源的特定節(jié)點(diǎn)。Chord使用SHA-1哈希算法,哈希值為m個(gè)比特。2m個(gè)可能值分布在圓周上,稱(chēng)做Chord環(huán),如圖1所示。

圖1中N表示節(jié)點(diǎn),N后的數(shù)字是該節(jié)點(diǎn)的哈希值,一般通過(guò)哈希節(jié)點(diǎn)的IP地址得到。K表示資源,K后的數(shù)字是該資源的哈希值。Chord用在SIP中時(shí),K應(yīng)該是SIP URI,例如sip:baogxm@163.com。在Chord中,每個(gè)節(jié)點(diǎn)都負(fù)責(zé)管理一段哈希空問(wèn)——順時(shí)針?lè)较蛏现耙粋€(gè)節(jié)點(diǎn)到自己的范圍,哈希值落在該空間中的資源K的信息由本節(jié)點(diǎn)保存。例如節(jié)點(diǎn)N32就負(fù)責(zé)管理資源K24和K30的信息(圖1中指向N32的實(shí)線(xiàn)箭頭所示)。
比如節(jié)點(diǎn)N8要詢(xún)問(wèn)資源K30的信息時(shí),N8首先要找到負(fù)責(zé)管理K30的節(jié)點(diǎn)N32。最簡(jiǎn)單的做法是N8詢(xún)問(wèn)順時(shí)針?lè)较蚓o隨其后的節(jié)點(diǎn),叫做N8的后繼節(jié)點(diǎn)(successor),即N14。如果N14不負(fù)責(zé)K30,則N14詢(xún)問(wèn)自己的successor,即N21。該操作反復(fù)進(jìn)行,直至找到負(fù)責(zé)K30的節(jié)點(diǎn)N32為止。
2 基于Chord算法的P2P-SIP體系結(jié)構(gòu)
在IETF的設(shè)計(jì)中,每個(gè)SIP節(jié)點(diǎn)同時(shí)也是P2P節(jié)點(diǎn)。節(jié)點(diǎn)間地位平等。這種設(shè)計(jì)要求對(duì)現(xiàn)有SIP設(shè)備做重大改動(dòng),而且無(wú)法將SIP服務(wù)作商業(yè)化運(yùn)營(yíng)。本項(xiàng)目的設(shè)計(jì)充分考慮到SIP服務(wù)的商業(yè)化和電信級(jí)運(yùn)營(yíng)要求,在不改動(dòng)現(xiàn)有終端設(shè)備的情況下,只對(duì)現(xiàn)有SIP服務(wù)器的軟件做很小改動(dòng)。(為區(qū)別于傳統(tǒng)的SIP服務(wù)器,把P2P化的SIP服務(wù)器叫做P2P-SIP Node,簡(jiǎn)稱(chēng)PN。)其體系結(jié)構(gòu)如圖2所示。
在P2P-SIP網(wǎng)絡(luò)中,原來(lái)管理一個(gè)域的單臺(tái)服務(wù)器變成多臺(tái)PN,PN之間通過(guò)P2P機(jī)制互聯(lián),彼此分擔(dān)負(fù)載。PN可以承擔(dān)原來(lái)服務(wù)中壓力最大的部分,比如注冊(cè)、代理和計(jì)費(fèi)。用戶(hù)連接到任一PN,都可以有效使用服務(wù)。部分PN下線(xiàn)或故障不會(huì)影響到P2P-SIP網(wǎng)絡(luò)的正常運(yùn)行。要擴(kuò)大P2P-SIP網(wǎng)絡(luò)的容量,只需加入新的PN。PN在地理上分散到各處,邏輯上可以是環(huán)形的(chord協(xié)議)、矩陣的(cAN協(xié)議)、網(wǎng)狀的(Pastry協(xié)議和Tapestry協(xié)議)。PN分為兩層。上面是SIP層,處理標(biāo)準(zhǔn)的SIP信令;下面是P2P層,使用特定的機(jī)制(本文的設(shè)計(jì)選用Chord協(xié)議)互聯(lián)各個(gè)PN的P2P層并維持它們之間的聯(lián)系。P2P層提供給SIP層的應(yīng)用程序編程接口(API)只有函數(shù)find_responsible_pn(user)(該函數(shù)返回負(fù)責(zé)管理該user的PN的IP地址和端口)。基本的PN至少包括注冊(cè)和代理兩種功能。由于P2P-SIP網(wǎng)絡(luò)是動(dòng)態(tài)的,所以負(fù)責(zé)管理某個(gè)用戶(hù)的PN在不同時(shí)段可能是不同的。為進(jìn)行商業(yè)運(yùn)營(yíng),可以部署全局認(rèn)證服務(wù)器、全局賬務(wù)服務(wù)器和網(wǎng)管服務(wù)器等等,用于管理全部的用戶(hù)和所有的PN。其他的服務(wù)(比如語(yǔ)音和視頻會(huì)議、語(yǔ)音郵箱、PSTN落地(即呼叫座機(jī)和手機(jī))、自動(dòng)和人工語(yǔ)音應(yīng)答等)可以部署在PN上,也可以作為單臺(tái)服務(wù)器或服務(wù)器網(wǎng)絡(luò)的形式接入P2P-SIP網(wǎng)絡(luò)。
3 P2P-SlP網(wǎng)絡(luò)的實(shí)現(xiàn)
3.1 PN的工作機(jī)理
在PN的配置文件中設(shè)有一個(gè)配置項(xiàng),其值是“IP地址:端口”或“域名:端口”的形式。若存在多個(gè)值時(shí),以空格分開(kāi)。其值也可以為空(表示本PN是P2P-SIP網(wǎng)絡(luò)的第一個(gè)節(jié)點(diǎn))。值格式錯(cuò)誤時(shí),忽略該值。
PN啟動(dòng)時(shí),如果發(fā)現(xiàn)配置項(xiàng)的值為空,PN的Chord層就新建一個(gè)Chord環(huán)。如果配置項(xiàng)存在一個(gè)或多個(gè)值,Chord層就依次向這些值發(fā)送請(qǐng)求直至收到成功應(yīng)答。如果最終沒(méi)有收到成功應(yīng)答,就提示錯(cuò)誤或者新建一個(gè)Chord環(huán)。PN進(jìn)入P2P-SIP網(wǎng)絡(luò)后,即PN的Chord層加入到Chord環(huán)中,需要從其successor處拷貝一份用戶(hù)注冊(cè)信息。
PN正常退出P2P-SIP網(wǎng)絡(luò)時(shí),需要將自己管理的用戶(hù)注冊(cè)信息發(fā)給自己的successor。非正常退出時(shí),P2P-SIP網(wǎng)絡(luò)會(huì)暫時(shí)丟失部分用戶(hù)的注冊(cè)信息。為保證注冊(cè)過(guò)的用戶(hù)始終可達(dá),可以讓PN周期性地將它管理的用戶(hù)注冊(cè)信息通告自己的successor,甚至successor的successor。
P2P-S1P網(wǎng)絡(luò)的維護(hù)是PN的Chord層來(lái)做的。每個(gè)PN的Chord層都周期性地更新自己的successor.predecessor和finger表,從而及時(shí)地了解網(wǎng)絡(luò)的變化。
3.2請(qǐng)求處理過(guò)程
按照RFC3261的規(guī)定,SIP服務(wù)器(主要指代理服務(wù)器)處理請(qǐng)求時(shí)與請(qǐng)求的方法無(wú)關(guān)。下面我們通過(guò)詳細(xì)描述用戶(hù)的注冊(cè)和呼叫過(guò)程,來(lái)說(shuō)明P2P-SIP網(wǎng)絡(luò)中PN處理請(qǐng)求的實(shí)現(xiàn)方法。
3.2.1用戶(hù)注冊(cè)過(guò)程
對(duì)用戶(hù)而言,注冊(cè)到P2P-SIP網(wǎng)絡(luò)的過(guò)程和注冊(cè)到SIP網(wǎng)絡(luò)的過(guò)程是相同的。只是在P2P-SIP網(wǎng)絡(luò)中,PN收到注冊(cè)請(qǐng)求時(shí),并不立即記錄該條注冊(cè)信息,而是先調(diào)用函數(shù)find_responsible_pn(user)。如果返回的地址是PN自己,這才記錄下用戶(hù)注冊(cè)信息;如果返回的地址是其他PN,則PN會(huì)把注冊(cè)請(qǐng)求轉(zhuǎn)發(fā)給相應(yīng)的PN。最終,注冊(cè)請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到負(fù)責(zé)處理它的PN處,處理后產(chǎn)生的應(yīng)答按原路返回。其步驟如下:
(1)終端發(fā)注冊(cè)請(qǐng)求
IP地址為210.41.35.199的SIP終端準(zhǔn)備好REGISTER請(qǐng)求,發(fā)給P2P-SIP網(wǎng)絡(luò)中任一PN(假設(shè)Key為69的PN。)。如圖3中M1所示。SIP終端可以通過(guò)多種方式獲得PN的IP地址和端口。比如用戶(hù)手動(dòng)指定,或者使用終端默認(rèn)的PN,或者使用終端上次進(jìn)入P2P-SIP網(wǎng)絡(luò)時(shí)更新的PN列表。
(2)PN轉(zhuǎn)發(fā)請(qǐng)求
Key值為69的PN收到REGISTER請(qǐng)求后,取得請(qǐng)求中To頭域里的SIP URI——表示注冊(cè)的信息屬于哪個(gè)用戶(hù),調(diào)用find_responsible_pn(user)。返回值應(yīng)該是“IP地址:端口”字符串。將返回值同本機(jī)“IP地址:端口”作比較,如果相同,則本機(jī)負(fù)責(zé)處理該請(qǐng)求,之后的處理流程遵循SIP標(biāo)準(zhǔn);如果不同,就轉(zhuǎn)發(fā)REGISTER請(qǐng)求到該“IP地址:端口”。 在本例中,SIP URI對(duì)應(yīng)的哈希值假定是17,PN的Chord層會(huì)查找到負(fù)責(zé)處理該請(qǐng)求的PN Key值是32,find_responsible_pn(user)返回該P(yáng)N的“ip地址:端口”——210.41.35.200:5060。PN的SIP層判斷該值發(fā)現(xiàn)不是自己,就將注冊(cè)請(qǐng)求轉(zhuǎn)發(fā)到該“ip地址:端口”,如圖3中M2所示。

(3)PN接受注冊(cè),返回應(yīng)答
Key值為32的PN收到REGISTER請(qǐng)求后,取得請(qǐng)求中To頭域里的SIP URI,調(diào)用find_responsible_pn(user)。返回值是210.41.35.200:5060,比較后發(fā)現(xiàn)是自己,說(shuō)明自己負(fù)責(zé)管理該用戶(hù),負(fù)責(zé)處理該用戶(hù)的注冊(cè)請(qǐng)求。之后的處理流程遵循SIP標(biāo)準(zhǔn)。假定注冊(cè)成功,PN返回200 OK應(yīng)答。如圖3中M3所示。應(yīng)答的返回遵循SIP標(biāo)準(zhǔn),根據(jù)Via頭域按原路返回,不需要查找路徑,不會(huì)使用Chord層的操作。
(4)SIP終端收到應(yīng)答,完成注冊(cè)
Key值為69的PN收到來(lái)自210.41.35.200:5060的應(yīng)答,按照SIP標(biāo)準(zhǔn)處理,把應(yīng)答發(fā)給192.168.13.63:5060。如圖3中M4所示。SIP終端收到200 OK應(yīng)答,完成注冊(cè)。
3.2.2用戶(hù)呼叫過(guò)程
在p2P-SIpt網(wǎng)絡(luò)中,PN收到INVITE請(qǐng)求,進(jìn)行必要處理后,取出請(qǐng)求中To頭域里的SIP URI(表示呼叫哪個(gè)用戶(hù)),調(diào)用find_responsible_pn(user)。如果返回值是PN自己,說(shuō)明PN負(fù)責(zé)管理To頭域所標(biāo)識(shí)的用戶(hù),PN具有該用戶(hù)的注冊(cè)信息,之后的處理按SIP標(biāo)準(zhǔn)流程;如果不是,則PN將INVITE請(qǐng)求轉(zhuǎn)發(fā)給find_responsible_pn(user)返回的“IP地址:端口”。具體的呼叫過(guò)程如圖4所示。

(1)IP發(fā)起呼叫
IP地址為210.41.35.199的用戶(hù)要呼叫用戶(hù)。userA可以把請(qǐng)求發(fā)給P2P-SIP網(wǎng)絡(luò)中任一PN。考慮到要在P2P-SIP網(wǎng)絡(luò)上提供增值業(yè)務(wù)(比如計(jì)費(fèi)),userA把INVITE請(qǐng)求發(fā)給管理它的PN更合適一點(diǎn)。在本例中是IP為210.41.35.195,Key值為0的PN。如圖4中M1所示。
(2)PN轉(zhuǎn)發(fā)請(qǐng)求到PN
Key值為0的PN收到INVITE請(qǐng)求后,取得請(qǐng)求中To頭域里的SIP URI,調(diào)用find_responsible_pn(user)。返回值是210.41.35.200:5060。比較后發(fā)現(xiàn)不是自己,將請(qǐng)求轉(zhuǎn)發(fā)給210.41.35.200:5060。如圖4中M2所示。
(3)PN轉(zhuǎn)發(fā)請(qǐng)求到被叫
IP地址為210.41.35.200的PN收到該請(qǐng)求,進(jìn)行相同的處理。發(fā)現(xiàn)返回值是自己,說(shuō)明PN管理該用戶(hù),擁有該用戶(hù)的注冊(cè)請(qǐng)求。之后的處理流程遵循SIP標(biāo)準(zhǔn),即在本地取得用戶(hù)userB的當(dāng)前地址,然后轉(zhuǎn)發(fā)請(qǐng)求到該地址。如圖4中M3所示。
(4)被叫接受呼叫,返回應(yīng)答
用戶(hù)userB所在的SIP終端收到該請(qǐng)求,按照SIP標(biāo)準(zhǔn)進(jìn)行處理。假定userB接受呼叫請(qǐng)求,則返回200 OK應(yīng)答。如圖4中M4所示。
(5)應(yīng)答沿原路返回
應(yīng)答的返回遵循SIP標(biāo)準(zhǔn),根據(jù)Via頭域按原路返回,不需要查找路徑,不會(huì)使用Chord層的操作。如圖4中M5、M6所示。
(6)主叫收到應(yīng)答,發(fā)出確認(rèn),建立呼叫
用戶(hù)userA所在的SIP終端收到200 OK應(yīng)答,用ACK請(qǐng)求進(jìn)行確認(rèn)。ACK請(qǐng)求不經(jīng)過(guò)P2P-SIP網(wǎng)絡(luò),直接發(fā)給用戶(hù)userB所在的SIP終端。如圖4中M7所示。用戶(hù)userB所在的SIP終端收到ACK確認(rèn)請(qǐng)求,呼叫建立。結(jié)束通話(huà)時(shí),userB和userA直接交換SIP信令,不經(jīng)過(guò)P2P-SIP網(wǎng)絡(luò)。
4 結(jié)束語(yǔ)
本文通過(guò)對(duì)原有的SIP軟交換平臺(tái)的改造,在PN上實(shí)現(xiàn)了注冊(cè)、呼叫和計(jì)費(fèi)功能;同時(shí)也提供了具有語(yǔ)音郵箱和自動(dòng)應(yīng)答功能的單臺(tái)媒體服務(wù)器接入P2P-SIP網(wǎng)絡(luò)的實(shí)現(xiàn)技術(shù)。