天天看點

ppPhone—基于Kademlia協定的P2P VoIP系統設計與實作

dolf cao([email protected])

摘 要

點對點(P2P)技術和基于IP的 語音VoIP(Voice Over IP)技術是目前Internet應用技術研究的兩個熱點,将二者相結合的P2P VoIP技術已經成為VoIP技術發展的一個趨勢。本文從分析傳統VoIP系統的不足入手,讨論了未來VoIP系統的發展趨勢,提出了一種基于

Kademlia

協定的純P2P的P2P VoIP架構,并在此基礎上

實作

了一個P2P VoIP系統——ppPhone。

關鍵詞: Kademlia

;DHT;P2P VoIP;G.729;對等網;分布式哈希表

ppPhone—A

Kademlia

Based P2P VoIP System Design And Implementation

dolf cao([email protected])

Abstract

Peer-to-Peer and Voice Over IP are the research hotspot in current Internet application technology. P2P VoIP Technology that combine the P2P and VoIP is a trend of VoIP development. This paper analysis the shortage of current P2P VoIP systems at first, then discuss the development trend of future VoIP system, and based on previous analysis, we put forward a

kademlia

protocol based pure P2P VoIP architecture, then we implement our

kademlia

based P2P VoIP system—ppPhone.

Key words Kademlia

;DHT;P2P VoIP;G.729

點 對點P2P(peer to peer)技術和基于IP的語音VoIP(Voice Over IP) 技術是目前網際網路應用技術研究的兩個熱點。最近幾年發展起來的P2PVoIP系統更是這兩種技術融合後的一個重要發展方向。它通過利用P2P技術的高擴充 性和健壯性的特點,給傳統VoIP産業帶來了更高效的溝通模式。P2P VoIP系統是指将P2P技術與VoIP技術相結合,P2P技術用于資源的查找定位及共享,來共同完成語音通信過程的系統。

目前,以 Skype為代表的P2P VoIP系統發展迅速,已經成為人們日常生活中不可或缺的一種重要的聯系手段。另外,諸如HeadCall, Gizmo, WengoPhone等P2P VoIP系統也擁有廣大的使用者群。相對于傳統的C/S模式的VoIP系統,P2P VoIP系統具有穩定性好、部署簡單及易用性好等優點;就目前的發展趨勢來說,傳統VoIP系統正逐漸的向基于P2P技術的方向發展。

但是 由于目前的P2P VoIP系統多為商用系統,其核心技術是私有的,沒有公開,而且多為國外系統,并且目前的P2P VoIP系統還有許多問題需要解決,是以有必要研究P2P VoIP系統,尤其是考慮到軍隊等國家重要部門的特殊性,更有必要研究自己的P2P VoIP系統。

Kademlia

協定是一個廣泛應用的基于分布式哈希表(DHT)的P2P協定,目前的許多P2P檔案共享軟體如Emule,BitTorrent,BitSprit,BitComet等都使用Kadmelia協定來

實作

底層的網絡拓撲。協定的廣泛應用證明,

Kademlia

協定是一個簡單高效的P2P協定。

目前較成熟的适用于VoIP系統的P2P協定主要有Chord,Pastry,Tapestry,CAN和

Kademlia

。相比較于另外四種協定,

Kademlia

協定具有

實作

簡單、查找效率高、資源定位準确以及更加成熟等優點,是以我們選用

Kademlia

協定作為底層協定來

實作

P2P VoIP系統——ppPhone。

P2P技術按照節點資訊存儲與搜尋方式的不同,主要分為非結構化和結構化的P2P。

非 結構化P2P系統中,每個節點存儲自身的資訊或資訊的索引(如指針和IP位址)。當使用者需要在P2P系統中擷取資訊時,他們預先并不知道這些資訊(如某個 檔案)會在那個節點上存儲。是以,在非結構化P2P系統中,資訊搜尋的算法難免帶有一定的盲目性,例如最簡單的泛洪式查找(類似于廣播)和擴充環查找(從 最近的n個節點開始,層層轉發直到找到目标或超出了跳數的上限為止)。典型的非結構化P2P系統主要有:Gnutella,Napster等。非結構化系 統的優點在于

實作

結構簡單:無須中央伺服器,節點之間完全平等,網絡的層次是單一的,而且節點之間無需維護拓撲資訊。

結 構化P2P系統中,每個節點隻存儲特定的資訊或特定資訊的索引。當使用者需要在P2P系統中擷取資訊時,他們必須知道這些資訊(或索引)可能存在于那些節點 中。由于使用者預先知道應該搜尋哪些節點,避免了非結構化P2P系統中使用的泛洪式查找,是以提高了資訊搜尋的效率。但是,結構化P2P也引入了新的問題:

首先,既然資訊是分布存儲的,那麼如何将資訊分布存儲在重疊網中的節點上。

其次,由于節點動态的加入和離開重疊網,如何将拓撲的變更資訊通知其它節點。

DHT(分 布式哈希表)的引入基本解決了上述問題,是以自從DHT協定出現以後,結構化P2P的應用得到了快速的發展。目前已經有很多較為成熟的DHT協定被提出并 且得到了應用。其中比較有代表性的有:緩沖陣列路由協定(CARP);一緻性哈希;Chord;内容尋址網絡(CAN);Pastry;

Kademlia

;P-Grid。

2.1 DHT

DHT(Distributed Hash Table),分布式哈希表技術使用分布式雜湊演算法來解決結構化的分布式存儲問題。分布式雜湊演算法的核心思想是通過将存儲對象的特征(關鍵字)經過哈希運 算,得到鍵值(Hash Key),對象的分布存儲依據鍵值來進行。在不需要伺服器的情況下,每個用戶端負責一個小範圍的路由,并負責存儲一小部分資料,進而

實作

整個DHT網絡的尋址和存儲。

DHT能夠容納數量巨大的節點數目,并且能不斷處理新加入的節點,同時能夠妥善地處理節點離開,具有很好的容錯性。

将DHT作為應用層拓撲,可以建構更加複雜的應用,例如分布式檔案系統,點對點檔案共享,内容分發系統,協同web緩存,應用層多點傳播,分布式域名解析以及即時消息服務。

2.2 Kademlia 協定

Kademlia

協定是美國紐約大學的PetarP. Maymounkov和David Mazieres在2002年釋出的一項研究結果《

Kademlia

: A peerto -peer information system based on the XOR metric》。

Kademlia

通過獨特的以異或算法(XOR)為距離度量基礎,建立了一種全新的DHT 拓撲結構,能夠以比較快的速度執行路由查詢。

Kademlia

協定的每個節點保持一個哈希值、關鍵字對,并且将這個對儲存在DHT中若幹距節點邏輯距離在一定範圍内的最“近”的節點上。

異或運算提供了一種在Kad網絡上進行可靠距離度量的方法。由于異或運算的非負性、對稱性、單向性、傳遞性以及三角不等性,進而能夠保證距離與節點的一一對應的特性。

Kademlia

協定

實作

了K-Bucket來

實作

節 點查詢。K-Bucket中儲存以使用者ID哈希值、對方IP位址和對方UDP端口這樣的資料結構為單元的清單,清單首部儲存最近最少通路的節點,尾部是最 近最多通路的節點。當DHT接收到新節點加入請求時,如果此時K-Bucket沒有滿,那麼就把新節點加入尾部;如果此時K-Bucket已經滿了,就先 對首部的節點發送消息,手部節點有響應的話那麼忽略新節點加入請求,同時把首部有回報的節點移動到尾部,如果首部節點沒有回報,則删除就删除尾部節點,加 入新節點。這種新節點加入的處理方式能夠很好的解決拒絕服務攻擊,即使有很多節點同時到達要求加入網絡,K-Bucket用自己的更新機制處理節點加入請 求,而不會過載,進而避免了拒絕服務攻擊的影響。

Kademlia

協定定義了四種遠端RPC 操作:PING、STORE、FIND_NODE、FIND_VALUE。

PING 操作的作用是探測一個節點,用以判斷其是否仍然線上。

STORE 操作的作用是通知一個節點存儲一個<key , value>對。

FIND_NODE 操作使用一個160bit 的ID 作為參數。本操作的接受者傳回它所知道的更接近目标ID 的K 個節點的(IP address ,UDP port , Node ID)資訊。

