2005年3月8日

关于如何提高bittorrent的命中率的研究

现在的最流行的下载是什么?当然是Bittorrent了,这种被网友亲切称之为BT的程序几乎已经占有了所有的宽带用户,因为你可以用他来下载几乎所有的大型资源,这种软件用在一些小体积的文件上没有什么特殊的提高,但是用于大型的文件的下载的时候,就可以迅速的提高了。但是也存在着问题,那就是BT的种子文件的时效的问题,相信许多朋友都有在网上打开种子文件之后,结果一个种子也没有,只好再去寻找了,而且这种下载一般是在一个个的论坛转,只能够等着别人来提供,如果没有人提供,可能你等许久也没有办法找到相应的软件,偶尔找到,能不能下载完全也是问题,毕竟一个种子文件的下载者有多少人也是一个大问题,如果你是在一个人气比较旺的论坛,而且下载的文件又比较大众化,那么可能就速度比较快了。但如果你是找到的种子只是几个人下载,你很可能会遇到下载不完整的问题,而且很可能你这次下载可能永远都无法完成。这是我的经验,我用BT并不是很久,但是找到的种子无法下载的时候也遇到过几次,后来我下载的时候不再看超过3天的种子,因为很可能已经没有人在下载了。不过随着BT种子的增多,要从中找出既是自己需要的,又没有过期的种子就越来越难了。如果是在论坛里面等,那就相当于守株待兔,得到正好你想要的文件的机会可能很渺茫,尤其是一些比较专业的东西,现在的BT论坛里面主要是以电影交换为主。而象软件之类的,仍旧集中于一些下载网站。相对于下载网站的稳定性,BT就显的有些不够稳定了。
如何改进呢?我大概看了一下BitTorrent的规范,对于BT的规则有了一个大概的了解。在我理解,制作种子,种子实际是一个文本文件,里面包含了文件的信息,大小,以及Tracker服务器的信息,以及文件Hash值。一个.torrent的组成如下:

元文件是采用bencoded编码的字典,包括以下关键字:

announce tracker的服务器

info 它实际上是一个字典,包括以下关键字:

Name:
一个字符串,在保存文件的时候,作为一个建议值。仅仅是个建议而已,你可以用别的名字保存文件。
Piece length:
为了更好的传输,文件被分隔成等长的片断,除了最后一个片断以外,这个值就是片断的大小。片断大小几乎一直都是2的幂,最常用的是 256k(BT的前一个版本3.2,用的是1M作为默认大小)
Pieces:
一个长度为20的整数倍的字符串。它将再被分隔为20字节长的字符串,每个子串都是相应片断的hash值。

此外,还有一个length或files的关键字,这两个关键字只能出现一个。如果是length,那么表示要下载的仅仅是单个文件,如果是files那么要下载的是一个目录中的多个文件。
如果是单个文件,那么length是该文件的长度。
为了能支持其它关键字,对于多个文件的情况,也把它当作一个文件来看,也就是按照文件出现的顺序,把每个文件的信息连接起来,形成一个字符串。每个文件的信息实际上也是一个字典,包括以下关键字:
Length:文件长度
Path:子目录名称的列表,列表最后一项是文件的实际名称。(不允许出现列表为空的情况)。
Name:在单文件情况下,name是文件的名称,而在多文件情况下,name是目录的名称。


现在的最流行的下载是什么?当然是Bittorrent了,这种被网友亲切称之为BT的程序几乎已经占有了所有的宽带用户,因为你可以用他来下载几乎所有的大型资源,这种软件用在一些小体积的文件上没有什么特殊的提高,但是用于大型的文件的下载的时候,就可以迅速的提高了。但是也存在着问题,那就是BT的种子文件的时效的问题,相信许多朋友都有在网上打开种子文件之后,结果一个种子也没有,只好再去寻找了,而且这种下载一般是在一个个的论坛转,只能够等着别人来提供,如果没有人提供,可能你等许久也没有办法找到相应的软件,偶尔找到,能不能下载完全也是问题,毕竟一个种子文件的下载者有多少人也是一个大问题,如果你是在一个人气比较旺的论坛,而且下载的文件又比较大众化,那么可能就速度比较快了。但如果你是找到的种子只是几个人下载,你很可能会遇到下载不完整的问题,而且很可能你这次下载可能永远都无法完成。这是我的经验,我用BT并不是很久,但是找到的种子无法下载的时候也遇到过几次,后来我下载的时候不再看超过3天的种子,因为很可能已经没有人在下载了。不过随着BT种子的增多,要从中找出既是自己需要的,又没有过期的种子就越来越难了。如果是在论坛里面等,那就相当于守株待兔,得到正好你想要的文件的机会可能很渺茫,尤其是一些比较专业的东西,现在的BT论坛里面主要是以电影交换为主。而象软件之类的,仍旧集中于一些下载网站。相对于下载网站的稳定性,BT就显的有些不够稳定了。
如何改进呢?我大概看了一下BitTorrent的规范,对于BT的规则有了一个大概的了解。在我理解,制作种子,种子实际是一个文本文件,里面包含了文件的信息,大小,以及Tracker服务器的信息,以及文件Hash值。一个.torrent的组成如下:

元文件是采用bencoded编码的字典,包括以下关键字:

announce tracker的服务器

info 它实际上是一个字典,包括以下关键字:

