欢迎来到天天文库
浏览记录
ID:38678877
大小:1.07 MB
页数:9页
时间:2019-06-17
《常见下载方式之BT下载实现过程详解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、常见下载方式之BT下载实现过程详解一、BT下载是怎么来的?在互联网上下载文件的方式大概有这么几种:FTP、HTTP、BT、eMule(电驴)等,浏览器会直接支持FTP和HTTP下载,BT和eMule下载一般需要专用的下载软件的支持。接下来分别简单介绍一下它们的区别:FTP是FileTransferProtocol(文件传输协议)的英文简称,顾名思义,就是提供文件传输的一个协议。首先需要有一个FTPServer,负责文件的存储并接受网络请求(FTP连接和指令)提供下载,然后FTPClient向FTPServer发起网络请求,并将接受到的文件内容保存
2、到本地。HTTP是HyperTextTransferProtocol(超文本传输协议)的英文简称,超文本就是我们平时所说的网页,通过网页上的链接把众多的网页组织成一个超级大的信息节点网络,所以叫超级文本。文件下载只是HTTP协议所支持的一个子功能,同样需要HTTPServer(Nginx、Apache、IIS等)和HTTPClient(各种浏览器)来完成文件的下载。对以上两种下载方式做一个简单总结:HTTP下载1如果用户想要更快的下载速度呢?一种选择是,Client使用多线程下载,抢占更多的服务器资源(早期的网际快车FlashGet就是这种方式)
3、。如果用户量很大,这样无疑对Server造成很大的压力。然后呢,Server提供商(网站方)需要提供更多的服务器和更高的带宽,但是这需要花很多钱。那么,有没有更低成本的解决方案呢?接下来就出现了BT下载。BT是BitTorrent的缩写,Torrent是激流、洪流的意思,Bit洪流,看名字就很牛的样子。和以上两种下载方式最大的区别就是用户不再直接从服务器下载文件,而是用户之间相互下载,这种方式叫做P2P(PeertoPeer点对点)。从下图我们可以看出参与的人越多,下载速度越快P2P下载1二、BitTorrent的P2P下载是怎么做到的?要做到P
4、2P下载首先需要解决如下两个问题:1、如何知道哪些Client在下载同一个文件?2、对某一个文件,如何做到同时从多个来源进行下载?对于第一个问题的解决方案:设计一个TrackerServer(跟踪服务器),每一个Client需要去这里上报自己正在下载的文件以及自己的ip地址和监听的端口。新来的Client先要连接到TrackerServer,根据要下载的文件查询当前正在下载这个文件的Clients(Peers)。对于第二个问题的解决方法:Client从TrackerServer获取Peers后,分别向他们发起连接并询问当前的下载进度,然后,同时连
5、接多个Peers分别下载他们已完成的文件片段,最后拼接出完整的文件。那么对于下载进度应该如何表达呢?因为文件不是被顺序下载的(因为需要从Peers同时下载不同的片段),所以不可以通过当前已完成的字节数来表示进度。那么,最简单有效的方式就是把文件分割成相同大小的片段(Piece),片段的大小一般是2^n,比如2^18=256K,通过已完成Pieces的序号列表来表示当前的下载进度。另外,因为Pieces序号是连续的,可以通过BitMap的方式表示每个PieceIndex是否已完成。PieceIndex所在的bit位为1,表示该Piece已经下载完成
6、。如果下载任务是一个文件夹(包含很多文件),可以把这些文件按照固定的顺序连接起来(逻辑上)进行Pieces切分。当Client获取到Peers的完成列表后,就可以将不同的Pieces分配到对应的Peers进行并行下载,同时将自己已完成的Pieces提供给其他Peers来下载。互帮互助、互通有无的和谐社会就此开启了。到目前为止,我们还有几个关键问题没有解决:1、怎么找到待下载文件的TrackerServer?2、Peers对文件分片的规则是否一致?3、在TrackerServer上怎么唯一的标识一个下载任务?4、下载来的Pieces是否在传输过程中
7、出现了错误或者被恶意篡改?为了解释上面的问题,此处应该有.torrent文件(BT种子)出场了。BT种子文件主要包括如下关键信息:BT种子文件主要信息1我们找一个种子文件片段来瞧一下:是不是有似曾相识却又看不懂的感觉呢?这是因为.torrent文件是bencoding编码表示的。bencoding编码是一种对象序列化表示法(功能和json是一样的,但是规则不一样),bencoding编码通过开头的字符来指定接下来的对象的类型,规则如下:'d'开头表示是dict类型,可以理解为key=>value的集合,'e'表示结束'l'(小写字母L)开头表示是
8、list类型,'e'表示结束'i'开头表示是integer类型,'e'表示结束,可以表示负数数字开头表示string类型,数字为stri
此文档下载收益归作者所有