1.引言

BitTorrent下载,俗称BT下载,自2002年由美国加州计算机程序员布拉姆•科恩开发出来以后,迅速在网络中流行,是目前应用较广的一种P2P下载技术。和传统的http下载、ftp下载相比,BT下载最大的特点是:可将要下载的文件进行分片,当很多人同时下载一个文件时,他们之间可互相为对方提供文件的部分片段,供对方下载。每个下载者既扮演客户端的角色(下载),又扮演服务器的角色(上传),体现了P2P中“我为人人,人人为我”的对等思想。
2.BT下载模型概述
BT下载中的所有实体以及实体之间为了完成文件下载功能而进行的交互中所遵循的技术规范统称为BT下载模型。
BT模型需要以下实体:
(1) 一个静态元信息(metainfo)文件(扩展名为.torrent) ,被称为“种子”(seed)。种子文件里主要包含文件名、大小、分片信息和文件散列信息以及指向Tracker的URL等内容。 
(2) 一个普通的Web 服务器。可以是互联网上任意的可以发布种子文件的服务器。
(3) 一个追踪服务器(Tracker)。追踪服务器(Tracker)与客户端联系,提供下载同一文件的其它节点(peers)的信息。
(4) 一个文件发布者。文件发布者是目标文件的最先拥有者和提供者。
(5) 运行BT客户端程序的下载终端,被称为结点(peers)。
3.BT下载工作过程
 

 


图1:BT下载连接示意图

图1是一个下载连接示意图,我们通过它来了解一下BT下载的工作过程。
假如节点M希望共享自己的文件1,它首先制作了名字为1.torrent元信息文件,并上传到了一台web服务器作为“种子”提供下载。同时向追踪服务器注册,将自己的状态提供给追踪服务器。节点M同时启动端口监听,等待其它节点连接。
其它节点得到该种子后,通过客户端程序打开种子文件,种子文件将其引导连接到追踪服务器,节点向追踪服务器请求文件1的下载地址,追踪服务器响应请求,并告诉给其它节点M的地址和端口。
其它节点分别与节点M握手并建立连接后从节点M那里随机下载文件的片段,并隔一段时间和追踪服务器建立联系,将自己的状态报知追踪服务器,追踪服务器将其它下载文件1的节点的信息反馈给各个节点。
最后,各个节点之间就可以互相下载文件。
3.1 追踪服务器(Tracker)的部署
BT下载过程中需要一个追踪服务器。 追踪服务器负责帮助结点获取其它结点的信息,并协调不同结点之间的信息。 追踪服务器和结点之间使用HTTP协议进行交互,结点向追踪服务器注册下载的文件、IP地址、端口以及相关信息,追踪服务器告诉结点其它结点的注册信息,结点利用这些信息相互之间建立连接。BT下载模型部署的第一步就是建立并运行一个追踪服务器。 
3.2 种子文件的制作与发布
BT软件分为Tracker服务器程序和Client程序两部分。一个终端peer想要发布文件时先安装Tracker服务器程序,然后将要发布的文件打包,再用Btmakemetafile程序对这个文件进行分析,Btmakemetafile会把文件分成多个片,并创建一个包含Tracker服务器信息、文件分片信息和checksum信息的,以.torrent为扩展名的种子文件。元信息文件(.torrent文件)主要包含信息info和声明announce两部分。
info描述了下载文件的结构,单文件模式下info结构C语言定义如下:
struct single  file  info 
char3 name;//文件名
int length; //下载文件的长度
char md5 sum[32];//文件的32个字符的MD5验证码,校验文件名
int piece length; //每个文件片段的长度
char * pieces;//SHA-1散列值串,每个散列值对应一个片断,保证文件片断的完整性
}
announce的值是一个字符串,指明追踪服务器的URL。
种子文件只做好后就可以发布到一个web服务器上,于是这个client终端就成为第一个节点。
3.3 节点间交互下载
3.3.1节点与追踪服务器通信
在BT系统中追踪服务器扮演者十分重要的角色。在同一个文件下载过程中,各个客户端节点每隔一定时间就会主动向追踪服务器提出请求,请求获得其它下载节点的信息,同时上报自己的下载信息。
这个过程通过Http协议来完成,客户端节点向追踪服务器发送一个Http的GET请求,把自己的信息放在GET参数里,传递给追踪服务器。GET请求中的参数如下:
△ info_ hash:元信息文件中info关键字值的20个字符的SHA-1散列值
△ peer_ id:标识结点唯一的20个字节的字符串
△ port:结点监听的端口号
△ up loaded:上传的字节数
△ down loaded:下载的字节数
△ left:还需要下载的字节数
△ event:值必须是“started、completed、stoped”其中之一,或者为空,等同于未使用
△ ip:指明客户端机器的真实IP地址
△ numwant:可选参数,指明结点希望从追踪服务器得到的其他结点的个数,缺省值通常是50
追踪服务器收到GET请求后,响应消息结构的C语言定义如下:
union answer_ msg 
{
Char * failure_ reason;//请求失败原因的错误消息,若该关键字有效,则其它关键字就不需要
struct success {  //请求成功时返回的消息结构
int interval; //结点发送请求间隔秒数
int complete; //“种子”结点的个数
int imcomplete; //非“种子”结点的个数
char * * peers; //描述结点信息的字符串数组,包含IP地址、端口等
int port; //结点使用的端口号
}
}
通过客户端节点的请求和追踪服务器的应答参数可知,客户端从服务器那里的得到了其它节点的信息(IP地址、端口等),并且把自己的信息上报给了追踪服务器。为下一步节点间通信打下了基础。
3.3.2节点间通信
节点从追踪服务器得到其它节点的信息后,就可以与其它节点进行“握手”建立,并完成节点间的交互下载了。节点间的交互下载采用结点线路协议( PeerWire Protocol),它是基于TCP协议的应用层协议。
假设一个节点A和节点B建立了连接,A立刻利用这个连接向B发送BT对等协议中的“握手”消息。
 

 

“握手”消息首先是发送整数19,然后发送字符串“BitTorrent protocol”,19 即指示该字符串的长度;之后发送8个保留的字节,这些字节当前都设置为0;接下来发送对.torrent文件中的info信息进行SHA-l加密计算后得到的hash值,20个字节长;最后发送20个字节的peer_id,用来标识A自身。
同样,节点B在与A的TCP连接建立之后,也向A发送BT对等协议的“握手”消息。A一旦接收到B的“握手”消息,那么它就认为“握手”成功,建立了BT对等协议层次上的连接。握手完以后节点之间就可以进行其它消息的传递和文件的互相下载了。
节点之间通过bitfield消息互换所拥有的共享文件的数据块的情况,若一个节点知道某个节点拥有自己需要的数据块,就会向该节点发送request消息请求该数据块,所请求的数据块通过其它节点的piece消息传送过来;同时该节点响应其它节点的request消息。一旦某个节点下载完了一个数据块,并且也检查了它的完整性,那么该节点就向它所有的节点发送have消息,宣布它拥有了这个片断。
4.总结
本文主要分析了BT下载的工作过程,以及工作协议的内容,使我们对BT下载的原理有了更深刻的认识,为我们在实际工作中进行BT控制的研究提供了一定的帮助。

 

文章如转载,请注明转载自:http://www.5iadmin.com/post/1078.html