Name:
一个字符串,在保存文件的时候,作为一个建议值。仅仅是个建议而已,你可以用别的名字保存文件。
Piece length:
为了更好的传输,文件被分隔成等长的片断,除了最后一个片断以外,这个值就是片断的大小。片断大小几乎一直都是2的幂,最常用的是 256k(BT的前一个版本3.2,用的是1M作为默认大小)
Pieces:
一个长度为20的整数倍的字符串。它将再被分隔为20字节长的字符串,每个子串都是相应片断的hash值。
此外,还有一个length或files的关键字,这两个关键字只能出现一个。如果是length,那么表示要下载的仅仅是单个文件,如果是files那么要下载的是一个目录中的多个文件。

如果是单个文件,那么length是该文件的长度。
为了能支持其它关键字,对于多个文件的情况,也把它当作一个文件来看,也就是按照文件出现的顺序,把每个文件的信息连接起来,形成一个字符串。每个文件的信息实际上也是一个字典,包括以下关键字:
Length:文件长度
Path:子目录名称的列表,列表最后一项是文件的实际名称。(不允许出现列表为空的情况)。
Name:在单文件情况下,name是文件的名称,而在多文件情况下,name是目录的名称。

这里面比较重要是信息就是tracker服务器的地址了。tracker服务器是整个下载的中间服务者,整个下载过程是这样子,你下载了相应的. torrent文件,通过BT客户端打开文件,BT客户端根据torrent文件里面提供的tracher地址,找到tracker服务器,向 tracker服务器注册。然后tracker服务器向你提供现在的信息,如正在下载文件的人的IP地址,他们下载的程序的部分,端口,同时你也向 tracker服务器提供你的信息,因为这样子别人才能够找到你。通过Tracker服务器,你了解了月多少人在下载这个文件,相应的状态是什么?然后,你再根据这些信息去采用P2P的方式去连接其他人的BT客户端。从这时起,才是真正的P2P下载。然后,将一个分成很多部分的文件分散开来,大家可以互相下载自己需要的,同时提供他人需要的。这样多用户交互下载。在这过程中,BT客户端仍旧要连接tracker服务器以报告自己的状态,同时了解其他的下载者的状态,一般是以几分种为周期的,这样子,tracker服务器就可以保证信息的实时性,可以保证客户端可以实时刷新数据,如果有新的客户加入,有客 户退出,可以高效的连接。而不会在某客户已经退出后,其他人仍旧在一次次的试探连接,这是很重要的。因为如果信息周期太长,说的夸张一点,几个小时才刷新一次,那些已经下载完毕的人可能早已经退出了,而一些正在下载的客户的信息还没有加入到其中,那后来的客户就会不断的试图连接那些已经退出下载的客户,而那些下在下载的客户也无法为后来人提供下载。从而下载就无法继续了。因此tracker是这个下载过程中的中间人,虽然不承担烦重的下载任务,但是承担着信息广播的重任,没有tracker,下载不无法继续了。而tracker刷新周期也是一个很重要的问题,一般不会设得太大,以一分钟左右,如果太小,则会加重服务器与客户端的负担,如果太长,则会造成信息刷新不及时,无法服务于下载。总之,tracker就是一个信息公告板。
其他的客户端通过这个服务器来获得信息,
现在的Tracker服务器都是独立的,也就是由单个论坛进行维护,一般的来说,如果你在那个论坛上得到的.torrent文件,一般就是由这个论坛提供tracker服务。一旦这个tracker服务器出现问题,整个下载就无法进行下去了。
现在的tracker服务器是独立的,也就是形成一个个孤岛,说一句时髦的话说,也就是形成的是信息孤岛。因而形成了以下的问题:
种子不断的重复发布,不断的有人重复发布相同的文件,但是同是又不断的有人在寻找该文件。因此无法形成一个连续的下载。毕竟一个论坛的人气是有一定的限制的,而如果有足够的人气,则可能形成一个足够大的种子市场,世界上这么多人,
同一时刻下载同一文件的机会将会是很多的。我在一些论坛上下载文件的时候经常遇到种子数只有两三个,而相对来说,我在下载FreeBSD以及Fedora Linux 3的时候,那个种子文件已经是几个月前的了,可以下载的时候种子数仍旧达到了98多个,
我用BitSpirit来下载,可以看到下载者的来源,来自美国,澳大利亚,瑞典,日本,俄罗斯等世界各地都有,这是一个巨大的惊喜,因为这些种子是几个月前发布的,到现在仍旧有效,足见这是多么巨大的一个市场,而现在的论坛上的种子经常是几天就
无效了,就是因为人气的缘故,现在网友们下载文件的时候,可以找到N个论坛去寻找.torrent文件,但其实并不是一件好事情,因为大部分的种子都可能已经失效了。
如果这些tracker服务器可以联合起来,那样,既可以减少重复发布,也可以保证一个巨大的人气,延长种子的生存日期。
因此我认为如果可以在tracker服务器之间进行信息交换,就可以在室这样的目标,就象现在的DNS服务器或者是邮件服务器,更象以前的USNET新闻组一样,可以通过
服务器之间的交互,来共享信息。电子邮件,新闻组等现在都在遭受到垃圾信息的困扰,但是tracker服务器上保存的信息根本没有广告价值,因此应该不会受到垃圾信息的侵袭。
所以更确切的说是相当于DNS更加合适一点,通过tracker之间的交换信息,大家可以保证下载的有效性,给更多的人提供服务。而tracker服务器之间的交流信息并不多,只是当前状态的交流。
(未完待续)

没有评论:

发表评论