P2P技术应用
P2P,即对等连接(peer to peer)是指两个主机在通信时并不区分哪一个是服务请求放还是服务提供方。两个主机都运行了对等连接软件(P2P软件,例如我们平时用的百度云盘、微博网盘、还有死去的360网盘),它们就可以进行平等的、对等的连接通信。这是双方都可以对等的下载对方已经存储在硬盘上中的共享文档。因此这种工作方式也成为P2P文件共享。
一、P2P的工作方式概述
自从因特网能够提供音频/视频文件。这就导致因特网上的数量有限的媒体服务器经常要工作在过负荷的状态。有些媒体服务在大量用户连接不断的访问甚至会瘫痪。在这种情况下,P2P工作方式受到大量网民的欢迎,因为这种方式不需要使用集中式的媒体服务器,这就解决了集中是媒体服务器可能出现的瓶颈问题。
在P2P工作方式下,所有的音频/视频文件都是在普通的因特网用户之间传输。这其实是相当于有很多分散在各地的媒体服务器向其他用户所提供要下载的音频/视频文件。
二、P2P文件分发
我们通过讨论一个非常自然的应用来开始研究P2P,这个应用是从单一服务器向大量主机(称为对等方) 分发大文件。该文件可以是一个新版的Linux操作系统、现有操作系统或应用程序的一个补丁、一个MP3音乐文件或一个MPEG视频文件。在客户机/服务器文件分发中,服务器必须向每个对等方发送该文件的一个拷贝,即服务器承受了极大的负担,并且消耗了大量的服务器带宽。在P2P文件分发中,每个对等方都能够重新分发其所有的该文件的任何部分,从而协助服务器进行分发。
在本书写作时(2007年春),最流行的P2P文件分发协议是BitTorrent [BitTorrent 2007]。据估计,BitTorrent占据了因特网主千流量的30%。BitTorrent最初是由Bram Cohen研发的,现在有许多遵从BitTorrent协议的BitTorrent客户机,就像有许多遵从HTTP协议的Web浏览器客户机一样。
--------------------------------------------------------------------------------------------------------------------
1.P2P体系结构的扩展性
为了比较客户机/服务器体系结构与对等体系结构,阐述P2P的扩展性,我们现在考虑一个用于两种体系结构类型的简单定量模型,将一个文件分发给一个固定集合。如图1所示,服务器和对等方使用接入链路与因特网相连。
其中,u-s表示服务器接人链路的上载速率,u-i表示第i个对等方接入链路的上载速率,d-i表示第i个对等方接入链路的下载速率。此外,F表示被分发的文件长度(以比特计),N表示要获得文件拷贝的对等方的数量。分发时间(distribution time) 是N个对等方得到文件拷贝所需要的时间。
在下面关于分发时间的分析中,对两种体系都做了简化的假设,即因特网核心具有大量的带宽,这意味着所有瓶颈都在网络接入链路上。我们还假设服务器和客户机没有运行任何其他网络应用,因此它们所有上载和下载访问带宽都用于分发文件。
我们首先来确定客户机/服务器体系结构中的分发时间,设其为D_cs。在客户机/服务器体系结构中,没有对等方来帮助分发文件。我们进行下列观察:
1.服务器必须向N个对等方的每个都传输一个文件拷贝,因此该服务器必须传输NF比特,因为该服务器的上载速率是u_s,所以分发给文件的时间至少是NF/u_s.
2. 令d_min表示下载速率最小的对等方的下载速率,即d_min=min{d1,d2,......,dn}。下载速率最小的对等方不可能在F/d_min秒之内获得该文件的所有F比特。因此,最小分发时间至少为F/d_min。
将这两个观察结合起来,我们得到
上式给出了客户机/服务器体系结构中最小分发时间的下届。取该下届作为实际分发时间,即:
从上式看到,对足够大的N,客户机/服务器体系结构中的分发时间由NF/u_s确定。于是,分发时间随着对等方的数量N线性地增加。因此,如果一周内,对等方的数量从1000增加到了100万,则该文件分发到所有对等方需要的时间就要增加1000倍。
--------------------------------------------------------------------------------------------------------------------
下面简单地分析一下P2P体系结构,其中每个对等方都能够帮助服务器来分发文件。也就是说,当一个对等方接收到文件数据时,它可以利用自己的上载能力重新将数据分发给其他对等方。计算P2P体系结构的分发时间在某种程度上比计算客户机/服务器体系结构的分发时间更复杂,因为分发时间取决于每个对等方如何向其他对等方分发部分该文件。但不管怎样,都可以得到对该最小分发时间的一个简单表达式。我们先作下列观察:
1.在分发的开始,只有服务器拥有文件。为了是这些对等方得到该文件,服务器必须经其接入链路至少发送一次该文件的每一个比特。因此,最下分发时间至少是F/u_s。( 与客户机/服务器方案不同,服务器发送过一次的比特可能就不用再次发送了,因为对等方可以互相重新发送这些比特。)
2.与客户机/服务器体系结构相同,下载速率最小的对等方不可能在F/d_min秒之内获得所有的F比特。因此,最小分发时间至少为F/d_min。
3.最后,系统的总上载能力等于服务器的上载速率加上每个对等方的上载速率,即u_total=u_s+u1+...+un。系统必须向N个对等方的每个交付F比特,因此总共交付NF比特。这不可能快于u_total的速率完成。所以,最小分发时间至少是nf/(u_s+u1+....+un)。
将这三个观察结合起来,我们获得了P2P的最小分发时间,记为D_P2P
上式给出P2P体系结构中的最下分发时间的下界。如果假定每个对等方接收到一个比特就重新分发一个比特的话,则该重新分发方案可以实际取得这个下界。实际上,重新分发的是文件块而不是一个个比特。上式可以作为实际最小分发时间的很好近似。因此,利用上式的下界作为实际的最小分发时间,即:
--------------------------------------------------------------------------------------------------------------------
下图比较了客户机/服务器和P2P体系结构的最小分发时间,其中假定所有的对等方具有相同的上载速率u
--------------------------------------------------------------------------------------------------------------------
2.BitTorrent
BitTorrent是一种用于文件分发的流行P2P协议[BitTorrent 2007]。用BitTorrent的术语来讲,参与一个特定文件分发的所有对等方的集合称为一个洪流(torrent)。在一个洪流中,对等方彼此下载等长度的文件块,块长度通常为256 KB。当一个对等方开始加入一个洪流时,它没有文件块。随着时间的推移,它将累积越来越多的文件块。当它下载文件块时,也为其他对等方上载了多个文件块。对等方一旦获得了整个文件,它也许(自私地) 离开洪流,或(大公无私地) 留在洪流中并继续向其他对等方上载文件块。同时,任何对等方可以在任何时候(这时,它还没有获得整个文件) 离开洪流,以后也可以重新加入洪流
我们现在更为仔细地研究BitTrrent是如何运行的。因为BitTorrent是一个相当复杂的协议,所以这里我们仅描述它最重要的机制,浏览某些内部的细节,这将使得我们能够通过树木看森林。每个洪流具有一个基础设施节点,称为追踪器(tracker)。当一个对等方加入洪流时,它向追踪器注册,并周期性地通知追踪器它仍在洪流中。追踪器以这种方式跟踪洪流中的对等方。一个特定的洪流可能在任何时刻拥有数以百计或数以千计的对等方。
如图所示,当一个新的对等方Alice加人洪流时,追踪器随机地从参与对等方集合中选择一些对等方(为了具体起见,比如说50个对等方),并将这50个对等方的IP地址发送给Alice。Alice持有对等方的这张列表,试图与该列表上的50个对等方创建并行的TCP连接。我们称所有与Alice成功地创建TCP连接的对等方为“邻近对等方”。(在图中,Alice仅有三个邻近对等方。通常,她应当有更多的对等方。) 随着时间的推移,其中的一些对等方可能离开,而其他对等方(最初50个对等方以外的) 可能试图与Alice创建TCP连接。因此,邻近对等方将随着时间而改变。
在任何时刻,每个对等方都具有来自某文件块的子集,且不同的对等方具有不同的文件块子集。Alice周期性地(经TCP连接) 询问每个邻近对等方它们所具有的块列表。如果Alice有L个邻居,那么她将获得L个块列表。因此,Alice将对她当前还没有的块发出请求(仍通过TCP连接)。因此,在任何给定的时刻,Alice将具有块的子集并知道其邻居具有哪些块。
于是,Alice将作出两个重要决定:第一,她应当向她的邻居请求哪些块呢? 第二,她请求的块应当发送给她的哪些邻居?
在决定请求哪些块的过程中,Alice使用一种称为最稀罕优先(rarest first )的技术。这种技术的思路是,根据她没有的块从她的邻居中确定最稀罕的块(最稀罕的块就是在她的邻居中拷贝数量最少的那些块),并优先请求那些最稀罕的块。按照此方式,最稀罕的块更迅速地重新分发,其目标(大致) 是均衡每个块在洪流中的拷贝数量
为了决定她响应哪个请求,BitTorrent使用了一种机灵的对换算法。其基本想法是Alice确定其邻居的优先权,这些邻居是那些当前能够以最高的速率供给她数据的。特别是,Alice对于她的每个邻居都持续地测量接收到比特的速率,确定以最高速率流人的4个邻居。然后,她将数据块发给这4个邻居。每过10秒,她重新计算该速率并可能修改这4个对等方。更重要的每过30秒,她要随机地选择一个另外的邻居并向它发送块。我们将这个随机选择的对等方称为Bob。因为Alice在向Bob发送数据,所以她可能成为Bob前4位上载者之一,这样的话Bob将开始向Alice发送数据。如果Bob向Alice发送数据的速率足够高,那么他也能成为Alice的前4位上载者。换言之,每过30秒Alice将随机地选择一名新的对换伙伴并开始与那位伙伴进行对换。如果这两个对等方都满足此对换要求,那么它们会将对方放人其前4位列表中并继续与对方进行对换,直到对等方之一发现了一个更好的伙伴为止。这样,对等方就能够以趋于满意的速率上载。而随机选择邻居是为了让新的对等方得到块,因此它们能够有对换的东西。除了这5个对等方(4个“前面”对等方和1个探测对等方),所有其他相邻对等方均被“阻止”,即它们不能从Alice接收到任何块。
在P2P文件共享中,免费搭车是一个常见的问题,这是指对等方从文件共享系统中下载文件而不上载文件。BitTorrent的对换算法也有效的消除了这种免费搭车的问题。因为Alice为了能在一段较长的时间内以较快的速率从Bob下载比特,就必须同时以一种较快的速率向Bob上载比特。BitTorrent还具有很多其他有趣的机制。这些机制包括部分、管道、随机优先选择、残局模型和反怠慢。
--------------------------------------------------------------------------------------------------------------------
3.在P2P区域中搜索信息
许多P2P应用程序中的一个重要部分是信息索引,即信息到主机位置的映射。在这些应用程序中,对等方动态地更新和搜索索引。由于“信息到主机位置的映射”这一说法听起来有点抽象,所以我们来看几个具体的例子。
在P2P文件共享系统中,通常有大量参与对等方,每个对等方都有文件(包括MP3、视频、图像和软件) 可供共享。P2P文件共享系统有一个索引,它动态地跟踪这些对等方可供共享的文件。对于该对等方区域可供共享的每个文件的拷贝,该索引维护了一个记录,该记录将有关拷贝的信息(例如,如果它是一首MP3歌曲,则是该歌曲的曲名、作曲家等) 映射到具有该拷贝对等方的IP地址。随着对等方进人和退出以及对等方获得文件的新拷贝,该索引进行动态的更新。例如,当一个对等方加入系统时,它通知系统它所拥有的文件索引。当某用户(如Alice) 希望获得一个文件时,她搜索索引以定位该文件的拷贝位置。在定位了具有该文件拷贝的对等方以后,她就能够从这些对等方处下载该文件。一旦她具有了该完整文件,就会更新索引以将她具有的该文件新拷贝算在内。
在即时讯息应用程序中,有一个映射用户名与位置(IP地址) 的索引。为了理解索引在这个应用程序中的重要性,考虑都在对方的好友列表中的两个用户BeautifulAlice和HandsomeBob。当HandsomeBob在具有IP地址X的主机上启动他的即时讯息客户机时,他的客户机将通知该索引HandsomeBob正以IP地址X在线。随后,当BeautifulAlice启动她的即时讯息客户机时,因为HandsomeBob位于她的好友列表中,所以她的客户机在该索引上搜索HandsomeBob并发现了他以IP地址X在线。然后,BeautifulAlice可以与具有地址X的主机创建一个直接的TCP连接,并与HandsomeBob开始即时讯息通信。除了即时讯息外,许多其他应用程序也使用索引来进行跟踪,包括因特网电话系统。
下面我们讨论在对等区域中组织和搜索索引三种方法。为了具体起见,我们假设在P2P文件共享系统中搜索一个文件。
1.集中式索引
定位文件的一个最直接的办法是提供一个集中式索引(centralized index),就像Napster那样。Napster是第一家大规模部署P2P文件共享应用程序的商业公司。在这种设计中,
由一台大型服务器(或服务器场(farm)) 来提供索引服务。如图所示,当用户启动P2P文件共享应用程序时,该应用程序将它的IP地址以及可供共享的文件名称(如它存储的所有MP3标题)通知索引服务器。该索引服务器从每个活动的对等方那里收集这些信息,从而建立一个集中式的动态索引,将每个文件拷贝映射到一个IP地址集合。注意,具有集中式索引的P2P文件共享系统实际上是一种P2P和客户机/服务器混合体系结构。文件分发是P2P的,但搜索是客户机/服务器的。目前很多应用程序都采用了这样的混合体系结构,如许多即时讯息应用程序。
使用集中式索引定位内容从概念上讲是很直接的,但是它也有几个缺点:
1.单点故障。如果索引服务器崩溃,则整个P2P应用也就随之崩溃。即使服务器场还有多余的服务器可以使用,因特网与服务器场之间的连接也可能失效,从而导致整个应用崩溃。
2.性能瓶颈和基础设施费用。在一个大型的P2P系统中,有着成千上万条的连接用户,集中式服务器必须维护一个庞大的索引,每秒钟必须对数千次查询做出响应。事实上,Napster作为2000年最流行的P2P应用,其中央服务器承受了巨大通信量问题的折磨。
3.侵犯版权。尽管这个主题超出了本书的范围,但我们还是要简要地提一下唱片录音行业所关注的问题(最低程度这样说),即P2P文件共享系统允许用户免费获取受版权保护的。 当一个P2P文件内容共享公司有一台集中式索引服务器时,法律程序将迫使该索引服务器不得不关闭。不过关闭具有更分散的体系结构的系统要困难得多。
2.查询洪泛
与集中式索引对立的方法是查询洪泛的完全分布式方法。查询洪泛是建立在Gnutella协议基础上的。在查询洪泛中,索引全面地分布在对等方的区域中。每个对等方索引可供共享的文件而不索引其他文件。
在Gnutella中,对等方形成了一个抽象的逻辑网络,该网络被称为覆盖网络(overlay network)。用图论的术语来说,如果对等方X与另一个对等方Y维护了一个TCP连接,那么我们就说在X和Y之间有一条边(edge)。图由所有活跃的对等方和连接的边(持续的TCP连接)它定义了覆盖网络。注意,一条边不是一条物理通信链路,而是一条抽象链路,该链路可能由下面的许多物理链路组成。例如,某覆盖网络中的一条边可能表示在立陶宛的一个对等方与在巴西的一个对等方之间的TCP连接。
尽管一个覆盖网络可能有成千上万参与对等方,但一个给定的对等方通常与该覆盖网络中的少量(通常少于10个) 节点连接,如图2-28所示。后面我们将解释当对等方加人和离开网络时,覆盖网络是如何构建和维护的。此时我们假定覆盖网络已经存在,先关往某对等方定位和检索内容。
在这种设计中,对等方通过已经存在的TCP连接,向覆盖网络中的相邻对等方发送报文。当Alice要定位“Network Love"时,她的客户机向她的所有邻居发送一条查询报文,该报文包括关键词“Network Love”。Alice的所有邻居向它们的所有邻居转发该报文,这些邻居又接着向它们的所有邻居转发该报文等。显示在图2-28中的这个过程被称为查询洪泛(query flooding)。当一个对等方接收到一条查询报文时,它将检查该关键词是否与可供共享的任何文件相匹配。如果存在一个匹配,它向Alice回送一条“查询命中”(QueryHit) 报文,该报文包含了匹配文件名和文件长度。该“查询命中”报文遵循“查询”报文的反向路径,因而使用预先存在的TCP连接。Alice以这种方式,发现了具有她想要的文件拷贝的对等方。
尽管这种分布式设计简单而优美,但也常因其扩展性差而受到批评。特别是对于洪泛查询,只要某对等方发起查询,该查询就会传播到整个覆盖网络中的每个其他对等方,从而在连接对等方的支撑网络(如因特网) 中产生大量流量。Gnutella的设计者为解决该问题使用了范围受限查询洪泛(limited scope query flooding)。具体说来,当Alice发出她的初始查询报文时,该报文中的对等方计数字段被设置一个特定值(比如说7)。每当该查询报文到达一个新对等该对等方在向其覆盖邻居转发该请求之前就将对等方计数字段减1。当某对等方接收到方时,一个对等方计数字段为0的查询时,它就停止转发该查询。用这种方式,洪泛被局限于覆盖网络的某个区域。
显然,这种范围受限查询洪泛减少了查询流量。然而,它也减少了对等方的数量。因此,即使你希望查找的内容在对等方区域的某个地方,你也可能不能定位到它。
覆盖网络中的一个基本问题是如何处理对等方的加人和离开。我们以初始的Gnutella设计为例,描述当新对等方加人时覆盖网络所采取的动作。假定新对等方X要加入覆盖网络。
1) 对等方X必须首先发现某些已经位于覆盖网络中的其他对等方。解决这种引导跨接问题(bootstrap problem) 的一种方法是,让X维护一张对等方的列表(IP地址),这些对等方经常在该覆盖网络中开机; 另一种方法是,X能够联系维护这种列表的跟踪站点(像BitTorrent中那样)。
2)一旦访问了这样一张列表,X接下来试图与该列表上的对等方建立一个TCP连接,直到与某个对等方Y创建了一个连接为止。
3) 在X和Y之间创建一个TCP连接以后,对等方X向Y发送一个ping报文。该ping报文也包括对等方计数字段。一旦接收到该ping报文,Y向它在该覆盖网络中的所有邻居转发之。这些对等方继续转发该ping报文直到该对等方计数字段为0。
4) 只要一个对等方Z接收到一个ping报文,它通过该覆盖网络向X回发一个pong报文,该pong报文包括Z的IP地址。
5) 当X接收到该pong报文后,它知道了该覆盖网络中的许多对等方的IP地址。然后,它能够与某些其他对等方建立TCP连接,从而从它自己向该覆盖网络中创建多条边。
3.层次覆盖
我们已经学习了集中式索引和洪泛查询,它们使用了完全相反的方法来定位内容。现在我们描述第三种方法一一层次覆盖设计(hierarchical overlay design),该方祛结合了上述两种方法的优秀特征。层次覆盖设计由FastTrack首创,多年来许多客户机实现了这种P2P文件共享协议,其中包括Kazaa和Morpheus。现代Gnutella也采用了这里所描述的层次覆盖设计的一个变种。
与洪泛相类似,层次覆盖设计不使用专用的服务器来跟踪和索引文件。然而,与洪泛查询不同的是,在层次覆盖设计中并非所有对等方都是平等的。特别是,与因特网高速连接并具有高可用性的对等方被指派为超级对等方,它承担更多的任务。如下图,如果对等方不是超级对等方则它就是一个普通的子对等方,并被指派为一个超级对等方可能有几百个普通对等方作为其子对等方。
一个新的对等方与超级对等方之一创建一个TCP连接。然后,新对等方将它可共享的所有文件高速超级对等方。这样,超级对等方就维护着一个索引,该索引包括了其子对等方正在共享的所有文件的标识符、有关文件的元数据和保持这些文件的子对等方的IP地址。这样,每个超级对等方成为一个“袖珍型”索引。但与前面讨论的集中式索引相比,超级对等方不是一台专用服务器,而是普通的对等方,通常位于一个住宅中或一个大学校园中。如果每个超级对等方及其子对等方被隔离,那么任何对等方可用的内容数量将严重受限。
为了处理这种限制,超级对等方之间相互建立TCP连接,从而形成一个覆盖网络。借助于这个覆盖网络,超级对等方可以向其相邻超级对等方转发查询。该方法类似于查询洪泛,但覆盖网络中的超级对等方仅使用了范围受限查询洪泛。当某对等方进行关键词匹配时,它向其超级对等方发送带有该关键词的查询。超级对等方则用其具有相关文件的子对等方的IP地址进行响应,这些文件的描述符与关键词(连同这相匹配。该超级对等方还可能向一个或多个相邻超级对等方转发该查询。些文件的标识符)如果某相邻对等方收到了这样一个请求,它也会用具有匹配文件的子对等方的IP地址进行响应。超级对等方的响应遵循该覆盖网络中的反向路径。
通过将少量更强大的对等方指派为超级对等方,层次覆盖设计充分利用了对等方的异质性(heterogeneity of the peers),形成了一个层次覆盖网络的顶层,如图2-29所示。与范围受限查询洪泛设计(像初始的Gnutella设计那样) 相比,层次覆盖设计允许数量多得多的对等方检查匹配,而不会产生过量的查询流量。