bt下载工具的设计和实现-bittorrent协议对等文件共享协议_第1页
bt下载工具的设计和实现-bittorrent协议对等文件共享协议_第2页
bt下载工具的设计和实现-bittorrent协议对等文件共享协议_第3页
bt下载工具的设计和实现-bittorrent协议对等文件共享协议_第4页
bt下载工具的设计和实现-bittorrent协议对等文件共享协议_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

BT下载工具设计与实现摘要BITTORRENT是当今INTERNET上非常流行的基于P2P技术的内容分发系统,它能够快速、有效地在INTERNET的网络结点上分发大的文件,而不会给源服务器带来过大负载。BITTORRENT协议是一个网络文件传输协议,它能够实现点对点文件分享的技术。BITTORRENT协议是用在对等网络中文件分享的网络协议程序,它是用户群对用户群,下载同一文件的人越多,且下载后,继续维持上传的状态,就可以分享,成为其用户端节点下载的种子文件,下载该档案的速度越快。本文的主要工作内容深入研究了BITTORRENT协议及BITTORRENT协议的工作原理,QT的信号与槽机制,种子文件的解析过程,客户端和TRACKER服务器通信,PEER与PEER之间的通信,DHT网络的实现方法以及BT的关键学法和策略,对软件的系统设计进行论述。关键字BITTORRENT协议;信号与槽机制;TORRENT文件解析;BTDOWNLOADTOOLDESIGNANDREALIZATIONABSTRACTBITTORRENTISVERYPOPULARINTODAYSINTERNETBASEDP2PCONTENTDISTRIBUTIONSYSTEMTECHNOLOGY,ITISABLETOQUICKLYANDEFFICIENTLYDISTRIBUTELARGEFILESOVERTHENETWORKNODESOFTHEINTERNET,RATHERTHANTHESOURCESERVERWILLBRINGEXCESSIVELOADBITTORRENTPROTOCOLISANETWORKFILETRANSFERPROTOCOLTHATENABLESPEERFILESHARINGTECHNOLOGYBITTORRENTPROTOCOLISUSEDINPEERTOPEERNETWORKFILESHARINGNETWORKPROTOCOLPROCEDURES,ITISTHEUSERGROUPFORUSERS,DOWNLOADTHESAMEFILEMOREPEOPLE,ANDAFTERDOWNLOADING,CONTINUETOMAINTAINTHESTATUSOFTHEUPLOAD,YOUCANSHARE,ASITSCLIENTSNODETORRENTFILE,DOWNLOADTHEFILEFASTERTHEMAINCONTENTOFTHEPAPERINDEPTHSTUDYOFTHEWORKINGPRINCIPLEOFTHEBITTORRENTPROTOCOLANDBITTORRENTPROTOCOLFORCOMMUNICATION,DHTNETWORKQTSIGNALSANDSLOTSMECHANISM,THESEEDFILEPARSINGPROCESS,THECLIENTANDSERVERCOMMUNICATIONSTRACKER,PEERANDPEERBETWEENBTSKEYMETHODSANDTHESTUDYOFLAWANDPOLICY,THESYSTEMDESIGNSOFTWAREAREDISCUSSEDKEYWORDSTHEBITTORRENTPROTOCOLSIGNALANDSLOTMECHANISMTORRENTFILEPARSING目录摘要IABSTRACTII1绪论111国内外BITTORRENT的发展状况112发展BITTORRENT的目的和意义1121发展BITTORRENT的目的1122发展BITTORRENT的意义12BITTORRENT的原理分析221综述BITTORRENT的相关技术2211BITTORRENT协议2212BITTORRENT的专业术语2213种子的解析3214BITTORRENT运行原理6215BITTORRENT下载流程7216BITTORRENT协议的发展722BITTORRENT的软件要求8221软件系统设计要求8222软件系统实现83需求分析1031种子文件解析功能分析1032TRACKER服务器功能分析1033TORRENT服务器功能分析1034软件需求分析104概要设计11411种子解析模块11412连接模块11413PEER管理模块11414出错处理模块11415窗口界面模块115详细设计1351系统功能模块1352QT的信号与槽机制1453BT的算法与策略19531阻塞算法19532超级种子算法19533结束算法20534防冷落算法20535最佳无阻塞算法20536最稀有算法2154BT软件的模块的实现21541种子解析模块的实现21542CLIENT与TRACEKER通信模块的实现21543PEER之间的通信模块的实现22544软件出错模块的实现22545下载任务状态的实现22546软件主界面模块的实现2255代码实现24551添加种子代码24552解析种子代码25553PEER通信代码27554窗体中任务代码276系统测试3261测试概述3262测试特性3263测试种类33结论34参考文献35致谢36外文原文37中文翻译491绪论11国内外BITTORRENT的发展状况说到BITTORRENT可能有人还不知道是什么东西,但是说到种子可谓是无人不知无人不晓啊那么在这个下载过程是通过什么支撑的,或者说下载客户端与服务器之间是怎么预定通信的呢,那就是BITTORRENT协议,用来进行对种子文件管理和规范。BITTORRENT协议是一个网络文件传输协议,它能够实现点对点文件分享的技术。比起其他点对点的协议,它更有多点对多点的特性,这个特点简单的说就是下载的人越多,速度越快。下载完不马上关闭BITTORRENT软件,就可以成为种子即拥有完整的档案者分流让其他人下载,或者说BITTORRENT一种分发文件的协议。它通过URL来识别内容,并且可以无缝的和WEB进行交互。它基于HTTP协议,它的优势是如果有多个下载者并发的下载同一个文件,那么,每个下载者也同时为其它下载者上传文件,这样,文件源可以支持大量的用户进行下载,而只带来适当的负载的增长。12发展BITTORRENT的目的和意义121发展BITTORRENT的目的BITTORRENT是一种P2P模式,对于P2P模式相对C/S模式,具有很多优点,但是随着P2P应用的不断增多,P2P技术也开始面临一些问题,例如路由效率低下、维护开销过大、系统稳定性差、安全性无法保证以及服务不可靠等问题。因此,在提高现有P2P网络资源定位的效率,降低其维护开销,增强P2P系统的稳定与安全性,提高P2P各个节点提供服务的可靠性等方面都需要做深入的研究。深入研究P2P资源定位技术有重要的理论和现实意义。一方面,随着P2P应用的不断增长,P2P资源定位技术遇到的一系列问题迫切需要我们对它进行更加深入的研究,这将有助于它的进一步推广和使用另一方面,把P2P资源定位技术与其它的技术相结合,可以达到相互促进的效果,如把P2P资源定位技术引入到通讯领域,把P2P资源定位技术与网格技术相结合,都可以促进彼此的发展。122发展BITTORRENT的意义发展BITTORRENT的意义对于大多数网民是不言而喻的。在平时的生活或学习大多数下载是下载一些音乐,电影和一些软件,尤其是电影,现在是已经进入了高清时代,一部高清电影动辄几个G,在中国的平均网速相对发达国家相对较低的情况下,在以前没有BT技术前,要下载高清电影简直是想都不敢想,占有很高的带宽,文件大,下载时间延长,势必会影响其他工作,而有了BT的迅速发展,通过互联网用户下载这个影片的数量大大加增,下载用户越多,速度越快甚至有些公司提供离线下载服务,公司通过强大的服务器先通过BITTORRENT协议把文件先下载到公司服务器,然后用户再从服务器取回到本地,可靠且速度快。BITORRENT技术广泛应用与电视直播,网络视频和在线游戏中。很多网络游戏的在线更新,比如说如魔兽世界就是采用BT的技术,所以当每次有改版时,动辄数百MB的更新包,通过游戏厂商所提供的更新程序,以BITTORRENT协议的方式进行下载分流。这为以往的其他种在线游戏,每次重大改版就必须重新压制光盘,或是等待单一下载点的下载方式,带来另一种节省成本的经营模式。2BITTORRENT的原理分析21综述BITTORRENT的相关技术211BITTORRENT协议对于普通的HTTPFTP下载使用TCP/IP协议,BITTORRENT协议是架构于TCP/IP协议之上的一个P2P文件传输协议,处于TCP/IP结构的应用层。BITTORRENT协议本身也包含了很多具体的内容协议和扩展协议,并在不断扩充中。根据BITTORRENT协议,文件发布者会根据要发布的文件生成提供一个TORRENT文件,即种子文件,也简称为“种子”,可以通过一些种子软件进行种子文件生成。种子文件本质上是文本文件,文本的内容包含TRACKER信息和文件信息两部分。TRACKER信息主要是BT下载中需要用到的TRACKER服务器的地址和针对TRACKER服务器的设置,也就是下载软件通过解析种子文件,通过TRACKER信息然后和TRACKER建立连接,进行通信,从服务器获取到PEER的列表,即你从其他客户端下载文件时建立连接需要的信息,同时也把你的主机的信息上传到TRACKER供其他客户端下载。文件信息是根据对目标文件的计算生成的,即根据BITTORRENT协议内的BENCODE规则进行提供下载文件进行编码。主要是把提供下载的文件虚拟分成大小相等的块,块大小必须为2K的整数次方,由于是虚拟分块,硬盘上并不产生各个块文件,并把每个块的索引信息和HASH验证码写入种子文件中,确保块不被重复下载所以,种子文件就是被下载文件的“索引”。下载时,BT客户端首先解析种子文件得到TRACKER地址,然后连接TRACKER服务器。TRACKER服务器回应下载者的请求,提供下载者其他下载者包括发布者的IP。下载者再连接其他下载者,根据种子文件,两者分别告知对方自己已经有的块,然后交换对方所没有的数据。此时不需要其他服务器参与,分散了单个线路上的数据流量,因此减轻了服务器负担。下载者每得到一个块,需要算出下载块的HASH验证码与种子文件中的对比,如果一样则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容准确性的问题。一般的HTTP/FTP下载,发布文件仅在某个或某几个服务器,下载的人太多,服务器的带宽很易不胜负荷,变得很慢。而BITTORRENT协议下载的特点是,下载的人越多,提供的带宽也越多,下载速度就越快。同时,拥有完整文件的用户也会越来越多,使文件的“寿命”不断延长。为了解决某些用户“下完就跑”的现象,在非官方BITTORRENT协议中还存在一种慢慢开放下载内容的超级种子的算法。212BITTORRENT的专业术语TRACKER收集下载者信息的服务器,并将此信息提供给其他下载者,使下载者们相互连接起来,传输数据。种子指一个下载任务中所有文件都被某下载者完整的下载,此时下载者成为一个种子。发布者本身发布的文件就是原始种子。也指TORRENT文件。做种发布者提供下载任务的全部内容的行为;下载者下载完成后继续提供给他人下载的行为。213种子的解析如图所示为种子文件内容。图21BT种子文件结构图BT种子文件使用了一种叫BENCODING的编码方法来保存数据。BENCODING现有四种类型的数据STRINGS字符串,INTEGERS整数,LISTS列表,DICTIONARIES字典1STRINGS字符串编码为例如4TEST表示为字符串“TEST“,表示长度为4个字节的字符串TESTSTRINGS类型是没有没开始或结束标记2INTEGERS整数编码为IE开始标记I,结束标记为E例如I1234E表示为整数1234I1234E表示为整数1234整数没有大小限制3LISTS列表编码为LE开始标记为L,结束标记为E列表里可以包含任何BENCODING编码类型,包括整数,字符串,列表,字典。例如L4TEST5ABCDEE表示为二个字符串“TEST“,“ABCDE“4DICTIONARIES字典编码为DE开始标记为D,结束标记为E关键字必须为BENCODING字符串值可以为任何BENCODING编码类型例如D3AGEI20EE表示为“AGE“20D4PATH3C“8FILENAME8TESTTXT表示为“PATH“C“,“FILENAME“TESTTXT“5具体文件结构如下全部内容必须都为BENCODING编码类型。整个文件为一个字典结构,包含如下关键字ANNOUNCETRACKER服务器的URL字符串ANNOUNCELIST可选备用TRACKER服务器列表列表CREATIONDATE可选种子创建的时间,UNIX标准时间COMMENT可选备注字符串CREATEDBY可选创建人或创建程序的信息字符串INFO一个字典结构,包含文件的主要信息,分为单文件结构或多文件结构。单文件结构LENGTH文件长度,单位字节整数MD5SUM可选长32个字符的文件的MD5校验字符串NAME文件名字符串PIECELENGTH每个块的大小,单位字节整数PIECES每个块的20个字节的SHA1HASH的值二进制格式多文件结构如下FILES一个字典结构LENGTH文件长度,单位字节整数MD5SUM可选同单文件结构中相同PATH文件的路径和名字,是一个列表结构NAME最上层的目录名字字符串PIECELENGTH同单文件结构中相同PIECES同单文件结构中相同综上,多文件TORRENT的结构的树形图。图22多文件结构图图23单文件结构图214BITTORRENT运行原理BT原理普通的HTTP/FTP下载使用TCP/IP协议,BITTORRENT协议是架构于TCP/IP协议之上的一个P2P文件传输协议,处于TCP/IP结构的应用层。BITTORRENT协议本身也包含了很多具体的内容协议和扩展协议,并在不断扩充中。根据BITTORRENT协议,文件发布者会根据要发布的文件生成提供一个TORRENT文件,即种子文件,也简称为“种子”。TORRENT文件本质上是文本文件,包含TRACKER信息和文件信息两部分。TRACKER信息主要是BT下载中需要用到的TRACKER服务器的地址和针对TRACKER服务器的设置,文件信息是根据对目标文件的计算生成的,计算结果根据BITTORRENT协议内的B编码规则进行编码。它的主要原理是需要把提供下载的文件虚拟分成大小相等的块,块大小必须为2K的整数次方,由于是虚拟分块,硬盘上并不产生各个块文件,并把每个块的索引信息和HASH验证码写入TORRENT文件中;所以,种子文件就是被下载文件的“索引”。下载者要下载文件内容,需要先得到相应的TORRENT文件,然后使用BT客户端软件进行下载。下载时,BT客户端首先解析TORRENT文件得到TRACKER地址,然后连接TRACKER服务器。TRACKER服务器回应下载者的请求,提供下载者其他下载者(包括发布者)的IP。下载者再连接其他下载者,根据TORRENT文件,两者分别对方告知自己已经有的块,然后交换对方没有的数据。此时不需要其他扮演服务器参与,分散了单个线路上的数据流量,因此减轻了服务器负担。下载者每得到一个块,需要算出下载块的HASH验证码与TORRENT文件中的对比,如果一样则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容准确性的问题。一般的HTTP/FTP下载,发布文件仅在某个或某几个服务器,下载的人太多,服务器的带宽很易不胜负荷,变得很慢。而BITTORRENT协议下载的特点是,下载的人越多,提供的带宽也越多,种子也会越来越多,下载速度就越快。而有些人下载完成后关掉下载任务,提供较少量数据给其他用户,为尽量避免这种行为,在非官方BITTORRENT协议中存在超级种子的算法。这种算法允许文件发布者分几步发布文件,发布者不需要一次提供文件所有内容,而是慢慢开放的下载内容的比例,延长下载时间。此时,速度快的人由于未下载完必须提供给他人数据,速度慢的人有更多机会得到数据。215BITTORRENT下载流程在整个下载过程,TRACKER服务器一个不可缺少的角色,它不同的下载者之间搭了一个桥梁,下载者在下载开始以及下载进行的过程中,要不停的与TRACKER服务器进行通信,以汇报自己的信息,并获取其它下载CLIENT的信息。这种通信是通过HTTP协议进行的,又被称为TRACKERHTTP协议,它的过程是这样的CLIENT向TRACKER发一个HTTP的GET请求,并把它自己的信息放在GET的参数中;这个请求的大致意思是我是XXX,我想下载YYY文件,我的IP是AAA,我用的端口是BBB。TRACKER对所有下载者的信息进行维护,当它收到一个请求后,首先把对方的信息记录下来,如果已经记录在案,那么就检查是否需要更新,然后将一部分,并非全部,根据设置的参数已经下载者的请求参与下载同一个文件,一个TRACKER服务器可能同时维护多个文件的下载,的下载者的信息返回给对方。CLIENT在收到TRACKER的响应后,就能获取其它下载者的信息,那么它就可以根据这些信息,与其它下载者建立连接,从它们那里下载文件片断。216BITTORRENT协议的发展最新的DHT网络技术,使得无TRACKER下载成为可能。DHTDISTRIBUTEDHASHTABLE,分布式哈希表类似TRACKER的根据种子特征码返回种子信息的网络。DHT全称叫分布式哈希表DISTRIBUTEDHASHTABLE,是一种分布式存储方法。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。新版BITCOMET允许同行连接DHT网络和TRACKER,也就是说在完全不连上TRACKER服务器的情况下,也可以很好的下载,因为它可以在DHT网络中寻找下载同一文件的其他用户。有些软件比特精灵还会自动通过DHT搜索种子资源,构成种子市场。这种技术好处十分明显,就是大大减轻了TRACKER的负担。用户之间可以更快速建立通讯。对越每一个连入DHT网络的计算机就称为一个网络节点,每一个节点,都会得到一个独一无二的ID,相当于DHT网络的身份表示,当然这个ID的计算方法有很多种方法,所以就有各种各样的DHT的实现方式,其中最自然的一种方法就是用他公网上的IP来做ID的计算原形,因为每个主机的IP地址这是独一无二的也是个唯一标示,当然一个计算机也可能有多个网卡,在DHT网络中每一个节点保存了带下载的一部分的资源那么,整个DHT的网络就是一个大的容器,里面存放了一定的资料,即整个DHT网络保存着待下载软件的所有内容,对于网络中的节点资源是共享的,但由于数据在各个节点上是分散的,每个节点上的资源还会变化,所以问题来了,如何找到特定的资源存在于某个节点上,好去索取。在此之前,曾经有许多的方法,来解决这个,问题比如最早的NAPSTER,就是一个巨大的集中式索引服务器,里面存放了所有的资源的位置,这是一个很直观的解决方案,通过索引来查找资源,但是简单的方法虽然有效,也很脆弱,比如他的服务器万一挂掉了,整个NAPSTER网络就完蛋了,而且,所有的资源在一起,整个服务器的负担随着资源的增多而越来越多,最后臃肿不堪,所以后来就出现了另一种解决方案,叫做全分布式非结构化网络,走了另一个极端,完全不要中心服务器,每一个节点维护一个邻居列表,类似路由器中路由表,告诉你下载的资源到哪去找,这样如果要找一个东西就问邻居,邻居再问邻居,只要有,总有一天被问到答案,这就是泛洪式搜索,的确在网络路由上掀起了一片数据洪水,最有名的就是GNUTELLA协议,当初我在分析SHAREAZA的时候就遇到这个协议了,当时一头雾水,现在看来这个协议还被做为BT协议的一个补充在被使用着还有一种解决方案就是综合上述两者的优点,设置一些超级节点,这些节点就好象NAPSTER上的中心服务器,里面存放了大量的索引信息,这就叫做半分布式结构,现在流行的BT就是这种技术,混血的就是强大。我这里讲的DHT却是一个完全分布式结构化拓扑网络,是一个完全不需要中心服务器的网络拓扑,然而比非结构化的要有更好的搜索机制,不用泛洪,目前没有BT应用的那么广,不过大家应该注意到了BT和电骡都先后加入了DHT网络,说明这个网络还是很有潜力的,作为BT或者电骡协议的一种补充手段,让你下载的时候,能够找到更多的源,提升了性能,而且完全不需要中心服务器,也是他的一个优点,这个网络有这样的功能,因为他是凝聚了一定的智慧的,不是象上面的那些都是很直观的解决方案,所以他们都不够强大DHT利用了一个小聪明,把节点的ID给利用了起来,简单的说,就是把要找的资源,通过HASH算法得到一个规范的KEY,把这个KEY和资源合在一起,就是一个信息,把这个信息放在和KEY一样或者“距离“最近的那个ID节点上,这样你知道自己要找什么,用HASH算法得到KEY,然后就在DHT网络里发布搜索信息,指明要和KEY一样的ID的节点,由于每一个节点都维护了一个其他节点的表,所以很快就能找到所要的东西,研究表明,找到所花费的寻址路径长度和每个节点所保存的邻居节点的个数有渐进曲线关系,所以只要说到这一层DHT的奥秘就一目了然了。22BITTORRENT的软件要求221软件系统设计要求设计一款功能齐备的BITTORRENT下载软件,具体要求如下1能够实现对TORRENT文件的解析并且显示出来2实现对任务的添加,开始,暂停,删除3实现多任务多线程下载4实现对种子文件的管理222软件系统实现软件开发方法采用面向对象技术开发方法开发语言C开发集成环境QTCREATOR使用C作为开发语言,QT作为IDE,对BITTORRENT下载过程进行抽象出具体的类。比如任务,种子,TRACKER等等。3需求分析31种子文件解析功能分析32TRACKER服务器功能分析TRACKER服务器是BT下载中必须的角色。一个BTCLIENT在下载开始以及下载进行的过程中,要不停的与TRACKER服务器进行通信,以报告自己的信息,并获取其它下载CLIENT的信息。这种通信是通过HTTP协议进行的,又被称为TRACKERHTTP协议,它的过程是这样的CLIENT向TRACKER发一个HTTP的GET请求,并把它自己的信息放在GET的参数中;这个请求的大致意思是我是XXX,我想下载YYY文件,我的IP是AAA,我用的端口是BBB。TRACKER对所有下载者的信息进行维护,当它收到一个请求后,首先把对方的信息记录下来(如果已经记录在案,那么就检查是否需要更新),然后将一部分(并非全部,根据设置的参数已经下载者的请求)参与下载同一个文件(一个TRACKER服务器可能同时维护多个文件的下载)的下载者的信息返回给对方。CLIENT在收到TRACKER的响应后,就能获取其它下载者的信息,那么它就可以根据这些信息,与其它下载者建立连接,从它们那里下载文件片断。33TORRENT服务器功能分析TORRENT服务器是也是BT下载中必须的角色。TORRENT服务器也就一个PEER服务器,当PEER服务器从TRACKER服务器拿到PEER列表名单的时候,开始和其他PEER服务器创建连接,并且不断和彼此进行通信和交换。它的过程是这样的TORRENT服务器向另一个TORRENT服务器发送消息,这个消息的大致意思是我是XXX,我已经下载过YYY文件或片段,你可以从我这里直接下载。然后另一个TORRENT服务器也向发送消息,大致意思是我这里也有下载一些片段,你看看哪些片段你没下载过,你可以下载。34软件需求分析通过可行性研究报告通过不同的角度判断软件的开发可行性,在确定软件开发可行的情况下,我们需要对软件需要实现的各个功能进行详细分析。对于软件开发周期中,需求分析阶段是一个很重要的阶段,因为连需求不明确,怎么才能开发出符合客户需求的软件,在这一阶段做得好,将为整个软件开发项目的成功打下良好的基础。我们必须明确我们要做什么。我们要实现这几个模块种子的解析,连接模块,PEER管理,出错管理,任务界面管理。4概要设计411种子解析模块1对种子文件进行解析,获得TRACEKER服务器的地址,待下载文件的文件名和长度,PIECE长度和各个PIECE的HASH值。2实现对种子文件中下载多个文件的解析。412连接模块1连接TRACEKER,根据HTTP协议构造获取PEER地址的请求,与TRACEKER建立连接,解析TRACEKER的响应信息,从而获取各个PEER的IP地址和端口号。413PEER管理模块1对下载下来的数据进行HASH校验,判断是否已经下载过该PIECE。2根据PEER的IP地址和端口号连接PEER,从PEER处下载数据并且将已经下载的数据上传给其他用户。414出错处理模块1出错处理,在软件使用的过程中可能出现各种意想不到大错误,所有要定义整个系统可能出现的错误类型,并且对错误进行相应的提示或捕获处理。415窗口界面模块1本软件的窗口包括一个带有菜单栏,工具栏和状态栏的主窗口,主窗口又分为任务树和任务列表两个视图。用户可以通过任务树或者任务表对结点进行添加,删除等操作,也可以对任务进行分类,实现对资源的管理。图41任务树图图42任务表图5详细设计51系统功能模块本软件的模块大致如下。客户端主要包括种子解析,连接管理,片段管理,出错管理,窗口管理。PEER之间PEER通信主要是通过TRACKER服务器来确定和谁通信,而TRACKER服务对PEER的下载信息进行维护。图51系统功能图图52BITTORRENT工作原理52QT的信号与槽机制QT是一个跨平台的CGUI应用构架,它提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组件编程等特点,更为引人注目的是目前LINUX上最为流行的KDE桌面环境就是建立在QT库的基础之上。QT支持下列平台MS/WINDOWS95、98、NT和2000;UNIX/X11LINUX、SUNSOLARIS、HPUX、DIGITALUNIX、IBMAIX、SGIIRIX;EMBEDDED支持FRAMEBUFFER的LINUX平台。伴随着KDE的快速发展和普及,QT很可能成为LINUX窗口平台上进行软件开发时的GUI首选。信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C语言,因此要正确的处理信号和槽,必须借助一个称为MOC(METAOBJECTCOMPILER)的QT工具,该工具是一个C预处理程序,它为高层次的事件处理自动生成所需要的附加代码。在我们所熟知的很多GUI工具包中,窗口小部件WIDGET都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生COREDUMPS。所有从QOBJECT或其子类例如QWIDGET派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射EMIT出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。信号与槽的定义槽用来接收信号,可以被看作是普通成员函数,可以被直接调用。支持PUBLIC,PROTECTED,PRIVATE修饰,用来定义可以调用连接到此槽的范围。PUBLICSLOTSVOIDTESTSLOTCONSTQSTRING信号只需要声明信号名与参数列表即可,像是一个只有声明没有实现的成员函数。SIGNALSVOIDTESTSIGNALCONSTQSTRINGQT会在MOC的CPP文件中实现它。下面代码中调用ACTIVATE的第三个参数是类中信号的序列号。VOIDCTESTOBJECTTESTSIGNALCONSTQSTRINGQMETAOBJECTACTIVATETHIS,信号槽的连接与触发通过调用CONNECT函数建立连接,会把连接信息保存在SENDER对象中;调用DESCONNECT函数来取消。CONNECT函数的最后一个参数来用指定连接类型。STATICBOOLCONNECTCONSTQOBJECTSENDER,CONSTQMETAMETHOD一切就绪,发射在SENDER对象中调用EMITTESTSIGNAL“TEST”DEFINEEMIT上面代码可以看到EMIT被定义为空,这样在发射信号时就相当于直接调用QT为我们MOC出来的函数TESTSIGNALCONSTQSTRING/DETERMINEIFTHISCONNECTIONSHOULDBESENTIMMEDIATELYOR/PUTINTOTHEEVENTQUEUEIFCCONNECTIONTYPEQTAUTOCONNECTIONCONTINUEIFNDEFQT_NO_THREADELSEIFCCONNECTIONTYPEQTBLOCKINGQUEUEDCONNECTIONLOCKERUNLOCKIFRECEIVERINSAMETHREADQWARNING“QTDEADLOCKDETECTEDWHILEACTIVATINGABLOCKINGQUEUEDCONNECTION“SENDERISSP,RECEIVERISSP“,SENDERMETAOBJECTCLASSNAME,SENDER,RECEIVERMETAOBJECTCLASSNAME,RECEIVERQSEMAPHORESEMAPHOREQCOREAPPLICATIONPOSTEVENTRECEIVER,NEWQMETACALLEVENTCMETHOD_OFFSET,CMETHOD_RELATIVE,CCALLFUNCTION,SENDER,SIGNAL_ABSOLUTE_INDEX,0,0,ARGVARGVEMPTY_ARGV,SEMAPHOREACQUIRELOCKERRELOCKCONTINUEENDIFQT对象所属线程的概念这里要引入QOBJECT的所属线程概念,看一下QOBJECT的构造函数(随便选择一个重载)就一目了然了。如果指定父对象并且父对象的当前线程数据有效,则继承,否则把创建QOBJECT的线程作为所属线程。QOBJECTQOBJECTQOBJECTPARENTD_PTRNEWQOBJECTPRIVATEQ_DQOBJECTD_PTRQ_PTRTHISDTHREADDATAPARENTDTHREADDATAREFIFPARENTQT_TRYIFCHECK_PARENT_THREADPARENT,PARENTPARENTD_FUNCTHREADDATA0,DTHREADDATAPARENT0SETPARENTPARENTQT_CATCHDTHREADDATADEREFQT_RETHROWQT_ADDOBJECTTHIS通过ACTIVATE的代码可以看到,除了信号触发线程与接收者线程相同的情况能直接调用到SLOT,其它情况都依赖事件机制,也就是说RECEIVER线程必须要有QT的EVENTLOOP,否则SLOT函数是没有机会触发的当我们奇怪为什么信号发出SLOT却不被触发时,可以检查一下是否涉及到跨线程,接收者的线程是否存在激活的EVENTLOOP。所幸,我们可以通过调用QOBJECT的方法MOVETOTHREAD,来更换对象的所属线程,将有需求接收信号的对象转移到拥有消息循环的线程中去以确保SLOT能正常工作。有一个和对象所属线程相关的坑QOBJECTDELETELATER。从源码可以看出,这个调用也只是发送了一个事件,等对象所属线程的消息循环获取控制权来处理这个事件时做真正的DELETE操作。所以调用这个方法要谨慎,确保对象所属线程具有激活的EVENTLOOP,不然这个对象就被泄露了VOIDQOBJECTDELETELATERQCOREAPPLICATIONPOSTEVENTTHIS,NEWQEVENTQEVENTDEFERREDDELETE强制线程切换当对象中的一些接口需要确保在具有消息循环的线程中才能正确工作时,可以在接口处进行线程切换,这样无论调用者在什么线程都不会影响对象内部的操作。下面的类就是利用信号槽机制来实现线程切换与同步,所有对TESTMETHOD的调用都会保证执行在具有事件循环的线程中。CLASSCTESTOBJECTPUBLICQOBJECTQ_OBJECTPUBLICCTESTOBJECTQOBJECTPARENTNULLQOBJECTPARENT/把自己转移到带有事件循环的QTHREADTHISMOVETOTHREAD/外部调用一律通过信号槽转移到对象内部的工作线程/连接类型选择为QTBLOCKINGQUEUEDCONNECTION来达到同步调用的效果。CONNECTTHIS,SIGNALSIGNALTESTMETHODCONSTQSTRINGM_WORKTHREADSTARTCTESTOBJECTVOIDTESTMETHODCONSTQSTRINGELSE/通过发送信号,实现切换线程处理EMITSIGNALTESTMETHODSTRARGSIGNALSVOIDSIGNALTESTMETHODCONSTQSTRINGPRIVATESLOTSVOIDSLOTTESTMETHODCONSTQSTRING53BT的算法与策略531阻塞算法BT并不集中分配资源。每个PEER自己有责任来尽可能的提高它的下载速率。PEERS从它可以连接的PEERS处下载文件,并根据对方提供的下载速率给予同等的上传回报。对于合作者,提供上传服务,对于不合作的,就阻塞对方。所以说,阻塞是一种临时的拒绝上传策略,虽然上传停止了,但是下载仍然继续。在阻塞停止的时候,连接并不需要重新建立。每个客户端一直与固定数量的PEER保持疏通,通常情况下是4个,严格地根据当前的下载速度来决定哪些PEER应该保持疏通,通过计算最近10秒从每个PEER处下载数据的速度来计算下载速度,如果只是简单地为提供最高下载速率的4个PEER提供上载服务,那么就没有办法发现那些空闲的连接是否有更好的下载速度,为了解决这个问题,在任何时候,每个PEER都拥有一个成为OPTIMISTICUNCHOKING优化非阻塞,这个连接总是疏通状态,而不管它的下载速率是多少,每隔30秒,重新选择一个PEER作为优化非阻塞的PEER,一旦某一个PEER完成了下载,它不能再通过下载速率来决定哪些PEER提供上载了。目前采用的解决办法是优先选择那些从它这里得到更好下载速率的PEER,保持与它们的疏通,这样做的理由是尽可能的利用上载带宽,一旦某一个PEER完成下载,那么它也就成为了种子。532超级种子算法超级种子概念不是老版本BT协议的一部分。S55中的超级种子的概念是为帮助那些自身带宽有限(对支持大的TORRENT来说)的发起者而设计的一种新的做种算法,它能使发起者减少需要上传的数据量以便SPAWNNEWSEEDSINTHETORRENT。当一个做种的CLIENT进入了超级种子模式,它的行为将不同于普通的做种者,而是扮成一个不拥有任何数据的普通CLIENT。当其他的CLIENT和它建立连接之后,它将通知这些CLIENTS自己收到了一个从未被发送过的PIECE(所有PIECE都被发送过的情况是很罕见的),这就使得CLIENTS只试图下载这一个PIECE(而没有其他想法)。当CLIENTS下载完这个PIECE后,超级种子不再通知他们下载其他的PIECES直到它看到刚刚传送的那一个PIECE已经被至少一个其他的CLIENT提供下载。因此在那之前,CLIENTS都不会访问超级种子的其他PIECES,这样就节省了超级种子的带宽。这种方法将提高做种的效率,既让PEERS去下载最稀有的数据(降低了传送的多余数据量),又限制了传送给PEERS的对SWARM没有任何贡献的数据量。这种算法未出现之前,一个种子在其他CLIENT成为种子之前,可能需要上传150200于TORRENT的数据量。而现在,一个运行在超级种子模式下的CLIENT(对一个大的TORRENT做种),只需要上传105于TORRENT的数据量。这相当于一个普通种子做种效率的150200。但是,在通常情况下不建议使用超级种子模式。虽然它有助于稀有数据的分发(因为它对CLIENT的下载选择做出了限制,同时也限制了CLIENTS下载已经部分得到的数据),所以超级种子模式只适用于那些最初做种的SERVER。533结束算法当下载将要结束时,将会趋向最后的几个PIECESECTIONS下载减慢,为了加速下载,客户端向所有PEERS发送请求下载其没有的PIECE。为了保证传输过多的冗余数据而到是性能下降,客户端一旦收到PIECESECTIONS,向所有的其他PEERS发送CANCEL消息。至于什么时候启动ENDGAME算法。规范没有给出推荐值。534防冷落算法偶然情况下,BT的PEER端可能会被它下载的所有的PEERS端阻塞。这种情况下,此PEER端的下载速率就很低,直到优化UNCHOCK算法找到更好的PEERS端。为了消除这个问题,当超过一分钟一个PEER没有从特定的PEER得到一个PIECE那么BT就认为它被那个PEER冷落。并不上传给它直到优化UNCHOKE(这是对于上述的优化UNCHOCKE算法的一个例外),这就常常会使多于一个PEERS同时进入优化UNCHOKE状态。从而使下载速率快速恢复。535最佳无阻塞算法当同一时刻通过多个连接发送数据时,TCP拥塞控制的效果很差。这样,CHOKING就允许PEERS使用一种TITFORTATISH算法来确保他们获得一个稳定的下载速率。下面介绍的CHOKING算法是目前BT客户端中所广泛采用的。很重要的一点是,所有新的算法既能用在包含他们全部的网络上,也能用在只包含此算法的网络上。好的CHOKING算法应该满足如下准则1为了获得好的TCP性能,它应限制同时上传的数量;2应避免阻塞和非阻塞状态的频繁切换(FIBRILLATION);3应该酬谢让自己下载的PEER,为它提供上载;4当发现更好的连接(相对于当前的连接)的时候,试图启用他们,称作OPTIMISTICUNCHOKING。目前使用的CHOKING算法中避免FIBRILLATION(抖动)的唯一策略是每10秒更新被阻塞的PEERS。酬谢(RECIPROCATION)和限制上传的数目通过解除(对自己感兴趣的且拥有最好的上载速率的)4个PEERS的阻塞来管理。这样可以获得最大的下载速率。而这四个PEERS因对己感兴趣而成为下载者。拥有更好的上载速率(相对于下载者而言)但对自己不感兴趣的PEER被阻塞,但一旦当它对自己感兴趣,则阻塞上载速率最慢的下载者,使其取而代之成为新的下载者。如果一个CLIENT拥有完整的资源文件,则它将根据上载速率而不是下载速率来决定阻塞哪些PEER。对于OPTIMISTICUNCHOKED,在任意时刻都会有一个不被阻塞的PEER而不管它的上载速率如何(如果它对自己感兴趣,则成为4个下载者中的一员),至于哪一个PEER被OPTIMISTICUNCHOKED,会每30秒更新一次。最新连接的PEER成为OPTIMISTICUNCHOKED的可能性是其他PEERS的3倍,这将给他们一个很好的机会去完成一个PIECE的上载。536最稀有算法BT中下载PIECE策略为,最稀少最优先原则。每个PEER都优先选择整个系统中最少的那些片断去下载,而那些在系统中相对较多的片断,放在后面下载,这样,整个系统就趋向于一种更优的状态。如果不用这种算法,大家都去下载最多的那些片断,那么这些片断就会在系统中分布的越来越多,而那些在系统中相对较少的片断仍然很少,最后,某些PEER就不再拥有其它PEER感兴趣的片断了,那么系统的参与者越来越少,整个系统的性能就下降。客户端通过保留每个PEER端的原始BITFIELD域来决定下载在BITFIELD里面出现频率最小的PIECE。程序的具体实现是通过HAVE消息来计算。在下载过程中,会不停的收到其它PEER发来的HAVE消息,每个HAVE消息都表明对方拥有了某个片断(即某个完整的PIECE)。那么,为每个片断维护一个计数器,每收到一个HAVE消息,相应的计数器加1。在选择片断的时候,计数器最小的某个片断被选中。“最少优先”的一个例外是在下载刚开始的时候。此时,下载者没有任何片断可供上传,所以,需要尽快的获取一个完整的片断。而最少的片断,通常只有某一个PEER拥有,所以,它可能比多个PEERS都拥有的那些片断下载的要慢。因此,第一个片断是随机选择的,直到第一个片断下载完成,才切换到“最少优先”的策略。54BT软件的模块的实现541种子解析模块的实现根据种子文件的结构信息,我门可以构造文件的实体类,种子文件也可以被称为元信息文件,它是通过B编码,就是一个B编码的字典。因为在下载的文件可能是单个文件也有可能是多个文件,所以定义一个单文件结构体METAINFOSINGLEFILE,包含有长度,MD5,名字,还有PIECE的长度等属性,然后再定义一个结构体为多文件结构体METAINFOMULTIFILE。对于种子文件我们相应的定义一个METAINFO,这个类保存种子的信息。TORRENT说白就是个文本文件,对这文本文件读取保存到一个字节数组里面,METAINFO通过调用PARSEQBYTEARRAY方法对字节数组进行解析,之后种子的所有信息就保存到一个METAINFO对象中。542CLIENT与TRACEKER通信模块的实现解析完种子文件以后,种子的所有信息保存在实体类里面,可以通过类里面的一些方法获取种子的信息,完成种子的解析后,可以从中获取到TRACKER服务器的URI后就可以开始和TRACKER进行交互,在与TRACEKER连接之后,TRACKER可以对一些自己下载进度进行统计,并且客户端可以获取到当前下载同一文件的PEER的IP地址和端口号。BITTORRENT协议是在TCP/IP协议之上的应用层协议,客户端使用HTTP协议与TRACKER进行通信,TRACKER通过HTTPGET方法获取请求,然后TRACKER服务器返回信息,返回信息是一个经过B编码的字典,包含着可以下载的PEER的IP地址和端口号,和一些PEER的长度等信息,然后客户端可以根据返回信息进行连接下载PEER,并且在客户端下载完成PEER以后,把相应的信息提交DAOTRACKER服务器,其他客户端可以根据TRACKER服务器上面的信息得到你的IP地址和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论