您的位置:首页 > 理论基础 > 计算机网络

ppPhone—基于Kademlia协议的P2P VoIP系统设计与实现

2008-10-16 17:09 1091 查看
dolf cao(dolf.cao@gmail.com)
摘 要点对点(P2P)技术和基于IP的
语音VoIP(Voice Over IP)技术是当前Internet应用技术研究的两个热点,将二者相结合的P2P
VoIP技术已经成为VoIP技术发展的一个趋势。本文从分析传统VoIP系统的不足入手,讨论了未来VoIP系统的发展趋势,提出了一种基于Kademlia[/b]协议的纯P2P的P2P VoIP架构,并在此基础上实现[/b]了一个P2P VoIP系统——ppPhone。
关键词:Kademlia[/b];DHT;P2P VoIP;G.729;对等网;分布式哈希表
ppPhone—A Kademlia[/b] Based P2P VoIP System Design And Implementation
dolf cao(dolf.cao@gmail.com)
AbstractPeer-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[/b] protocol based pure P2P VoIP architecture, then we implement our kademlia[/b] based P2P VoIP system—ppPhone.
Key wordsKademlia[/b];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[/b]协议是一个广泛应用的基于分布式哈希表(DHT)的P2P协议,当前的许多P2P文件共享软件如Emule,BitTorrent,BitSprit,BitComet等都使用Kadmelia协议来实现[/b]底层的网络拓扑。协议的广泛应用证明,Kademlia[/b]协议是一个简单高效的P2P协议。
目前较成熟的适用于VoIP系统的P2P协议主要有Chord,Pastry,Tapestry,CAN和Kademlia[/b]。相比较于另外四种协议,Kademlia[/b]协议具有实现[/b]简单、查找效率高、资源定位准确以及更加成熟等优点,因此我们选用Kademlia[/b]协议作为底层协议来实现[/b]P2P VoIP系统——ppPhone。
P2P技术按照节点信息存储与搜索方式的不同,主要分为非结构化和结构化的P2P。

结构化P2P系统中,每个节点存储自身的信息或信息的索引(如指针和IP地址)。当用户需要在P2P系统中获取信息时,他们预先并不知道这些信息(如某个
文件)会在那个节点上存储。因此,在非结构化P2P系统中,信息搜索的算法难免带有一定的盲目性,例如最简单的泛洪式查找(类似于广播)和扩展环查找(从
最近的n个节点开始,层层转发直到找到目标或超出了跳数的上限为止)。典型的非结构化P2P系统主要有:Gnutella,Napster等。非结构化系
统的优点在于实现[/b]结构简单:无须中央服务器,节点之间完全平等,网络的层次是单一的,而且节点之间无需维护拓扑信息。

构化P2P系统中,每个节点只存储特定的信息或特定信息的索引。当用户需要在P2P系统中获取信息时,他们必须知道这些信息(或索引)可能存在于那些节点
中。由于用户预先知道应该搜索哪些节点,避免了非结构化P2P系统中使用的泛洪式查找,因此提高了信息搜索的效率。但是,结构化P2P也引入了新的问题:
首先,既然信息是分布存储的,那么如何将信息分布存储在重叠网中的节点上。
其次,由于节点动态的加入和离开重叠网,如何将拓扑的变更信息通知其它节点。
DHT(分
布式哈希表)的引入基本解决了上述问题,因此自从DHT协议出现以后,结构化P2P的应用得到了快速的发展。目前已经有很多较为成熟的DHT协议被提出并
且得到了应用。其中比较有代表性的有:缓冲阵列路由协议(CARP);一致性哈希;Chord;内容寻址网络(CAN);Pastry;Kademlia[/b];P-Grid。

2.1 DHT

DHT(Distributed
Hash
Table),分布式哈希表技术使用分布式哈希算法来解决结构化的分布式存储问题。分布式哈希算法的核心思想是通过将存储对象的特征(关键字)经过哈希运
算,得到键值(Hash
Key),对象的分布存储依据键值来进行。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现[/b]整个DHT网络的寻址和存储。
DHT能够容纳数量巨大的节点数目,并且能不断处理新加入的节点,同时能够妥善地处理节点离开,具有很好的容错性。
将DHT作为应用层拓扑,可以构建更加复杂的应用,例如分布式文件系统,点对点文件共享,内容分发系统,协同web缓存,应用层组播,分布式域名解析以及即时消息服务。

2.2 Kademlia[/b]协议

