深圳市國人通信有限公司 胡明春 2006/12/08
SIP協(xié)議憑借其簡單、易于擴展、便于實現(xiàn)等諸多優(yōu)點越來越得到業(yè)界的青睞,它正逐步成為NGN(下一代網(wǎng)絡)和3G多媒體子系統(tǒng)域中的重要協(xié)議,本文針對SIP服務在部署中出現(xiàn)的“單點失效”和“性能瓶頸”等問題給出了詳細的解決方案。針對SIP服務在部署中出現(xiàn)的“單點失效”和“性能瓶頸”問題,提出了基于P2P技術的SIP服務網(wǎng)絡的結構。這種結構利用現(xiàn)有SIP設施,只做部分升級就能提供非常優(yōu)越的性能。文中給出了實現(xiàn)方案并重點分析了P2P-SIP網(wǎng)絡處理注冊和呼叫的流程。并介紹了P2P技術、Chord協(xié)議和互聯(lián)網(wǎng)工程任務組IETF在P2P-SIP方面的研究進展。
SIP服務現(xiàn)狀
SIP (Session Initiation Protocol,會話初始化協(xié)議)是在Internet節(jié)點間建立多媒體會話的控制信令,由IETF制定。SIP協(xié)議簡單、可擴展性強,被很多互聯(lián)網(wǎng)電話業(yè)務采用,成為VoIP的兩大協(xié)議之一。VoIP是下一代互聯(lián)網(wǎng)(NGN)的重要組成部分,因為可以提供更豐富的業(yè)務和更低廉的通話費用,最近幾年發(fā)展迅猛。據(jù)iResearch 整理的資料顯示,2004年全球VoIP 服務市場規(guī)模已經(jīng)達到35 億美元,在未來兩年仍將呈現(xiàn)高速增長的趨勢,預計2008年市場規(guī)模將達到210 億美元。
在用戶高速增長的同時,現(xiàn)有的SIP服務器也普遍反映出一些不足:“單點失效”和“性能瓶頸”問題。SIP按域劃分用戶(比如ccw.com.cn就是一個域,而www.ccw.com.cn就是該域內(nèi)提供網(wǎng)頁瀏覽的一臺www服務器),每個域有一臺SIP服務器,用戶連上本域的服務器。如果用戶所在域的服務器宕機,用戶就不能使用SIP服務。這就是所謂的“單點失效”問題。當某個域內(nèi)的用戶數(shù)目龐大時,單臺服務器就會性能不足。如果使用多臺服務器,為維護服務器之間的一致性又會增加配置的復雜性和增大性能損耗,性能提升十分有限。這就是所謂的“性能瓶頸”問題。
Skype使用P2P(Point to Point,點對點)機制解決了這兩個問題。Skype網(wǎng)絡把節(jié)點分為超級和普通兩種。超級節(jié)點通過P2P機制互聯(lián),為普通節(jié)點提供注冊服務。當超級節(jié)點失效時,它所管理的普通節(jié)點會注冊到其他超級節(jié)點上,避免了“單點失效”。當網(wǎng)絡處理能力不夠時,部分普通節(jié)點會轉換成超級節(jié)點以增大網(wǎng)絡容量,打破了“性能瓶頸”。靠這種結構,Skype做到了全球注冊用戶超過1億,同時在線人數(shù)突破700萬。可惜Skype使用私有協(xié)議,無法接入市場上大量的VoIP設備。
Skype的成功,使得IETF開始借鑒P2P的機制來提升SIP。威廉瑪麗學院的David A. Brayn就提出了擴展SIP的Register請求,將其用做P2P的信令。P2P的優(yōu)點是沒有中心服務器,節(jié)點間分擔負載。沒有中心服務器,就不會“單點失效”;節(jié)點間分擔負載,增加節(jié)點就能迅速增大系統(tǒng)容量。而且在P2P中,增加節(jié)點的操作幾乎是“零配置”的。
P2P-SIP網(wǎng)絡的結構
在IETF的設想中,每個SIP節(jié)點同時也是P2P節(jié)點。節(jié)點間地位平等,沒有普通節(jié)點和超級節(jié)點的差別。這種設計要求現(xiàn)有SIP設備做重大改動,而且無法將SIP服務做商業(yè)化運營。而本文的設計充分考慮到SIP服務的商業(yè)化和電信級運營,不需要改動現(xiàn)有VoIP終端設備,只對現(xiàn)有SIP服務器的軟件做改動,而且改動很小。為區(qū)別于傳統(tǒng)的SIP服務器,本文把P2P化的SIP服務器叫做P2P-SIP Node,簡稱PN。具體的網(wǎng)絡結構如圖1所示。

