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

Posted 海枫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对等网络(P2P)的概念与思想相关的知识,希望对你有一定的参考价值。

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


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

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


首先,整个TCP/IP协议栈中应层以下的协议是为了通信而设计,无论它是多么的复杂,对于我们应用程序(应用层)来说,TCP/IP是一个基础设施。因此,在P2P的文献中会把TCP/IP网络说成为物理网络,进一步来说,如果P2P网络是建立于Ad Hoc网络时,我们也会把Ad Hoc网络称为物理网络,一句话,物理网络就是应用层以下的协议栈层组成的网络,这是一个通信的基础设施。

其实P2P就是一个应用层的网络,下面用一个C/S的例子就容易明白了。在C/S通信模式中,有一个服务器和很多的客户端,所有的资料都集中在服务器上。客户端能够与服务器通信,一个很重要的原因客户端知道服务器端的IP和端口号,因此就可以通信了。那么我可以定义,如果主机A知道主机BIP和端口,那么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,CP2P的节点,具有发出请求和处理请求的能力。如AB通信,A只需知道 BIP和端口号就可以了,它是要通过物理网络进行通信的,如采用TCPUDP都可以的。

好了,我说明一下该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(独一无二的值),以及资源名字。它把消息发给BD

第二步,节点D3个单位时间内收到请求信息。由于本地没有处理过该消息,那么它把保存下来,并且没有该资源,则把它转发给E

第三步,节点B5个单位时间内收到请求信息,处理与D一样,把消息转发给EC

第四步,节点E6个单位时间内收到请求信息,由于第一次收到该消息,并且没有该资源,记录前一节点为D,把消息转发给BF

第五步,C7个单位内收到请求信息,处理与上述的一样,并把它转给发F

第六步,E在第9个单位时间内再次收到请求信息(比较请求者和ID即可知),由于之前已处理过了,对它进行了请求和ID对的缓存,故不处理。

第七步,B在第10个单位时间内收到从E转发过来的请求消息,重复消息,与第六步一样,不处理。同时F10个单位时间内收到从E处转发过来的请求消息,发现有该资料,那么它FE(前一个节点)发送一个回复消息,E收到该回复消息后,同样向D(前一节点)转发该回复消息,这样最后回复消息回传到A上。

…………

这就是一次路由过程(资源查询过程),当A收到F的回复消息,可以得知FIP和端口号,那么它可以向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向多播组发送加入消息后,得到CE,F的回复,那么它从回复消息中,得到CEFIP和端口,则把这三个节点作为自己的邻居,通时通知这三个节点自己的IP和端口号,使自己变成它们的邻居。如果得到回复的节点数太多了,则把回复最早的几个节点(即与当前节点距离最近的)作为自己的邻居,并通知他们自己的加入。显然这是一种方法而己,还有很多其它方法。IP的多播方案自提出来已很有久了,但很多路由器对它不支持,因此仅依IP多播加入覆盖网络已成为了一种侈望。


2.刚才所说的邻居表到底用来做什么的?

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


3.刚才所说的广播式算法或过程,是不是指IP多播。

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


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


好了总结一下,一个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系统。

 

以上是关于对等网络(P2P)的概念与思想的主要内容,如果未能解决你的问题,请参考以下文章

p2p (对等网络)

P2P技术概要

KademliaDHTKRPCBitTorrent 协议DHT Sniffer

计算机领域的核心概念与思想

当外部端口不断变化时,natted 网络中对等点之间的 P2P

Win7设置虚拟WiFi对等网P2P