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

对等网络(P2P)的概念与思想

2009-04-29 10:38 316 查看
我想没有任何一个产业可像像IT产业一样,每天都不断地产生新的名词,然后在IT里面由几个简单词组成的IT名词,却不断引来大家的误解,我想P2P就是这些词中的一个了。

每当我向身边的同学和师弟提起P2P时,他们都异口同声地说“我知道 ,点对点嘛”。更多人会认为P2P就是point-to-point的简称。我简直不敢相信,P2P竟引来如此多的误解。我不知道为什么P2P会被人说成点对点,可能是数据链路层有个Point-to-Point protocol(PPP协议)吧,因而大误解P2P为point-to-point,点对点,有点可笑。更有甚者会说,P2P不就是BT嘛,呵呵,有时会搞得我哭笑不得。比较内行的同学才会问一下,你搞的P2P与BT有什么不同,呵这时才有机会让我发挥一下。好了,既然P2P这么多误解,那我就先给大家澄清一下吧。

首先,整个TCP/IP协议栈中应层以下的协议是为了通信而设计,无论它是多么的复杂,对于我们应用程序(应用层)来说,TCP/IP是一个基础设施。因此,在P2P的文献中会把TCP/IP网络说成为物理网络,进一步来说,如果P2P网络是建立于Ad Hoc网络时,我们也会把Ad Hoc网络称为物理网络,一句话,物理网络就是应用层以下的协议栈层组成的网络,这是一个通信的基础设施。
其实P2P就是一个应用层的网络,下面用一个C/S的例子就容易明白了。在C/S通信模式中,有一个服务器和很多的客户端,所有的资料都集中在服务器上。客户端能够与服务器通信,一个很重要的原因客户端知道服务器端的IP和端口号,因此就可以通信了。那么我可以定义,如果主机A知道主机B的IP和端口,那么A可以与B进行通信,那么我们认为A在应用层上与B有一个逻辑链路。那么节点与链路就可以构成一个图了,那么这个图就是网络,应用层上的图也即应用层网络,我们称为覆盖网络。我们可以想像一下,C/S通信模式就是一个树状的网络,只有一个根(服务器),所有节点都是它的直接子节点(客户端)。由于这样的一个图非常简单,并且只与根节点通信,不存在路由过程(选路过程,注意是应用层路由,而不是IP层的),因此,我们把C/S网络不看作覆盖网络,因为它不存在应用层路由过程。
好了,对应用层网络有了直接的概念吧,下面我们用一个更复杂的系统来解释什么是应用层路由,请看图1。

A---5----B----2----C
| | |
3 4 7
| | |

D---3----E----4---- F
<图1>
在上图中,A,B,C,..表示P2P的节点(可以认为一个P2P软件,具有服务器和客户端的功能)
,连线表示它们之间有逻辑链路(即知道对方的IP和端口号),连线中的权值表示该链路的距离,有逻辑链路的两个节点互为覆盖网络上的邻居。值得注意的是,A,B,C是P2P的节点,具有发出请求和处理请求的能力。如A与B通信,A只需知道 B的IP和端口号就可以了,它是要通过物理网络进行通信的,如采用TCP或UDP都可以的。
好了,我说明一下该P2P系
统的应用层路由过程。路由过程就是将一个请求(数据)转通过中间节点转发到目标节点上。我们现在不论讨上面的图(应用层网络结构)是如果得知的,等分析完
这个路由算法后再和大家分析,暂且放搁开它。上面每个节点的软件内容是完全对等的,它们是通过分布式的算法进行协作完成一次路由过程的,这点与IP层的路由算法是完全一样的。下面是各个节点所运行的路由算法,重点关注一下吧,这是P2P的精华。
对等体(Peer)的路由算法:
1)如果节点收到一个查询请求消息,先从消息中提取出请求者和消息ID,查看本地消息缓存是否有该请求者和ID对的记录,如有则表明该消息已处理过了,不作任何处理。否则执行2)

2)将请求者和消息ID存到本地的消息缓存中(防止重复处理),并记录该消息由谁发送过来的,称它为前一个节点;然后查看本地的资源是否有请求的资源。如果有的话,向转给它的前一个节点发一个回复消息,包括本地的IP和端口(下载资源时用的)。否则执行3).
3)将该消息转发给它所有的邻居,除了前一个节点。
4)如果一个节点收到了一个回复消息,如果它不是请求节点,则把消息转发给前一个节点,最后回复消息会回复到请求节点中去。