Kademlia[/b]协议是美国纽约大学的PetarP. Maymounkov和David Mazieres在2002年发布的一项研究结果《Kademlia[/b]: A peerto -peer information system based on the XOR metric》。Kademlia[/b]通过独特的以异或算法(XOR)为距离度量基础,建立了一种全新的DHT 拓扑结构,能够以比较快的速度执行路由查询。
Kademlia[/b]协议的每个节点保持一个哈希值、关键字对,并且将这个对保存在DHT中若干距节点逻辑距离在一定范围内的最“近”的节点上。
异或运算提供了一种在Kad网络上进行可靠距离度量的方法。由于异或运算的非负性、对称性、单向性、传递性以及三角不等性,从而能够保证距离与节点的一一对应的特性。
Kademlia[/b]协议实现[/b]了K-Bucket来实现[/b]节
点查询。K-Bucket中保存以用户ID哈希值、对方IP地址和对方UDP端口这样的数据结构为单元的列表,列表首部保存最近最少访问的节点,尾部是最
近最多访问的节点。当DHT接收到新节点加入请求时,如果此时K-Bucket没有满,那么就把新节点加入尾部;如果此时K-Bucket已经满了,就先
对首部的节点发送消息,手部节点有响应的话那么忽略新节点加入请求,同时把首部有反馈的节点移动到尾部,如果首部节点没有反馈,则删除就删除尾部节点,加
入新节点。这种新节点加入的处理方式能够很好的解决拒绝服务攻击,即使有很多节点同时到达要求加入网络,K-Bucket用自己的更新机制处理节点加入请
求,而不会过载,从而避免了拒绝服务攻击的影响。
Kademlia[/b]协议定义了四种远程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[/b]协议实现[/b]P2P VoIP系统是一个尝试,因为现在比较成型的P2P VoIP系统如Skype等P2P协议是私有的,而且下一小节将会介绍到Kademlia[/b]协议当前的应用,证明Kademlia[/b]协议是一个成熟的协议,用于P2P VoIP系统能避免许多不成熟的协议可能遇到的问题。

2.3 Kademlia[/b]协议应用

Kademlia[/b]协议应用范围较广,主要是P2P文件共享程序底层使用Kademlia[/b]协议来搭建Overlay,实现[/b]资源的存储、搜索和定位。
采用Kademlia[/b]协议实现[/b]的P2P文件共享程序主要有Emule,BitTorrent,BitSiprit,BitComet等。经过实践证明Kademlia[/b]协议是简单可靠的。目前Internet上大约有一半的网络流量为P2P流量,其中大部分为P2P文件共享程序产生的流量,而目前Emule,BitTorrent,BitSprit,BitComet都是很流行的P2P文件共享软件,因此可以不夸张地说,采用Kademlia[/b]协议的网络产生的流量占了很大一块Internet的流量。

3.1 ppPhone功能需求

ppPhone作为一个VoIP系统,应能实现[/b]以下功能:
l 新用户注册:系统注册新用户以及新用户加入网络;
l 用户退出:用户退出网络;
l 用户发布:在用户注册了一个用户名之后,将用户名及用户相关信息(IP地址及端口)发布到DHT中逻辑距离相近的节点上。
l 用户检索:给定一个用户名,将用户名哈希后,在DHT中查找到用户相关信息(IP地址及端口),并且将用户相关信息(IP地址及端口)返回。
l 语音通信:根据查找得到的用户相关信息(IP地址及端口),建立起语音通信信道,并且实现[/b]语音呼叫信令及语音编解码(采用G.729)。
l NAT及防火墙穿越:当用户处于内网或者防火墙之后时,提供一种用户穿越NAT和防火墙的方法。
l 与传统电话网及移动电话网互联互通:通过公共交换电信网(PSTN)与传统电信网实现[/b]互联,从而使得用户可以呼叫传统电话以及移动电话。

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),所有的节点是完全对等的,实现[/b]完全相同的功能。因此ppPhone是一个纯P2P的VoIP系统。ppPhone系统体系结构如图1所示。

图1 ppPhone系统体系结构
3.2.2 系统模块设计ppPhone系统主要包括用户界面、DHT模块、语音通信模块、注册服务器以及Bootstrap服务器共5个模块。系统模块与功能设计如图2所示。
图2 ppPhone系统模块图
基于上述设计,我们实现[/b]了ppPhone的原型系统,其中与传统电话网及移动电话网互联的部分由于条件限制还未能实现[/b],其余各个功能均实现[/b],系统运行良好,用户定位准确及时,语音通信质量较好。

4.1 系统平台

ppPhone在Windows XP上使用Visual Studio 2005开发,程序设计语言为C++,P2P模块基于Kademlia[/b]协议实现[/b],语音编解码使用G.729的Codec,通信信令为自定义的信令。

4.2 系统具体实现[/b]

ppPhone流程主要有注册/认证、加入Kad网、发布用户ID、查找用户ID,呼叫的建立和释放、语音传输等。系统流程如图3所示。

图3 ppPhone系统流程图
用户在第一次启动时需到注册服务器注册,注册自己的用户名ID,密码等信息;若已注册,直接登录,到注册服务器进行身份认证。用户客户端注册/认证完毕后就可以加入Kad网,首先设置本地TCP、UDP端口,设置引导结点IP地址、端口号,然后就可以调用Kademlia[/b]协
议模块加入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[/b]协议的P2P VoIP系统的实现[/b]过程,初步实现[/b]了
VoIP系统的功能;使用P2P来完成用户的查找与定位,能够有效的避免集中式服务器诸如单点故障等问题,并且能够以较好的速度来完成用户的查找和定位。
相比较于传统的VoIP系统,P2P
VoIP系统不需要配置即零配置、运营成本低、系统可靠性高,但是又有不便于管理等特点。在运营成本受限或者部署较大规模的VoIP系统时,P2P
VoIP系统是一个很好的选择。
【1】 Kademlia[/b] : 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电话软件原型与实现[/b] 汪亮宇硕士论文 北京航空航天大学
【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[/b]网络深入解析
http://dolfcao.spaces.live.com/
【11】 ppPhone系统实现[/b] http://sourceforge.net/projects/ppphone
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息