BitTorrent协议的特性浅析
2016-01-14李敏宁
李敏宁
摘要:传统的C/S架构在当用户数目急剧增加时,容易产生服务器过载现象,使用服务器集群或分布式系统成本增大。BitTorrent协议是一种基于P2P(Peer to Peer)的文件共享协议,具有“用户越多,下载速度越快”的特点,尤其是针对大文件的下载,能够较好的降低服务器负担,提高系统的扩展性和健壮性。更能体现出系统的优越性。但其缺点是为了追求下载速度而牺牲了文件下载的顺序性。
关键词:BitTorrent协议;P2P技术;片段选择算法
中图分类号:TP393 文献标识码:A 文童编号:1009-3044(2015)19-0100-03
在传统的FTP/HTTP协议中,用户在下载文件时没有交互,当同一时间内访问服务器的用户超过一定量时,由于有限的带宽和难以提升能力的FTP服务器,下载速度急剧下降,导致部分用户可能与服务器无法建立连接。
为了解决这个问题,研究人员进行了多年探索,2003年,美国软件工程师布莱姆·科亨采用Python语言编写了BitTorrent协议,并以MIT许可证发布。
BitTorrent采用高效的文件分发技术及P2P技术共享文件,系统内用户在下载的同时向其他下载者提供上传服务。具有“用户越多,下载速度越快”的特点。
1BitTorrent协议的工作原理
BitTorrent协议处在TCP/IP的应用层,是一种P2P文件传输协议,由于开源的特点,其内容一直在不断扩充。
在BitTorrent系统中,文件发布者先将文件生成.torrent文件,称为种子文件(简称“种子”)。种子文件本质上是文本文件,它包含Tracker(跟踪器)信息及文件信息两个部分:Tracker信息包括它的地址以及设置信息;文件信息根据对共享文件的计算生成,计算结果使用B编码规则进行编码。其主要原理是把文件虚拟分成许多块,每个块256KB,并把块的索引信息和Hash验证码都写入种子文件,也就是说,种子文件即是被下载文件的索引。
用户下载文件前,先要下载该文件的种子,BitTorrent客户端首先解析种子文件,得到Tracker地址后连接Tracker服务器,提出请求;Tracker服务器收到请求后,提供给用户发布者和该系统内其他下载节点的TP地址,用户根据地址和下载者相互连接,交换自己拥有的块。此时服务器不再参与,单个线路的数据流量降低,从而减轻了服务器的负担。
为了保证下载数据正确,用户每下载完一个块,BitTorrent就会计算出这个块的Hash码,对比.torrent文件,相同就说明数据正确,否则重新下载。
2BitTorrent的架构
BitTorrent最突出的特点是下载文件速度极快,理想状态下,BitTorrent的下载速度可以达到电信运营商所提供的最高速度,而与源文件所在结点的上传带宽关系不大。BitTorrent的下载速度高,是因为BT的服务模式与传统的C/S(客户机/服务器)模式不同,如图1所示。
左图是传统的C/S模式,s拥有文件,有六个客户(C1、C2、C3、C4、C5、C6)同时希望得到这个文件,则每个客户的下载速度最高只能是文件拥有者S上传速度的1/6。如果同时有成百上千的用户访问S,则每个客户的下载速度将极小,甚至可能造成S瘫痪。
右图是BitTorrent模式,仍然是S拥有文件,同时有六个客户(C1、C2、C3、C4、C5、C6)希望得到这个文件,这时,S先将文件分片段传送给他们中的部分客户(如C1、C3、C5),这些客户拥有若干个片断后,在继续下载其它片断的同时也提供给其他客户自己所拥有的片断。比如,C2可以同时从种子S与C1、C3、C5等处下载文件片断,这样各个客户端共同合作,分别贡献自己的上传带宽,帮助C2快速下载文件。如果网络上的下载者不只这几个,而是数以万计,那么C2的下载速度在理论上就可以达到极限。因此,下载者之间相互提供文件片段,下载者越多,片段源就越多,下载速度也越快,同时也减轻了资源提供者S的压力。
BitTorrent对于服务器的好处是很大的。在C/S模式中,只有等所有的下载者都完成了下载,服务器才能下线,带宽的消耗也是单方面的(只消耗服务器的上传带宽),往往会造成服务器端拥塞。而BitTorrent不同,当网络上出现另一个下载了完整文件的用户,只要不退出BT环境,就产生了一个新种子,原来的种子就可以下线了。一个完整的BitTorrent文件分发系统是这样的:
1)如图2,BitTorrent系统由以下成员组成:
A.一个普通的Web服务器,如图2中的S;
B.一个跟踪服务器(Tracker),如图2中的T;
C.一个发布者节点,如图2中的C;
D.终端客户群,如图2中的P1、P2等。
理想的情况是多个终端用户在同时下载同一个文件。
2)要让系统正常运转,发布者节点需要执行以下步骤:
A.生成一个种子文件(.torrent文件),运行跟踪服务器Tracker;
B.发布这个种子文件和跟踪服务器Tracker的URL到Web服务器上,并添加一个到该文件的链接;
C.保持拥有完整文件的发布者(Seed)在线,等待下载。
3)要下载文件,用户需要执行的步骤如下:
A.访问.torrent文件所在的Web服务器,下载.torrent文件;
B.与跟踪服务器通信,报告自身的信息,得到发布者节点和随机的邻居节点信息;自动启动BitTorrent文件发布者节点,选择文件的保存位置;
C.与发布者节点和邻居节点通信,下载文件,同时对其他下载者(Peers)提供上传。
D.等待下载完成,下载完成后若不主动结束程序运行,则会成为Seed,继续为其他Peers提供上传。
4)各部分之间的连通性如下:
由上面的描述可知:文件发布者通过BitTorrent制作.tor-rent文件,上传Web服务器并发布;其他用户登录Web服务器下载此种子文件,同时向跟踪服务器Tracker发送自己的Peer_id(节点标志)、ip(节点地址)和port(开发端口);Tracker通过HTTP协议接收用户信息,并为其返回一个随机的Peers地址列表;Peers周期性的向Tracker登记,以便Tracker了解其进度;Peers之间通过直连方式交换数据(连接使用基于TCP的Bit—Torrent对等协议)。
因为系统中只有文件发布者才拥有完整的文件,所以它必须将文件完整地传输给网络。在下载者很多时,由于短时间内系统已经完成了许多下载,之后文件发布者随时可以退出上传,系统仍然保持运行。
3BitTorrent协议的技术特点
在传统的C/S系统中,下载文件的所有开销都在服务器上。BitTorrent系统中则是完全不同的情况:如果多人同时下载一个文件,在Tracker的帮助下,Peers会相互提供自己拥有的文件片断,这样,每个下载者都会承担部分下载开销。理论上,这种系统可以容纳无限多个下载者,却不会影响速度。
BitTorrent协议有下面几个特点:
1)对等发布
BitTorrent系统中,Peers之间通过Tracker服务器相互发现并交互来解决和文件下载相关的所有逻辑问题。
BitTorrent将文件切割为固定大小(如256KB)的片断,这些片断都通过了SHA1算法计算出它的hash信息,保存在.torrent文件中。在Peers通信时,每个Peer都必须告诉对方自己拥有哪些片断。
否则,Peers先建立连接,然后发现对方并没有它想要的片断,或者暂不允许它去下载,再去尝试其他的连接,不但费时费力,而且造成了系统的许多额外开销。
2)流水作业
为了提高传输速率,BitTorrent将每个文件片断又进一步分为16KB的子片断,同时,保持几个请求(通常为5个,因为此时大多数Peers连接已经饱和)被流水地同时发送,即每隔一段时间发送5个请求。
3)片断选择算法
一个文件被分割成了多个片段,为了提高下载性能,选择片段的下载顺序就显得尤为重要。BitTorrent协议采用的片断选择算法主要包含四个策略。
(1)严格的优先级
只要某个片断的一个子片断被请求,该片断的其余子片断就被优先请求。这样能够使下载者尽快地获得一个完整的片断。
(2)最少优先
在选择下一个片断时,系统中最少Peers所拥有的那个片断优先被选择。使用这种策略确保系统中每个Peer都能拥有一些其他Peers最希望得到的片断,这样,无论哪个片段,一旦有Peers需要,就能马上下载。整个系统逐渐被优化。
(3)随机的第一个片断
初始下载时,下载者们没有片断可供上传,最少的片断只有原始种子拥有,就不适宜用“最少优先”策略。因为这种情况下,它一般比多个Peers所拥有的那些片断下载速度都要慢。因此,第一个片断采用随机选择策略,之后的片段才切换到“最少优先”策略。
(4)最后阶段模式
在下载文件的最后阶段,如果仍然使用最少优先策略,连接到拥有片段的Peer速率很慢,就会严重影响下载速度。因此,系统采用另外一种策略,用户先对所有的Peers发送对最后片段的子片段请求,一旦有哪些子片断到了,就向其他Peers发送cancel消息。运用这种策略,文件的最后一个片段下载的非常快。
4)阻塞(choking)算法
BitTorrent系统中的每个Peer与其他Peers连接下载文件,都会根据对方提供的下载速率给予同等的上传回报。为了惩罚自私者,定义了一种算法:对于合作的用户提供上传服务,不合作则阻塞对方。显然,这种阻塞是根据用户态度形成的临时拒绝上传的一种策略,阻塞时连接仍然保持。
阻塞算法对于提高整个系统的性能非常必要。理想的阻塞算法会尽可能地利用一切资源,提供给所有Peers可靠、一致的下载速率,并适当惩罚那些只享受下载而不愿上传的Peers。优秀的阻塞算法遵循下面几个原则:
1)帕累托有效(Pareto efficient)
帕累托有效也称“帕累托最优”(Pareto optimum),是指资源配置达到最理想一种状态,只要重新改变资源配置的方式就必然会使一部分人的利益受损。BitTorrent的阻塞算法为达到帕累托有效采取了针锋相对的方式。
2)保证上传能力最大
在技术上,BitTorrent系统中的每个下载者始终与固定数量(一般是4个)的Peers保持连接(unchoked为1)。这种机制使得TCP的拥塞控制能够尽可能地保证整个系统上传能力始终最大(即上传容量达到饱和状态)。
那么问题就是应该与哪些Peers保持unchoked?目前的实现方法是每20秒一个轮询:BitTorrent每隔10秒计算一次哪些是需要被阻塞的Peers,然后保持这种状态直到再次计算。这10秒钟足够使TCP调整它的传输性能,获得最大的上传能力。
3)乐观疏通(optimistic unchoking)
如果仅仅为提供以下载速率为标准向Peers提供上载,就没法发现更好的连接。为此,每个下载者都拥有一个被称为乐观疏通(optimistic unchoking)的连接,这个连接的特点是始终保持数据交互状态。系统每30秒重新进行一次计算,决定哪个连接是“optimistic unchoking”。
4)反对歧视
当一个下载者被与它连接的所有Peers阻塞时,它会保持一个极其低的下载速率,直到通过optimistic unchoking找到更好Peers。为了减少这种情况,如果一段时间后,下载者从某个连接节点处一个片断也没有得到,那么它就认为自己被对方“歧视”了,此时除非对方是optimistic unchoking,否则不再为对方提供上传服务,
5)仅仅上传
当下载者完成下载后,自己也变为种子节点,就无法再通过下载速率来决定提供上传的Peers了。为了最大程度地利用上传带宽,该节点优先选择能从它这里得到最高的上传速率的Peers和那些此刻无人提供上传的Peers。
从前面的分析可知,为了保证文件的快速传输,BT协议采取了对等发布、流水作业、片段选择算法和阻塞算法等技术。但这些技术是针对快速传输普通文件设计的,依据它的片断选择算法策略,所下载的文件片断没有顺序,分布及其分散,而且除非下载完整个文件,用户是没法使用的。因此,利用BitTor-rent协议暂时无法满足追求文件下载顺序的大型文件,这也是以后的一个研究方向。