好了,现在我们用上面的算法具体分析一下路由过程,还是原来的P2P结构。
A---5----B----2----C
| | |
3 4 7
| | |
D---3----E----4----F
现在假设节点A要发出资源查询的请求,并且该资源只存在于节点F中。
第一步,节点A生成一个请求消息,包含请求者A,消息ID(独一无二的值),以及资源名字。它把消息发给B和D。
第二步,节点D在3个单位时间内收到请求信息。由于本地没有处理过该消息,那么它把保存下来,并且没有该资源,则把它转发给E。
第三步,节点B在5个单位时间内收到请求信息,处理与D一样,把消息转发给E和C。
第四步,节点E在6个单位时间内收到请求信息,由于第一次收到该消息,并且没有该资源,记录前一节点为D,把消息转发给B和F。
第五步,C在7个单位内收到请求信息,处理与上述的一样,并把它转给发F。
第六步,E在第9个单位时间内再次收到请求信息(比较请求者和ID即可知),由于之前已处理过了,对它进行了请求和ID对的缓存,故不处理。
第七步,B在第10个单位时间内收到从E转发过来的请求消息,重复消息,与第六步一样,不处理。同时F在10个单位时间内收到从E处转发过来的请求消息,发现有该资料,那么它F向E(前一个节点)发送一个回复消息,E收到该回复消息后,同样向D(前一节点)转发该回复消息,这样最后回复消息回传到A上。
…………
这就是一次路由过程(资源查询过程),当A收到F的回复消息,可以得知F的IP和端口号,那么它可以向F下载资源了。

本次路由过程的特点:由于A不知道F的存,更不知道它所请求的资料存在哪个节点上,所以发出了一次路由过程。同时我们注意到上面的路由算法是采用广播式的路由算法,这样会产生大量的重复消息,给网络的通信带来很大的负担,容易造成网络阻塞。其实最有用的链路由 A->D->E->F,请求消息不断地广播才找到F,因为所有节点都不知道资源在哪,只有F知道,故唯有广播了。在F发回复消息时,它是沿F->E->D->A走的,并不广播,因为事先已记录下来了回复的路径。注意A从回复消息中获到资源的存放点,但本系统并不关心A是如何向F下载资源的,本系统只负责资的查询。

相信大家看了上面的覆盖网络结构和路由算法后,脑海里面会出现很多不同的问题。现我尽可能能想像一下,并给出一个重要的回答。
1.上面的覆盖网络结构是如何建立的?
如果你能问这个问题,我觉得你有相关的C/S开发经验,或者对网络有很深入了认识。从事科研朋友通常会略过这个问题,因为在TCP/IP的网络和Ad Hoc网络是有所不同的。其实方法很简单,当一节点G要加入上面的P2P网络时(节点G刚运行时,还不知道网络有什么节点是该覆盖网络的),可以通过IP网络的多播找到该网络上的一个或多个节点,通常各个节点加入一个多播组来侦听节点的加入消息就可以了。假设节点G向多播组发送加入消息后,得到C,E,F的回复,那么它从回复消息中,得到C,E,F的IP和端口,则把这三个节点作为自己的邻居,通时通知这三个节点自己的IP和端口号,使自己变成它们的邻居。如果得到回复的节点数太多了,则把回复最早的几个节点(即与当前节点距离最近的)作为自己的邻居,并通知他们自己的加入。显然这是一种方法而己,还有很多其它方法。IP的多播方案自提出来已很有久了,但很多路由器对它不支持,因此仅依IP多播加入覆盖网络已成为了一种侈望。

2.刚才所说的邻居表到底用来做什么的?
呵呵,如果你会问这个问题,可能你对网络层的路由算法一点也不了解。邻居表就是覆覆盖网络上的路由表,它是由它来进行决策的。邻居表只是一个局部的信息,能不能每个节点都保存网络上其它所有节点的IP和端口,以进行通信呢?假如有的话,并且网络的节点数为n,那么进行资源查询时,只需进行O(n)次通信就可以找到资源的所在节点了。但是,这显得不太可能了,因P2P网络上的节点上线和下线是非常快的,网络变动很大的。如果每个节点都维护其它在线节点的信息,那么节点的邻由表会达到10W的数量级,并具随着节点的下线和上线,维护邻居表的更新的通信也会因此变得很大的。所以每个节点只能是维护一部分的节点信息。如果利用邻居表进行路由决策呢?也即是提到的算法,这会因不同的P2P系统有所不同。刚才说的系统是广播的路由算法,它向每个邻居都转发消息。当然还有其它系统,采取不同的路由算法,如基于DHT的Chord。

