CTorrent.doc

上传人:sk****8 文档编号:3519830 上传时间:2019-06-01 格式:DOC 页数:81 大小:1.66MB
下载 相关 举报
CTorrent.doc_第1页
第1页 / 共81页
CTorrent.doc_第2页
第2页 / 共81页
CTorrent.doc_第3页
第3页 / 共81页
CTorrent.doc_第4页
第4页 / 共81页
CTorrent.doc_第5页
第5页 / 共81页
点击查看更多>>
资源描述

1、CTorrent 程序源码分析姚旭晨目录CTorrent 程序源码分析 .11. 前言 .31.1 为什么要写这份文档 .31.2 客户端的选择 .31.3 CTorrent 简介 .42. 准备工作 .52.1 知识储备 .52.2 我对本篇源码分析的说明 .53. 总述 .63.1 CTorrent 的命令行参数的意义 .63.2 CTorrent 的状态栏的意义 .63.3 各个类实现的具体实例 .73.4 BT 协议的特性和 CTorrent 的实现情况 .84. 源代码分析 .104.1 ctorrent.cpp .104.2 downloader.cpp.114.3 bencode

2、.h .134.4 bitfield.h.154.4.1 class BitField.154.5 btcontent.h.184.5.1 BTCACHE 结构体 .184.5.2 class btContent.184.6 btfiles.h.304.6.1 Struct BTFILE .304.6.2 Class btFiles.314.7 btrequest.h.354.7.1 class RequestQueue .354.7.2 class PendingQueue .374.8 btstream.h.384.8.1 class btStream .384.9 bufio.h .40

3、4.9.1 class BufIo .404.10 connect_nonb.h .424.11 httpencode.h.424.12 iplist.h.444.12.1 struct _iplist.444.12.2 class IpList .444.13 peer.h.454.13.1 宏 .454.13.2 struct _btstatus .464.13.3 class btBasic.464.13.4 class btPeer:public btBasic .474.14 peerlist.h.564.14.1 struct _peernode.564.14.2 class Pe

4、erList .574.15 rate.h.704.15.1 变量 .704.15.2 函数 .714.16 setnonblock.h .714.17 sigint.h.714.18 tracker.h .724.18.1 宏 .724.18.2 变量 .724.18.3 函数 .745. 后记 .795.1 开源和 BitTorrent,不得不说的话 .795.2 BT 的精神:共享,公平和宽容 .795.3 本篇文档的版权和莫做害群之马 .795.4 我的敬意 .805.5 结语 .80图表目录图表 1 main()函数流程图 .10图表 2 Downloader()函数流程图 .12图

5、表 3 btFiles:_btf_recurses_directory()函数流程图 .33图表 4 btPeer:RequestPiece()函数流程图 .52图表 5 btPeer:Send_ShakeInfo()函数流程图 .55图表 6 PeerList:UnChokeCheck()函数流程图 .61图表 7 算法 1 流程图 .62图表 8 算法 3 流程图 .63图表 9 PeerList:FillFDSET()函数流程图 .66图表 10 PeerList:AnyPeerReady()函数流程图 .68图表 11 btTracker:SendRequest()函数流程图 .77表

6、格目录表格 1 BitField:Except()函数逻辑表 .16表格 2 m_shake_buffer68位填充情况 .191. 前言1.1 为什么要写这份文档BitTorrent 点对点文件传输协议(以下简称 BT 协议)及其客户端应用大行其道的今天,各种各样的客户端不胜枚举(可以参看 http:/wiki.theory.org/BitTorrentApplications) ,而各种各样的 BT 技术论坛讨论的却都是有关客户端软件如何使用的问题,有关底层协议细节和实现方案的讨论少之又少。我碰巧有机会研究过一阵 BT 协议的原理,也看过一部分源代码(CTorrent) ,虽然现在不再继续

7、 BT 方面的研究了,但有感于当初看代码时遇到的资料的匮乏的窘境,便决心把自己的理解和心得写出来,算是自己的一份总结(这也是我的本科毕业论文) ,也希望帮助对 BT 协议实现有兴趣的人尽快上手,少走弯路。有关 BT 协议的论述主要有三篇文章:1,BT 官方网站上的协议解释: http:/www.bittorrent.org/protocol.html。2,Bittorrent Protocol Specification,http:/wiki.theory.org/BitTorrentSpecification。3,Incentives Build Robustness in BitTorre

8、nt,http:/ BT 协议从算法到实现的一个较为简略的描述。为了更深入地理解 BT 协议,自己动手写一个 BT 客户端或阅读一个 BT 客户端的源代码的工作是必不可少的。1.2 客户端的选择Bram Cohen 是 BT 协议的创建者。根据这份协议,他写了 BT 的第一个客户端,也就是BitTorrent 公司的产品:BitTorrent。可以说,BitTorrent 的源码和 BT 协议是门当户对,要理解协议,先从 BitTorrent 的源码开始是最好不过的了。但 Bram Cohen 是用 Python 语言写的 BitTorrent,这给很多不懂 Python 的人(我也在内)带来