FIND_VALUE 操作和FIND_NODE 操作類似,不同的是它隻需要傳回一個節點的( IP address , UDP port , Node ID)資訊。如果本操作的接受者收到同一個key 的STORE 操作,則會直接傳回存儲的value 值。

采用

Kademlia

協定

實作

P2P VoIP系統是一個嘗試,因為現在比較成型的P2P VoIP系統如Skype等P2P協定是私有的,而且下一小節将會介紹到

Kademlia

協定目前的應用,證明

Kademlia

協定是一個成熟的協定,用于P2P VoIP系統能避免許多不成熟的協定可能遇到的問題。

2.3 Kademlia 協定應用

Kademlia

協定應用範圍較廣,主要是P2P檔案共享程式底層使用

Kademlia

協定來搭建Overlay,

實作

資源的存儲、搜尋和定位。

采用

Kademlia

協定

實作

的P2P檔案共享程式主要有Emule,BitTorrent,BitSiprit,BitComet等。經過實踐證明

Kademlia

協定是簡單可靠的。目前Internet上大約有一半的網絡流量為P2P流量,其中大部分為P2P檔案共享程式産生的流量,而目前Emule,BitTorrent,BitSprit,BitComet都是很流行的P2P檔案共享軟體,是以可以不誇張地說,采用

Kademlia

協定的網絡産生的流量占了很大一塊Internet的流量。

3.1 ppPhone功能需求

ppPhone作為一個VoIP系統,應能

實作

以下功能:

l 新使用者注冊:系統注冊新使用者以及新使用者加入網絡;

l 使用者退出:使用者退出網絡;

l 使用者釋出:在使用者注冊了一個使用者名之後,将使用者名及使用者相關資訊(IP位址及端口)釋出到DHT中邏輯距離相近的節點上。

l 使用者檢索:給定一個使用者名,将使用者名哈希後,在DHT中查找到使用者相關資訊(IP位址及端口),并且将使用者相關資訊(IP位址及端口)傳回。

l 語音通信:根據查找得到的使用者相關資訊(IP位址及端口),建立起語音通信信道,并且

實作

語音呼叫信令及語音編解碼(采用G.729)。

l NAT及防火牆穿越:當使用者處于内網或者防火牆之後時,提供一種使用者穿越NAT和防火牆的方法。

l 與傳統電話網及行動電話網互聯互通:通過公共交換電信網(PSTN)與傳統電信網

實作

互聯,進而使得使用者可以呼叫傳統電話以及行動電話。

3.2 系統設計

系統主要概念和術語定義如下:

l 使用者:ppPhone的終端實體,擁有唯一使用者名、密碼、姓名、年齡、性别、好友清單等屬性。

l 結點:使用者的載體,是連接配接到P2P網絡的個人PC。

l 引導結點:一個P2P網絡結點,為要加入P2P網絡的結點提供一些聯系人組成它的路由表。

l 注冊伺服器:為使用者提供注冊和認證功能,存儲使用者的使用者名、密碼、好友清單等資訊,使用者登入時對使用者進行身份認證。注冊伺服器還保證使用者名的全球唯一性。

l PSTN伺服器:提供ppPhone網絡節點與傳統電話網及行動電話網通信的接口。

3.2.1 系統體系結構

在 ppPhone中,所有的節點共同組成Overlay,注冊(認證)伺服器主要用于新使用者的注冊以及使用者登入時的驗證。使用者通過PSTN伺服器與傳統電話 網及行動電話網進行通信。ppPhone的體系結構不同于Skype,ppPhone中并沒有超級節點(Super Node),所有的節點是完全對等的,

實作

完全相同的功能。是以ppPhone是一個純P2P的VoIP系統。ppPhone系統體系結構如圖1所示。

圖1 ppPhone系統體系結構

3.2.2 系統子產品設計
ppPhone系統主要包括使用者界面、DHT子產品、語音通信子產品、注冊伺服器以及Bootstrap伺服器共5個子產品。系統子產品與功能設計如圖2所示。

圖2 ppPhone系統子產品圖

基于上述設計,我們

實作

了ppPhone的原型系統,其中與傳統電話網及行動電話網互聯的部分由于條件限制還未能

實作

,其餘各個功能均

實作

,系統運作良好,使用者定位準确及時,語音通信品質較好。

4.1 系統平台

ppPhone在Windows XP上使用Visual Studio 2005開發,程式設計語言為C++,P2P子產品基于

Kademlia

協定

實作

,語音編解碼使用G.729的Codec,通信信令為自定義的信令。

4.2 系統具體 實作

ppPhone流程主要有注冊/認證、加入Kad網、釋出使用者ID、查找使用者ID,呼叫的建立和釋放、語音傳輸等。系統流程如圖3所示。

圖3 ppPhone系統流程圖

使用者在第一次啟動時需到注冊伺服器注冊,注冊自己的使用者名ID,密碼等資訊;若已注冊,直接登入,到注冊伺服器進行身份認證。使用者用戶端注冊/認證完畢後就可以加入Kad網,首先設定本地TCP、UDP端口,設定引導結點IP位址、端口号,然後就可以調用

Kademlia

協 議子產品加入DHT網絡。使用者節點在加入DHT網絡時向整個網絡釋出使用者ID,首先哈希使用者ID,然後進行異或運算搜尋與使用者ID邏輯距離最近的一些結點, 把使用者ID,及所在的結點IP位址等資訊存儲到上面。為了保證這些結點的存活性和适應不斷變化的網絡拓撲結構,使用者節點需要周期性的重新整理釋出資訊。當使用者 節點試圖呼叫某個使用者時,需要在DHT網絡上搜尋該使用者ID,找到該使用者ID的釋出資訊,進而得到該使用者ID所在結點的IP位址及端口号,即可建立語音通 信信道。一旦使用者查找到要呼叫的終端IP位址,就可以根據特定的信令協定向其發出呼叫請求,并随時可以終止呼叫。當呼叫建立後,語音資料就可以在兩個終端 間傳送。

ppPhone系統主要有3個線程,其中一個DHT網絡控制線程,一個DHT網絡資訊更新線程以及一個語音通信線程。網絡底層通信 鍊路Berkeley套接字。DHT網絡控制線程初始化時,首先在端口20028開一個Listen Socket,不斷偵聽,在接受到DHT網絡的資料包時進行處理;隻要系統繼續運作,此線程即一直在運作,不會退出。DHT網絡資訊更新線程是一個定時 器,主要用于确認節點是否線上,此線程會周期性的向K-Bucket中的節點發送PING消息,沒有響應的節點會被認為已經失效,進而保證K- Bucket中節點的有效性,當使用者因為意外原因離開網絡後,此線程也能及時發現。語音通信線程主要用于信令的傳輸以及語音資料的發送和接收。

本文闡述了一個基于

Kademlia

協定的P2P VoIP系統的

實作

過程,初步

實作

了 VoIP系統的功能;使用P2P來完成使用者的查找與定位,能夠有效的避免集中式伺服器諸如單點故障等問題,并且能夠以較好的速度來完成使用者的查找和定位。 相比較于傳統的VoIP系統,P2P VoIP系統不需要配置即零配置、營運成本低、系統可靠性高,但是又有不便于管理等特點。在營運成本受限或者部署較大規模的VoIP系統時,P2P VoIP系統是一個很好的選擇。

【1】

Kademlia

: A Peer-to-peer Information System Based on the XOR Metric. PetarP. Maymounkov, David Mazieres.

【2】 開源P2P檔案共享項目BitTorrent http://www.bittorrent.com/

【3】 開源P2P檔案共享項目 Emule http://www.emule-project.net/

【4】 開源P2P檔案共享項目 BitSpirit http://www.bitspirit.com.cn/

【5】 開源P2P檔案共享項目 BitComet http://www.bitcomet.com/

【6】 基于混合結構P2P技術的IP電話軟體原型與

實作

汪亮宇碩士論文 北京航空航天大學

【7】 Skype http://www.skype.com/

【8】 采用G.729的語言實時通信DLL(含測試源代碼)

http://www.newasp.net/code/vc/2407.html

【9】 NetTalk http://nettalk.nwtbb.com/

【10】 Emule中

Kademlia

網絡深入解析

http://dolfcao.spaces.live.com/

【11】 ppPhone系統

實作

http://sourceforge.net/projects/ppphone