3.刚才所说的广播式算法或过程,是不是指IP多播。
这也是我面试时遇到的一个问题,他们认为P2P就是利用了IP多播进行资源查询的。很多人都没有想P2P是在应用层的,它构建的网络是应用层的网络,因此如果进行路由过程中采用广播式的算法,也就是说它向所有邻居发送消息,但向每个邻居发消息时,是采用物理网络的单播而进行的。如上图中的A要分别向B和D发送消息时,分别获得B和D的IP和端口,再进行TCP或UDP的通信。可以把A向B和D发消息时,可以认为在应用层上是广播的(它确定向所有的逻辑链路发送了消息,类似于广播式的),而在特理网络上是采用单播,可能先与B进行TCP,再与D进行TCP。当然,新节点加入网络时,可能会使用IP多播的,总的来说,P2P的路由算法是不使用多播的,否则也不会出现当前P2P的流行。

这里没有谈到路由的更新问题,如果节点A下线了,那么它会通知B和D。B和D收到A的下线消息后,B和D的把邻居表中的A项删除,如果认邻居太少了的话,那么它可以向它的邻居的邻居作为自己的邻居,这样使得网络链更复杂,可以减少出现网络分裂的情况。如果A是网络的割点,那么它的出现会使一个网络分成为两个网络,并且不能相互通信,这是P2P网络所要避免的。更进一步,如果节点A特然下线了,没有通知B和D,那B和D会通过A所发送的一个定期Keep-Alive(心跳)消息进行获知A在不通知的情况下掉线了。B和D就是要自己调整邻居表了。

好了总结一下,一个P2P系统有什么东西重要的呢?要由以下几部体组成:

盖网络的结构:这也就是覆盖网络的结构上有什么特点,上面说的那个网络是一个典型的随机图结构,它的邻居是不严格的。覆盖网络所对应的图有很多特点可以进
行分析的,如网络的直径,它决路由算法的代价。每个点的度,它决定节点的邻居表的大小,直接决定维护邻居表的代价。如一个n节点完全图,它的直径是1,而度是n;这决定它的路由过程非常高效,但邻居表的维护代价就非常大了。另外一个n节点所组成的环形图,那么它的直径是n/2,度是2;故它的路由复杂度为O(n),邻居表大小为O(1)。
覆盖网络的路由算法:这和覆盖网各的结构是紧密结合在一起的,可以说有什么样的结构,就对应什么的类型的路由算法。随机图的结构,对应的是广播式的路由算法;而正则图则对应对数的路由算法,类似于K分查找树的查找过程。
节点的加入,初始化路由表,和路由更新,以及容错算法:P2P系
统是动态的,节点不断地加入和退出。当一个节点加入了,它要运行节点加入算法,以获得网络上其它节点的信息,同时要初始化它的邻居表(路由表),这样其它
节点知道它加入后,要调整自己的邻居表(路由更新),以使得新节点加入后,网络结构的性质依然保持。如果某些节点下线,有可能通知,也可能没有通知其它节
点,那么网络中的相关节点能检测出来节点掉线,更自动调整邻居表,使网络结构依然持,这就是容错算法所要做的事情了。注意,这些算法都是独立运行在每个节
点的,它们是通过节点间的协作通信而工作的。

同时大家会问,P2P的优点是什么。在此,我不想谈它太多的优点,当然它也有缺点,我就谈谈它的特点吧:
1)可扩展性:这个P2P中一个很诱人的特点,网络可容纳的节点个数是无限的,可共享的资源数同样是无限的。资源分布在不同的节点里面,它们一起协同而形一个资源无限的网络。
2)分散性:P2P中的资源分布在所有节点中,避免了服务器的介入,这样可避免音点屏颈的出现。样就大大降低了对集中式服务器的资源和性能要求。
3)健壮性:在集中式网络中,服务器成为整个系统的屏颈,无论是容量,和计算机处理能力。但是在P2P网络是,这样的问都都不会出现。系统的资源,计算机能力和存储能力都是分布在所有的节点上的,理论上是这些能力是无限。

当然P2P还有很多特点,在些不一一列举。写到这样还不能满足大家的口味,因为没有提到BT。说声抱歉,我对BT不了解,故不在些分析。你可参考相关的文章进行有选择性的阅读。现在流行P2P软件几本都是基于中央服务器的P2P系统。而我们上面析的那个系统是没有中央服务器的,所有节点都对等的,请大家分清楚。
至于没有中央服务器的P2P能否走向商业化,还有待大家的关注,有兴趣的朋友请继续关注下一篇文章,具体介绍几个典型的P2P系统。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: