BT通信中数据下载的分析和实现
2011-10-12 16:59
162 查看
原文:http://hi.baidu.com/i_miss_you_all/blog/item/69d80d08a2e1548bd1581baf.html
关键字: Redeployment zlib 单态 AOP Lightbox BT通信技术作为一种优秀的P2P下载技术,在目前的文件共享方面的作用越来越重要。本文对BT通信协议规范进行简单概述,分析了BT通信中数据下载的原理和实现方式。笔者结合自身实际工作中的经验,介绍了BT通信中提高数据下载速度的策略。1 BT通信协议规范简述BT(BitTorrent)通信协议是一种基于HTTP的分发文件的协议,由三部分组成:torrent文件格式、peer与Tracker服务器的通信协议、peers之间的通信协议。 BT peers开始下载文件资源时,首先需要解析该文件资源对应的torrent文件。torrent文件的所有内容是一个B-encoding(B编码)的字典。B编码是一种简洁的数据组织方式,支持4种数据类型:byte strings、integers、lists和dictionaries,规则如下: ●字符串类型,表示为十进制数的字符串长度加冒号再跟原字符串。 如4:spam就相当于'spam'。 ●整型数据,表示为前面加'i'、后面加'e'、中间是十进制数。 如i3e就相当于3,i-3e就是-3。整型数据没有长度限制;i-0e无效,以'i0'表示i0e。 ●列表类型,表示为一个'l'开头,后面跟它所包含的项目(已经编码过),最后加一个'e'。如l4:spam4:eggse就等于['spam','eggs']。 ●字典,表示为一个'd'开头,后面跟一个交替关键字(key)及其值对应的列表最后加一个'e'。 torrent文件格式是由若干字段确定的,关键字段如表1所示。 表1 torrent文件格式
Tracker服务器,即目录服务器,记录所共享的文件的索引信息及下载该文件的用户的信息(主要是IP地址及端口号)。peer通过与Tracker服务器交互,获得当前下载该共享文件的其它peers,从而可以从其它peers处得到自己想要的数据。 图1 peer与Tracker服务器的通信采用HTTP/HTTPS协议,可利用TCP连接进行交互。peer向Tracker 发送一个HTTP的GET请求,并把自己的信息放在GET的参数中,这个请求的大致意思是:我是A,我想下载X文件,我的IP是IP1,我用的端口是 Port1。Tracker服务器对所有peers的信息进行维护,当它收到一个请求后,首先把该peer的信息记录下来(如果己经记录,就检查是否需要 更新),然后将一部分(数目根据peer请求中设置的参数确定)参与下载同一个文件的peers的信息返回给该peer。 最终的数据下载由各个peers的交互完成,peers之间的通信采用BT标准的Peer Wire 协议(BT对等协议),使用TCP连接。 遵守BT通信协议的实体构成的交互网络如图1所示。 2 BT通信中的数据下载2.1 数据下载原理 若干个peers提供文件共享,它们拥有完整的文件,并将自己的信息注册到Tracker服务器上;其它peers每隔一定时间与Tracker服务器 进行通信,报告自己的信息并获取其它peers的信息。peer在收到Tracker的响应后,与其它peers建立连接,下载本地所没有的文件数据;为 了使其它peers也可以从本地获取文件数据,peer还要监听本地某个端口,用于接收其它peers的连接和数据请求。这样每个peer在下载的同时也 给其它peers上传数据。 举例说明:假设peer A从提供文件共享的peers处随机下载了文件的X部分,peer B则随机下载了文件的Y部分,这样A就会根据自己的情况去向B请求B已经下载好的Y部分,B也会向A请求A已经下载好的X部分,这样就减轻了提供文件共享 的peers的负荷,也加快了peer A和B的下载速度,更减少了地域间的限制。如peer C要连接到提供文件共享的peers去下载这个文件的话,速度可能很慢,但到A和B上去下载就快多了。 BT通信中,所有正在下载某个文件或者已经下好了某个文件但还没有退出该文件下载网络的peers都是发送源,故下载文件的peers越多,提供数据上传的peers也越多,从而每个peers下载的速度也越快。 2.2 数据下载的实现 当peer从Tracker服务器上查询到其它peers的信息后,就和其它peers建立TCP连接,然后与建立了连接的peer进行“两次握手”: 假设一个peer A和peer B建立了连接,A立刻利用这个连接向B发送BT对等协议中的“握手”消息。“握手”消息首先是发送整数19,然后发送字符串“BitTorrent protocol”,19即指示该字符串的长度;之后发送8个保留的字节,这些字节当前都设置为0;接下来发送对torrent文件中的info信息进行 SHA-l加密计算后得到的hash值,20个字节长;最后发送20个字节的peer-id,用来标识A自身。同样,peer B在与A的TCP连接建立之后,也向A发送BT对等协议的“握手”消息。A一旦接收到B的“握手”消息,那么它就认为“握手”成功,建立了BT对等协议层 次上的连接。A 发送了一个消息,同时接收了一个消息,所以这个握手过程是两次“握手”。同样,对B来说,在发送完“握手”消息之后,就等待A的“握手”消息,如果收到, 那么它也认为对等连接建立了。 一旦对等连接建立之后,双方就可以通过这个连接传递消息和交互数据了。TCP连接的两个peers都保持 两比特的状态信息:是否choked,是否interested。choking是通知对方:没有响应消息会发送,除非对方的unchoking发生。一 旦一个peer的状态变为interested,而另一peer的状态变为unchoking,那么两个peers之间的数据传输就可以开始了。也就是 说,一个peer如果想从它的某个peer那里得到数据,那么它首先必须将它们之间的连接设置为interested,即发一个interested消息 过去,而另一个peer,要检查它是否应该给这个peer发送数据,如果它对这个peer是unchoking,那么就可以给它发数据,否则还是不能给它 发数据。 peers之间通过bitfield消息互换所拥有的共享文件的数据块的情况,若一个peer知道某个peer拥有自己需要的 数据块,就会向该peer发送request消息请求该数据块,所请求的数据块通过其它peer的piece消息传送过来;同时该peer响应其它 peer的request消息。一旦某个peer下载完了一个数据块,并且也检查了它的完整性,那么该peer就向它所有的peers发送have消息, 宣布它拥有了这个片断。 3 提高BT数据下载速度的策略 以笔者工作中的一个项目为例,该项目是一个带下载功能的播放器,即所谓的“BT 盒子”,其定位是成为互联网时代取代传统DVD的下一代家庭影视播放机。 该播放器有如下功能: ●P2P下载功能; ●海量存储浏览、管理功能; ●连接局域网内电脑的UPnP功能; ●连接USB存储设备功能; ●高清影视播放功能。 P2P下载是播放器的核心功能之一,播放器内嵌遵守标准BT通信协议的下载客户端程序,可以通过互联网直接连接到公司提供的网站上获取和更新电影种子列表,笔者负责优化和维护该下载程序,在实际测试中对于如何提高BT数据下载速度积累了一些经验: 1)超时机制 由于与某个peer之间的网络连接可能很慢,故要引入超时机制:一是连接超时,二是数据块下载超时。 当在某个时间段内,没有收到某个peer的BT对等协议的交互消息时,就要断开与该peer的连接,清除本地维护的该peer的信息,从而避免peer长时间不响应或响应很慢导致内存资源的浪费和数据下载效率的降低。 为了不频繁的写硬盘而占用CPU和损伤硬盘,下载程序维护了一个固定大小的本地缓存,将正在下载中的数据块进行缓存。BT通信中的数据下载以数据块为单 位进行,只有从某个peer处下载到一个完整的数据块并通过SHA-1校验后,才将该数据块写入硬盘,并从本地缓存中删除该数据块。本地缓存的数据块越 多,则该时刻正在向其它peers发出的数据请求越多,从而下载速度也越快。如果由于网络连接慢而造成某一个数据块要很久才能从peer处下载完,则本地 缓存就没多少空间去容纳下一准备请求的数据块,从而导致后续数据块的请求延迟,使得下载速度降低。所以需要对每个数据块设置超时,超过预定时间,就从本地 缓存中清除该数据块而去请求下一数据块。 2)外部服务器加速 通过上述(1)的策略,经过与流行的BT下载软件 BitComet的对比测试,对于同一个热门种子,BitComet的平均下载速度在100KB/s,而笔者维护的BT下载程序的平均下载速度在40KB /s;对于同一冷门种子,BitComet的平均下载速度在20KB/s,且一直保持速度,而笔者维护的BT下载程序的平均下载速度在10KB/s,下载 速度断断续续。 图2 前面已经提到,进行同一文件BT下载的peers数目越多,各个peer的下载速度就越快。目前使用BitComet下载软 件的用户有数百万计,而笔者公司产品正处于测试阶段,笔者维护的BT下载程序目前最大用户量仅30,这样下载速度比BitComet慢也是正常的。想在短 时期内积累数量可观的用户群,从而提高下载速度是有难度的,于是引入外部服务器加速机制,即所有我们的用户要下载的文件先在该外部服务器(也称 Cacher服务器)上下载完成。当我们的程序用户要下载某个文件时,该外部服务器作为一个“超级”peer,为我们的用户提供数据上传。由于外部服务器 的带宽是100Mbps,故可为每个下载用户提供至少50KB/s的上传速度。经过测试,使用外部服务器加速后,使用我们的BT下载程序,一个文件任务的 下载速度可以达到120KB/s。构成的网络如图2所示。 4 结束语 本文通过对BT通信协议的分析,详细阐述了其数据下载的原理,并在此基础上对如何提高BT下载速度做了进一步的介绍,最后以笔者实际工作中的一个项目为例,将提高BT下载速度的策略运用于实际工作,实际工作效果显示,程序的下载速度能够较好地满足用户要求。 参考文献 [1]Kurose J,Ross K著. 陈鸣译. 计算机网络——自顶向下方法与因特网特色(原书第三版).北京:机械工业出版社,2005 [2]Bittorrent Protocol Specificationv1.0 http//wiki. theory.org/BitTorrentSpecifieation,Sep 2006 [3]汪燕,柳斌. BitTorrent协议分析及控制策略. 试验技术与管理,2006(1):21 [4]程久军,于魁飞. 一种基于P2P(Peer-to-Peer)文件共享应用的片段选择算法. 技术通讯,Vol.43,2005 收稿日期:8月6日 修改日期:8月8日 作者简介:李敏(1984-),男,汉族,研究生,主要研究方向:计算机网络与信息系统;徐林(1966-),男,汉族,副教授,硕士生导师,主要研究方向:分布式计算机网络,智能信息系统,多媒体应用研究等。 |
相关文章推荐
- BT通信中数据下载的分析和实现
- LSTM模型分析及对时序数据预测的具体实现(python实现)
- Ajax 实现在WebForm中拖动控件并即时在服务端保存状态数据 (Asp.net 2.0)(示例代码下载)
- AjaxPanel自定义控件实现页面无刷新数据交互(做了个示例程序, 效果确实比较Cool, 用法非常简单! )(示例代码下载)
- Redis源码分析(十九)--- replication主从数据复制的实现
- 机顶盒平台的字幕数据格式分析及其显示实现
- 研读《基于Hadoop的海量业务数据分析平台的设计与实现》----flume的数据收集系统的设计
- 利用数据挖掘实现电信行业客户流失分析
- 利用Oracle分析函数row_number和sys_connect_by_path实现多行数据合并为一行
- OpenLayers项目分析——(五)空间数据的组织与实现
- 数据挖掘之推荐分析--python实现
- Android 获取Root权限之后的静默安装实现 代码示例分析&&源码下载
- spark高级数据分析实战---随机森林实现
- 易观智库:大数据下的用户分析及用户画像(18页PPT附下载)
- 易观智库:大数据下的用户分析及用户画像(18页PPT附下载)
- AjaxPro.NET实现TextBox智能获取服务端数据功能(Asp.net 2.0)(示例代码下载)
- 数据分析与处理(Leveldb 实现原理)
- 应用SAP PI实现SAP BW数据仓库对于第三方系统数据完美集成以及DELTA加载的分析
- 芝麻HTTP:JavaScript加密逻辑分析与Python模拟执行实现数据爬取
- Php中文件下载功能实现超详细流程分析