P2P SIP技术的研究
2008-04-21
作者:隋晋光1,2, 鲁士文3
摘 要: 在阐述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.