在P2P-SIP網(wǎng)絡中,原來管理一個域的單臺服務器變成多臺PN,PN之間通過P2P機制互聯(lián),彼此分擔負載。PN可以承擔原來服務中壓力最大的部分,比如注冊、代理和計費。用戶連接到任一PN,都可以有效使用服務。部分PN下線或故障不會影響到P2P-SIP網(wǎng)絡的正常運行。要擴大P2P-SIP網(wǎng)絡的容量,加入新的PN就可以了。
PN在地理上散布各處,邏輯上根據(jù)選用的P2P機制的不同可以是環(huán)形的(Chord協(xié)議)、矩陣的(CAN協(xié)議)、網(wǎng)狀的(Pastry協(xié)議和Tapestry協(xié)議)。基本的PN至少包括注冊和代理兩種功能。為進行商業(yè)運營,可以部署全局認證服務器、全局賬務服務器和網(wǎng)管服務器等等,用于管理全部的用戶和所有的PN。
新的服務比如語音和視頻會議、語音郵箱、PSTN落地(即呼叫座機和手機)、自動和人工語音應答可以部署在PN上,也可以作為單臺服務器或服務器網(wǎng)絡的形式接入P2P-SIP網(wǎng)絡。
P2P-SIP網(wǎng)絡的實現(xiàn)
1. PN的結構
PN分為兩層。上面是SIP層,處理標準的SIP信令;下面是P2P層,使用特定的機制(本文的設計選用Chord協(xié)議)互聯(lián)各個PN的P2P層并維持它們之間的聯(lián)系。P2P層提供給SIP層的應用程序編程接口(API)只有函數(shù)find_responsible_pn(user),該函數(shù)返回負責管理該user的PN的IP地址和端口。由于P2P-SIP網(wǎng)絡是動態(tài)的,所以負責管理某個用戶的PN在不同時段可能是不同的。
首先講一講Chord基礎知識,Chord是結構化的overlay。所謂overlay,是指P2P系統(tǒng)在物理連接的基礎上構建的邏輯網(wǎng)絡。而結構化的overlay,是指在overlay中,特定的資源由特定的節(jié)點管理;當查詢該資源時,根據(jù)某種路由規(guī)則,找到管理該資源的特定節(jié)點。Chord使用SHA-1哈希算法,哈希值為m個比特。共有2m個可能值分布在圓周上,稱做Chord環(huán),如圖2所示。