9、了很多麻烦:为了看懂一份源码而去新学一份计算机编程语言是不是有些不值得呢?好在 BT 客户端是如此之多,我们有很大的选择空间。除了 Python,还有 Java(主要是Azureus,国外非常流行的多平台的客户端)和 C+(其它大部分客户端)写成的程序。经过多方比较,我选择了 CTorrent 这个客户端。虽然 CTorrent 是用 C+写成的,但仅仅算是一个轻量级(light-weighted)的 C+软件。它的库函数依赖型很小,只用到了 Open SSL库用来计算哈希值,所以可以工作在 Linux, FreeBSD 和 MacOS 平台。CTorrent 没有图形界面,工作在命令行模式。

10、另外,libtorrent(http:/ 用到了很多 C+的模板库(主要是 boost) ,客户端的性能非常好,而且还提供库函数给其它程序调用。只是作者的 C+水平实在太低,对这种重量级的软件掌握不了。1.3 CTorrent 简介CTorrent 是由 YuHong 写的一个 BT 客户端。它的代码大部分都可以看作是 C 代码,只是用到了 C+的类概念,还有一小部分构造函数,析构函数,函数和操作符重载的代码。不懂 C+的人只需有一些 C+的基本知识就完全能看懂源代码了。CTorrent 的主页是http:/,它遵循 GPL。作者在 CTorrent 主页上称自己为 YuHong,这里有一篇他

11、写完 CTorrent 后发的帖子:http:/www.freebsdchina.org/forum/viewtopic.php?p=39082,想必是中国人吧。用户在使用时发现 CTorrent 有一些 bug,一个比较明显的例子是 CTorrent 下载完成后不会立即把缓存中的数据写入硬盘,这样如果按下 Ctrl-C 结束程序的话会造成数据的不完整。CTorrent 的最新版本是 1.3.4(2004 年 9 月 7 日发布) ,作者后面就没有再发布新版本,软件的一些问题也没有得到修正。虽然有一些 bug,但得益于 CTorrent 是开源项目,很快就有人为 CTorrent 写了一些补丁

12、(http:/ 。其中一个叫 Dennis Holmes的人贡献颇多,他为 CTorrent 打了很多 patch,然后重新发布,取名为 Enhanced CTorrent。Enhanced CTorrent 的主页是 http:/ 版本,这个版本配合 Dennis Holmes 用 Perl 写的一个 CTorrent Control Server,可以实现对 Enhanced CTorrent 运行状况的监控。这篇 CTorrent 的源码分析是基于 ctorrent-dhn1.2 版本的,原因是由于我查看 Enhanced CTorrent 较早,那时还没有 ctorrent-dhn2

13、版本,再加上自己偷懒,没有赶在 ctorrent-dhn2发布之前把文章写完比较而言,dnh1.2 版本已经是一个相对稳定的版本了,dnh2 的改进主要是在性能方面,而非 bug fix(容我再强词夺理一句,我简略看过 dnh2 版本的代码,在 dnh1.2 的基础上,看懂 dnh2 是没有问题的) 。另外,Dennis Holmes 虽然重新发布了 CTorrent,但他本人对原作者是极为尊敬的。在他的dnh 版本中,原封不动地保留了原先代码的痕迹,自己的改动也加上了相应的注释。虽然CTorrent 有一些 bug,但正如 Dennis Holmes 所言:谁又说其它客户端没有 bug 呢?

14、我的这篇源码分析也统一称 CTorrent 和 Enhanced CTorrent 为 CTorrent,只有在需要两个版本比较时才区分开来。2. 准备工作2.1 知识储备要看懂 CTorrent 源码和本篇源码分析,读者需要具备如下知识:1,前面列举的 BT 协议的大致了解。2,网络 socket 编程方面的基本知识,主要是 select()函数的使用。3,至少会 C 语言,了解 C+的基本使用方法(主要是类,构造函数,析构函数和重载) 。2.2 我对本篇源码分析的说明1, 源代码中如果出现一些乱码(特别是在终端中查看时) ,设置:$export LANG=C即可看到原作者写的中文注释。2,

15、 源码解说一般采取流程图的形式,有一些函数的具体功能不是很集中,画流程图也表示不出前后联系来,就直接写了步骤分析。有些源码比较晦涩的,会直接分析源代码。3, 源代码中的全部变量都有分析。大部分函数都有说明,少数特别简单的函数和见名知意的函数没有说明。4, 源代码中看似简单的表述实际蕴含着及其严格的操作要求(例如宏 P_HANDSHAKE 的意思是可以进行握手通信了,而不是正在进行握手通信或者已经完成握手通信了) 。所以必须正确理解源代码各个宏,变量,函数的确切含义,才能真正理解程序的流程和作用。5, 分析源码的最终目的是彻底理解 BT 协议的实现结构,以及 BT 通信性能卓越的原因。虽然程序中

16、涉及 BT 协议算法的只有几个函数,但这几个函数是在其它大量代码的基础上构建的。一些有关种子文件的制作和解析的代码虽然看似和 BT 通信关系不大,但若前面的基础没有理解正确,会给后面的算法分析带来很大的麻烦。6, 原作者的 C 语言技巧相当高, enjoy it!7, 本文中“函数”指的是当前正在分析的函数,而“程序”指的是整个 CTorrent 程序。8, 本文中“消息”指的是 peer 发来的固定格式的消息,例如 piece 消息,bitfield 消息等。“数据”指的是客户端要下载的东西,例如一个游戏,一段视频等。9, 英文中种子文件有很多说法,如.torrent file, metai

17、nfo file,本文中均用它们的中文名:种子文件。10, 英文中关于 BT 协议的最小数据单元有很多说法,如 slice,block,subpiece,本文中使用CTorrent 源代码中的说法:slice 。3. 总述3.1 CTorrent 的命令行参数的意义-h/-H:显示帮助命令-x:只解码并显示种子文件信息,不下载。-c:只检查已下载的数据,不下载。-v:打开 debug 调试输出。下载选项:-e int 下载完毕后的做种时间(单位:小时) ,默认为 72 小时。-p port 绑定端口,默认为 2706。-s save_as 重命名下载的文件,若是下载的是多个文件,则 sava_

18、as 是包含多文件的目录。-C cache_size 缓存大小,默认为 16MB。-f 强制做种模式,不进行 SHA1 HASH 检查。-b bf_filename piece 位图文件名,详见 BitField:SetReferFile()。-M max_peers 客户端最多与多少个 peer 通信。-m min_peers 客户端至少与多少个 peer 通信。-n file_number 多文件下,选择哪个文件去下载(例如第二个文件 file_number 就为 2) 。-D rate 限制最大下载速率(单位:KB/s) 。-U rate 限制最大上传速率(单位:KB/s) 。-P pe

19、er_id 客户端通信的 ID,默认为-CD0102- 。下载数据文件示例:ctorrent -s new_filename -e 12 -C 32 -p 6881 eg.torrent制作种子文件示例:ctorrent -t file_to_make.avi -s a.torrent -u protocol:/address/announce3.2 CTorrent 的状态栏的意义CTorrent 运行时输出格式如下:$/ 1/10/40 3/148/148 2MB,1MB | 48,20K/s | 80,40K E:0,1各项意义为:/:表明客户端正在工作的符号,以”- | /”循环。1:

20、种子数目。10:客户端正在通信的非种子的 peer 数目。40:tracker 服务器知道的 peer 数,也是整个 bt 通信群的 peer 数。3:客户端已经下载的 piece 数目。148:数据文件全部的 piece 数目。148:客户端可以得到的 piece 数目,若此数小于全部 piece 数目则不会下载到完整的数据。2MB:客户端已经下载的数据量。1MB:客户端正在上传的数据量。48:客户端的平均下载速率(KB/s) 。20:客户端的平均上传速率(KB/s) 。80:客户端的即时下载速率(KB/s) 。40:客户端的即时上传速率(KB/s) 。0:客户端与 tracker 服务器通

21、信失败的次数。1:客户端与 tracker 服务器通信成功的次数。3.3 各个类实现的具体实例CTorrent 程序使用了 C+面向对象的特性。在程序中有一些类的实例(instance) ,分别代表了一个 BT 通信群中的各个对象。3.3.1 BTCONTENTBTCONTENT 是 btContent 类实现的实例。它在程序中代表种子文件和本地数据文件。3.3.2 PENDINGQUEUEPENDINGQUEUE 是 PendingQueue 类实现的实例。它在程序中代表由于与 peer 的暂时通信中断而搁置等待的 slice 链表的队列。3.3.3 IPQUEUEIPQUEUE 是 IpL

22、ist 类实现的实例。它在程序中代表从 tracker 服务器传来的 peer 列表的链表。3.3.4 SelfSelf 是 btBasic 类实现的实例。它在程序中代表客户端自己。3.3.5 WORLDWORLD 是 PeerList 类实现的实例。它在程序中代表所有正在与客户端通信的 peer 的链表3.3.6 TrackerTracker 是 btTracker 类实现的实例。它在程序中代表 tracker 服务器。3.4 BT 协议的特性和 CTorrent 的实现情况BT 下载之所以性能出众是由 BT 协议所规定的一系列机制所保证的。判断一个 BT 下载软件性能优秀与否则是看这个软件对 BT 协议中下载机制的执行情况。BT 协议主要规定了两大类机制保证其性能(详细信息请参照” Incentives Build Robustness in BitTorrent”):3.4.1 Piece 选择机制3.4.1.1 初始模式(Initial Mode):Random First Piece。当客户端刚开始运行时,它一个完整的 piece 也没有,这时需要尽快下载到一个 piece 以便可以提供上传服务。此时的算法为:第一个随机 piece。客户端会随机找到一个 piece,然后下载。CTorrent 随机选择 piece,而且更进一步采取了一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。