摘 要: 在闡述P2P和SIP技術的基礎上,引出了一種二者融合的新技術——P2P SIP,提出了采用P2P SIP技術系統的體系結構、工作方式,并且對P2P SIP技術的安全性問題進行了分析。
關鍵詞: P2P SIP DHT
P2P(peer-to-peer)是一種“人人為我、我為人人”的開放與共享的思想, 也是一種基于對等的計算模型和基于對等的應用層重疊網絡架構。由于沒有中央服務器并且網絡是自己管理的這種特殊結構,P2P系統天生就擁有高擴展性、健壯性和高容錯性的特點。
傳統的P2P系統大致分為三種:(1)中心化P2P,索引服務放在一個中心服務器上,但是參與者之間的數據交換是對等的,例如Napster;(2)純P2P,索引服務存儲在每一個參與者上,通過發起洪泛式的請求來實現信息查詢,效率較低,例如Gnutella;(3)混合式P2P,索引服務放在一些超級節點" title="超級節點">超級節點上,通過向超級節點發起請求來實現信息查詢,例如Kazza。
為了進一步提高效率,越來越多的P2P系統采用分布式散列表(DHT)實現查詢,這類系統也稱之為結構化P2P系統。結構化P2P系統(如Chord、CAN等)把精力主要集中在優化P2P的查詢延遲以及對節點加入、離開的維護,從而代替大量發起請求這種低效率的模式。
SIP(Session Initiation Protocol)是一個類似于HTTP 和SMTP 的基于文本的信令協議, 在IP分組網絡中處理端點之間的多媒體會話呼叫的建立、控制和終結等過程, 主要被用來開發和實現VoIP、語音/視頻會議、文本聊天、即時消息、交互游戲等業務的系統和終端,尤其在VoIP 和IM系統中得到了廣泛的應用。
目前有不少研究機構已經嘗試將P2P和SIP的優勢進行互補和結合。本文提出的這種P2P SIP技術,主要采用基于DHT的P2P方法來實現SIP的注冊以及資源定位,這里的DHT采用目前比較流行的CHORD算法。
1 體系結構
1.1 節點功能
在基于SIP的通信系統中,當呼叫建立之后,兩個peer之間的媒體交流是直接進行的,所以從這個角度看似乎是P2P 構架。然而,在呼叫建立之前,用戶的注冊、定位以及呼叫路由都不能缺少服務器的參與,因此傳統的SIP系統采用的是C/S構架。而本文采用P2P SIP技術的系統不需要中心服務器,在這種系統中,peer可以直接連接到其他的peer建立通信提供服務。因此,參與的節點不僅類似于傳統的SIP客戶端滿足用戶接打電話,而且將所有的peer作為一個整體來看,它們還起到了傳統SIP網絡中注冊機和代理務器的作用,實現了資源定位、維持現有信息以及呼叫路由等功能。
如上所述,P2P SIP節點提供很多功能,超過了傳統SIP體系結構中的任何單一實體。因此,每個節點必須是整個系統中活動的一員,必須提供一些類似于SIP系統中服務器的功能,至少,用來執行附加的類似于服務器以及維持DHT行為的節點應當分布在網絡中。這樣,一個節點既扮演服務器又扮演終端,從而提供了一個可擴展和可靠的服務器群架構。然而,在實際情況中并不是所有節點的運算能力和性能都一樣。如果采用純P2P構架,每個節點都要扮演兩個角色,則所有的節點終端都需要改進以滿足要求,這樣勢必會造成資源的極大浪費。因此將節點按功能的大小分為普通節點" title="普通節點">普通節點和超級節點。
選擇一些高性能(帶寬、CPU、內存)并且可靠(在線時間、公網地址)的節點作為超級節點,這些超級節點在一起共同構成可靠的服務器群構架,通過使用DHT來定位用戶。普通節點平時連接在這些超級節點上,通過這些超級節點來實現注冊、定位。決定成為超級節點或者普通節點都在本地實現。當一個節點啟動時,它首先是普通節點,當普通節點檢測到自己有足夠的性能和可靠性,它就可以把自己變為超級節點。當存在的超級節點離開或者達到它的能力極限時,一個有高性能和可靠性的節點也可以被迫成為一個超級節點。此外,一些節點知道自己足夠強大時,會在啟動過程中就變成超級節點,同時,存在的節點也可以影響它的鄰居節點成為超級節點。
1.2 網絡結構
P2P SIP系統結構圖如圖1所示。
網絡由節點組成,這些節點在一起共同提供目錄索引服務以幫助定位資源,例如用戶等。在這里,所有的節點通過采用基于CHORD算法的DHT P2P結構來組織。CHORD是一個環形的拓撲結構,每個結點并不需要知道所有其他結點的信息,在由N個結點組成的網絡中,每個結點只需要維護其他LogN個結點的信息,查詢的算法時間是O(LogN)。
每個節點設計了一個Node-ID來決定節點在DHT環中的位置以及資源的范圍,Node-ID通過hashing節點的IP地址以及端口號來創建。相應地,每個資源也有一個Resource-ID,通過hashing資源的關鍵字來獲得。Node-ID和Resource-ID應當映射到同一數字空間。
在CHORD算法中,一個Resource-ID為k的資源將被保存到第一個" title="第一個">第一個Node-ID大于或等于k的節點上。因此,當節點進入或離開時,資源就可以保存在不同的節點上。除此之外,節點還維護著一張保存其他節點信息的Finger表,用于快速地定位某一Resource-ID的后繼節點,提高系統效率。
1.3 SIP消息
在已有標準SIP協議的基礎上,P2P SIP盡可能地保持SIP協議的原貌,因此所有需要維持DHT和定位資源的操作都是通過使用SIP消息來實現的。基本上是為了兩種目的來交換消息的。第一種目的是維持DHT,例如某些消息用來通知網絡有節點加入或者離開;第二種目的是用來完成用戶之間的通信,這種消息是大多數SIP用戶所習慣的,例如:注冊用戶、邀請其他用戶來參加會議等。當使用DHT來實現分布式注冊時,注冊和其他查詢都在DHT內來執行。一旦目標資源被找到,更深層的通信就直接在用戶代理之間進行,這一點類似于傳統的SIP通信。
傳統的SIP系統使用“注冊”消息來實現“增加、刪除、請求綁定" title="綁定">綁定”,因此,筆者選擇用“注冊”方法來維持DHT。使用SIP“注冊”消息,不僅是為了在DHT維持操作中把節點綁定為鄰居,同時也用它綁定資源到相應的節點,這些操作在傳統的SIP系統中是由SIP注冊機來實現的。
2 工作原理
2.1 節點注冊
一個節點啟動時,根據它所處的物理環境以及它要達到的不同目的,可能會出現兩種情況。第一,當節點啟動時,用戶輸入它的身份,節點通過DNS找到可能存在的SIP服務器地址,并發送SIP 注冊消息,如果注冊成功,它就可以與傳統的SIP節點進行通信。第二,一個節點啟動時,首先計算其Node-ID例如k,然后發送一個注冊消息給它找到的第一個節點(bootstrap)請求加入。這個節點(bootstrap)就會查找它所知道的Node-ID最接近k的其他節點,并且將要加入的節點重定向到該節點。要加入的節點一直重復上述操作,直到到達允許它加入的超級節點,然后這個超級節點會告知它有哪些鄰居節點以及應該負責保存哪些資源內容。節點加入到P2P SIP網絡中之后,還會與其他節點進行定期的消息交換,以了解網絡中其他節點的進出情況。
2.2 資源注冊
節點注冊時,并沒有將節點所含資源注冊到P2P SIP網絡。當一個節點加入到網絡中后,它所包含的資源會以傳統SIP系統的注冊方式一樣進行注冊,不同之處在于,傳統SIP系統是將資源保存在服務器中,而P2P SIP系統是將資源保存到相應的節點上。
2.3 呼叫建立
建立呼叫的第一步工作是找到資源所在的節點,首先將目標資源進行相應的運算以獲得Resource-ID,然后將一個注冊消息發送到最接近于Resource-ID的節點。重復上述工作,直到目標節點被找到,該節點會發送一個200 OK的連接信息或者一個404未找到的消息。一旦目標資源被找到,兩個節點上的UA就會直接進行通信,呼叫建立完畢。在呼叫建立的過程中,超級節點既可以扮演代理服務器,也可以扮演重定向器的角色。重定向是其首選方式,因為它可排除超級節點的呼叫循環情況。然而,在一些特殊情況下(比如有防火墻和NAT),代理就成為惟一選擇。
2.4 節點關閉和失效
當一個普通節點離開系統,它首先發送注銷消息到超級節點,然后超級節點就會依次告知相關節點該節點已經注銷,因此一個失效的節點不會影響系統的其他部分。在任何情況下,超級節點都可通過周期刷新檢測到失效的普通節點,它也可以通過發送選項條件消息到這些失效節點,查看它們是否還有響應。
當一個超級節點離開時,所有相關節點需要更新到這個超級節點的DHT鄰居超級節點上。如果超級節點關閉,它會平緩地發送它的節點記錄到其他P2P節點,這樣可以保障當超級節點關閉時,其他用戶可以定位到這些記錄。它會發送SIP注冊消息到DHT節點(其他的超級節點),使得這個DHT節點代替它保持這些用戶記錄。這無需通知普通節點,所屬的普通節點將會在下次注冊刷新和查詢時連接到那些保存它們記錄的超級節點。
當一個超級節點意外失敗時,它相鄰的DHT節點(超級節點)檢測到失敗并調整DHT以存儲失敗節點保留的記錄,但是相關的映射已經丟失了,除非那些原始的節點重新發起注冊刷新,注冊刷新轉到新的超級節點才可以處理相應的在DHT里的記錄。
3 安全性分析
安全是P2P系統里最需要解決的重要問題,因為整個系統里有很多潛在的不可信的節點。因此,在P2P SIP系統當中,也存在很多安全問題亟待解決。
3.1認證與授權
用戶加入P2P 架構的疊加層網絡, 尤其是通信類應用, 必須保證用戶標識的可認證性和可記憶性, 例如用戶選用號碼或郵件地址作為用戶標識來加入到網絡。在傳統的SIP網絡中,有集中的注冊服務器來對用戶進行鑒權和授權,可以確保用戶身份不被假冒, 也可以確保用戶的個性化配置和可移動性。而在P2P SIP中,如何對用戶的用戶名、鑒權密鑰和配置數據進行P2P化存儲與服務是一個問題。對于這個問題,可以考慮采用如下幾種策略來解決:端對端的數字驗證、逐跳傳輸層安全(TLS)或者端對端S/MIME。
3.2 隱私和機密
其主要工作是對發送到不可信賴節點的信息進行保護以及防止濫用信息。在P2P SIP網絡中,在用戶定位呼叫里可能包括大量的“不可信”節點,而不像在傳統的SIP電話系統" title="電話系統">電話系統里那些可信的服務器。在傳統的基于服務器的電話系統里,呼叫的雙方都對服務器是可信的,這樣就沒有安全問題。而在P2P SIP系統中,如何保護那些發送到不可信賴節點的信息是一個問題。另外,即使節點是可信的,但也無法保證呼叫的日志請求不會在以后被居心不良者濫用。
3.3 處理惡意節點
假設在P2P SIP網絡中有一些惡意的節點,它有可能把一次呼叫轉移到了一個發起方并不想去的節點。有一種解決方法就是在逐跳的路由節點上改變源頭的標示,這樣會防止負責中轉的機器知道呼叫的源頭是誰。
3.4 避免“搭便車”
還有另外一種威脅來自“搭便車”。一些節點使用P2P呼叫和收信服務,但是拒絕成為超級節點為他人服務。系統應當制定一些策略來阻止這類節點。例如,節點可以通過提供服務來獲得較高信用等級,從而獲得其他服務。每個節點都可以啟動初始信用帳戶,在NAT和防火墻后的節點,如果不能成為超級節點,則需要付出自己的信用帳戶的錢來獲得服務。那些用光了信息額度的節點、拒絕服務的節點將會降低可以獲得服務的等級,只有很少的服務可用。
除以上分析之外,利用P2P SIP技術還可以實現很多高級服務,不僅僅是基本的通話功能。例如:離線用戶的消息轉發、音頻/視頻郵件、多方參與的會議、穿越NAT和防火墻、數據存儲的網絡化等。雖然P2P SIP還處在學術研究階段,還存在各種各樣需要解決的問題,但是這種新技術的出現,為今后提供更加方便、自由的服務創造了可能,因此它的發展值得人們期待。
參考文獻
[1] MILOJICIC D, KALOGERAKI V, LUKOSE R M,et al.Peer-to-peer computing[EB/OL].http://www.hpl.hp.com/techreports/2002/HPL-2002-57R1.pdf,2002.
[2] ?ROSENBERG J, SCHULZRINNE H, CAMARILLO G,et al.SIP: session initiation protocol [EB/OL]. http://www.ietf.org/rfc/rfc3261.txt, 2002-06.
[3]?ROSENBERG J,SCHULZRINNE H. Session initiation protocol(SIP): locating SIP servers[EB/OL].http://www.ietf.org/rfc/rfc3263.txt, 2002-06.
[4] ?STOICA I, MORRIS R, KARGER D, et al. Chord: A scalable peer-to-peer lookup service for internet applications[EB/OL]. http://pdos.csail.mit.edu/papers/chord:sigcomm01/chord_sigcomm.pdf, 2001-08.
[5] ?CASTRO M, DRUSCHEL P, GANESH A, et al. Security for structured peer-to-peer overlay networks[EB/OL]. http://research.microsoft.com/~antr/PAST/security.pdf, 2002-12.
[6] ?ADAR E, HUBERMAN B A. Free riding on gnutella[EB/OL].http://www.hpl.hp.com/research/idl/papers/gnutella/gnutella.pdf, 2000-10.