圖中N表示節(jié)點,N后的數(shù)字是該節(jié)點的哈希值,一般通過哈希節(jié)點的IP地址得到。K表示資源,K后的數(shù)字是該資源的哈希值。Chord用在SIP中時,K應該是SIP URI,例如sip:humingchunno1@163.com。在Chord中,每個節(jié)點都負責管理一段哈希空間——順時針方向上之前一個節(jié)點到自己的范圍,哈希值落在該空間中的資源K的信息由本節(jié)點保存。例如節(jié)點N32就負責管理資源K24和K30的信息(圖2中指向N32的實線箭頭所示)。
當某個節(jié)點比如N8要詢問資源K30的信息時,N8首先要找到負責管理K30的節(jié)點N32。最簡單的做法是N8詢問順時針方向上自己后面的那個節(jié)點,稱做N8的successor,即N14。如果N14不負責K30,則N14詢問自己的successor,即N21。該操作反復進行,直至找到負責K30的節(jié)點N32為止。
這種查詢機制只要求節(jié)點知道順時針方向上自己后面那個節(jié)點的位置(自己的successor),查詢效率低,花費的平均時間是函數(shù)O(N/2)的值,N是Chord環(huán)的實際節(jié)點數(shù)。為提高查詢效率,Chord中每個節(jié)點除了記錄successor和predecessor(順時針方向上自己前面的那個節(jié)點)外,還要記錄m個其他節(jié)點。這m個節(jié)點由successor(n+2i-1)確定,其中n是本節(jié)點的哈希值,i是1到m間的整數(shù)。m個節(jié)點的集合就是finger表(圖2中給出N8的finger表)。這種方式下查詢資源花費的平均時間為O(logN)。
新節(jié)點,例如圖2中的N26,要加入Chord環(huán)時,先詢問自己知道的Chord中任一節(jié)點,假定為N8。N8通過查詢,發(fā)現(xiàn)N26的successor是N32,告知N26。N26得知后把successor設為N32,并通告N32自己的存在。N32得知后把predecessor設為N26,并把K24交由N26管理。N26則完成加入。
Chord中每個節(jié)點都要周期性地更新自己的successor、predecessor和finger表,以保證快速正確的查詢。理論的計算和實際的模擬顯示,Chord的容錯性很強,當網(wǎng)絡中50%的節(jié)點故障時,查詢失敗的機率也只有1.3%。
2. P2P-SIP網(wǎng)絡的形成和維護
在PN的配置文件中應該有一個配置項,其值是“IP地址:端口”或“域名:端口”的形式。存在多個值時,之間用空格分開。其值也可以為空,表示本PN是P2P-SIP網(wǎng)絡的第一個節(jié)點。值格式錯誤時,忽略該值。
PN啟動時,如果發(fā)現(xiàn)配置項的值為空,PN的Chord層就新建一個Chord環(huán)。如果配置項存在一個或多個值,Chord層就依次向這些值發(fā)請求直至收到成功應答。如果最終沒有收到成功應答,就提示錯誤或者新建一個Chord環(huán)。PN進入P2P-SIP網(wǎng)絡后,即PN的Chord層加入到Chord環(huán)中,需要從其successor處拷貝一份用戶注冊信息。
PN正常退出P2P-SIP網(wǎng)絡時,需要將自己管理的用戶注冊信息發(fā)給自己的successor。非正常退出時,P2P-SIP網(wǎng)絡會暫時丟失部分用戶的注冊信息。為保證注冊過的用戶始終可達,可以讓PN周期性地將它管理的用戶注冊信息通告自己的successor,甚至successor的successor。
P2P-SIP網(wǎng)絡的維護是PN的Chord層來做的。每個PN的Chord層都周期性地更新自己的successor、predecessor和finger表,從而及時地了解網(wǎng)絡的變化。
3. 請求處理過程
按照RFC3261的規(guī)定,SIP服務器(主要指代理服務器)處理請求時與請求的方法無關。我們將SIP服務器改造成PN時增加的步驟也應該是與方法無關的。下面我們通過詳細描述用戶的注冊和呼叫,來展示P2P-SIP網(wǎng)絡中PN處理請求的過程,并表明增加的步驟與方法無關。
用戶注冊過程
對用戶而言,注冊到P2P-SIP網(wǎng)絡的過程和注冊到SIP網(wǎng)絡的過程是相同的。只是在P2P-SIP網(wǎng)絡中,PN收到注冊請求時,并不立即記錄該條注冊信息,而是先調(diào)用函數(shù)find_responsible_pn(user)。如果返回的地址是PN自己,這才記錄下用戶注冊信息;如果返回的地址是其他PN,則PN會把注冊請求轉發(fā)給相應的PN。最終,注冊請求會被轉發(fā)到負責處理它的PN處,處理后產(chǎn)生的應答按原路返回。
考慮到減輕PN轉發(fā)請求和記錄事務狀態(tài)的負擔,PN收到不該自己負責的注冊請求時,可以返回301 Moved Permanently應答。而把調(diào)用find_responsible_pn(user)得到的地址放在應答的Contact頭域中,具體的注冊過程如圖3所示。

SIP終端可以通過多種方式獲得PN的IP地址和端口。比如用戶手動指定,或者使用終端默認的PN,或者使用終端上次進入P2P-SIP網(wǎng)絡時更新的PN列表。
Key值為69的PN收到REGISTER請求后,取得請求中To頭域里的SIP URI——表示注冊的信息屬于哪個用戶,調(diào)用find_responsible_pn(user)。返回值應該是“IP地址∶端口”字符串的形式。將返回值同本機“IP地址∶端口”作比較,如果相同,說明本機負責處理該請求,之后的處理流程遵循SIP標準;如果不同,就轉發(fā)REGISTER請求到該“IP地址∶端口”。
在本例中,SIP URI是michael@powercn.com,假定其哈希值是17,PN的Chord層會查找到負責處理該請求的PN Key值是32,find_responsible_pn(user)返回該PN的“IP地址∶端口”——192.168.13.110:5060。PN的SIP層比較該值發(fā)現(xiàn)不是自己,就將注冊請求轉發(fā)到該“IP地址∶端口”,如圖3中M2所示。
Key值為32的PN收到REGISTER請求后,取得請求中To頭域里的SIP URI(michael@powercn.com),調(diào)用find_responsible_pn(user)。返回值是192.168.13.110:5060,比較后發(fā)現(xiàn)是自己,說明自己負責管理該用戶,負責處理該用戶的注冊請求。之后的處理流程遵循SIP標準。假定注冊成功,PN返回200 OK應答。如圖3中M3所示。應答的返回遵循SIP標準,根據(jù)Via頭域按原路返回,不需要查找路徑,不會使用Chord層的操作。
Key值為69的PN收到來自192.168.13.110的應答,按照SIP標準處理,把應答發(fā)給192.168.13.63:5060。如圖3中M4所示。SIP終端收到200 OK應答,完成注冊。
用戶呼叫過程
- 第1步:主叫發(fā)起呼叫
基本的測試顯示,5臺處理能力為72萬次/小時BHCA(中文叫忙時試呼次數(shù),是電信領域用來衡量服務器處理能力的重要指標,注冊用戶數(shù)在電信領域指的就是座機的數(shù)目)的普通PC機組成P2P-SIP網(wǎng)絡后其BHCA可以達到288萬次/小時,支持的注冊用戶數(shù)達48萬。
鏈接:SIP協(xié)議介紹
會話發(fā)起協(xié)議SIP(Session Initiation Protocol)是IETF制定的多媒體通信系統(tǒng)框架協(xié)議之一,它是一個基于文本的應用層控制協(xié)議,獨立于底層協(xié)議,用于建立、修改和終止IP網(wǎng)上的雙方或多方多媒體會話。SIP協(xié)議借鑒了HTTP、SMTP等協(xié)議,支持代理、重定向、登記定位用戶等功能。支持用戶移動,與RTP/RTCP、SDP、 RTSP、DNS等協(xié)議配合。支持Voice、Video、Data、Email、Presence、IM、Chat、Game等。
正如其名字所隱含的,SIP用于發(fā)起會話,它能控制多個參與者參加的多媒體會話的建立和終結,并能動態(tài)調(diào)整和修改會話屬性,如會話帶寬要求、傳輸?shù)拿襟w類型(語音、視頻和數(shù)據(jù)等)、媒體的編解碼格式、對組播和單播的支持等。
SIP協(xié)議憑借其簡單、易于擴展、便于實現(xiàn)等諸多優(yōu)點越來越得到業(yè)界的青睞,它正逐步成為NGN(下一代網(wǎng)絡)和3G多媒體子系統(tǒng)域中的重要協(xié)議,并且市場上出現(xiàn)越來越多的支持SIP的客戶端軟件和智能多媒體終端,以及用SIP協(xié)議實現(xiàn)的服務器和軟交換設備。