BitTorrent协议规范之torrent文件

 BitTorrent下载每个资源需要一个元数据信息(meta info)文件,该文件描述资源的相关信息,其后缀名通常为.torrent,所以也叫torrent文件。
  torrent文件中内容采用Bencode编码,不熟悉Bencode的可以先查看 BitTorrent协议规范之Bencode,一个torrent文件就是一个bencode的字典(dictionary)。所有字符串值采用UTF-8编码。
torrent文件中的key有下面几个info,announce,announce-list(可选),creation date(可选),comment(可选),created by(可选)。它们对应的Value分别是:
info:一个字典,用来描述资源,资源分两种一是单个文件,二是多个文件。
announce:一个字符串,表示tracker的url
announce-list:一个列表(list),表示所有的备选的tracker的url。这 个是对BitTorrent官方协议的一个扩展。它并不是BitTorrent官方协议中的,是John Hoffman提出来对官方的BitTorrent协议的扩展。关于announce-list,后面再仔细探讨它的规则。
creation date:torrent文件创建的时间,它使用标准UNIX epoch format,也就是用一个整数表示从UTC 1970年1月1日0时0分0秒到创建时间的秒数。也就是说creation date的value是一个整数。
comment:一个字符串,用来表示torrent创建者对资源的描述。
created by:一个字符串,用来表示创建torrent文件的程序的名字和版本。

在上面这些信息中,显然info信息显然比较重要。不管是单个文件还是多个文件,它的info都包括下面这些keys: piece length, pieces, private。它们的value分别是:
piece length: 一个整数用来表示资源分块的块大小。
pieces: 一个字符串,它的长度是20*块个数。每20个byte组成对应序号的块的hash信息,hash采用的SHA1算法。
private: 一个整数,取值只有两种可能,0和1。当它为1时,表示BT客户端只能通过trackers获得peers,不能通过其他方式,比如DHT,peer之间 交换等方式获得peers。当它为0时,即表示可以通过其他方式获得peers。这个字段个人感觉没什么用,要是我来实现BT客户端,我就不care它, BT下载就是为了快嘛,节点越多自然越快,能用其他途径获得peers为什么不获得呢。

在info字典中下面有keys表示的意思因资源不同而不同。
单个文件:
name: 一个字符串表示文件名。
length: 一个整数表示文件大小,单位是byte。
md5sum: (可选)一个有32个字符的Hex字符串,表示整个文件的md5值。之所以它是可选,因为前面已经有pieces中SHA1 hash的信息了。
多个文件:
name: 一个字符串,表示存储这些文件的文件夹的名字。
files: 一个列表(list),列表的每一项是一个字典(dictionary),每一项即对应一个文件。
每一项的字典包括length,md5sum,path三个key。length和md5sum与单个文件中的表示一样的信息。path表示文件路径。它 是一个字符串list,每个字符串表示一个目录,最后一个是文件名。比如有个文件在abc/def/test.avi,它的path信息就是"l3: abc3:def8:test.avie"。

注意事项:
1.关于分块
   分块的大小有讲究,分块若分的很大,则不利于传输,若分块分的很小,会导致torrent文件太大,不利于发布与获取。推荐的做法是,在控制 torrent文件大概在50-70KB的情况,取最小的分块大小。结合现在网络状况,取512KB或者更小比较好。常见的分块大小有256KB, 512KB和1MB。
   分块的方法也有规定,对于单个文件,当然除了最后一块可能大小和piece length不等,前面应该都是相等的。对于多个文件的情况,则是把这些文件当成一个整体来看,按照files中的顺序,从前往后按照piece length的大小划分块,直到最后一块,当然最后一块可能大小和piece length不等。这样划分就多半会出现某一个块就跨越了两个文件的分界处。

块的校验,每个块的校验是在info中pieces中记录了每个块的hash值。
2.关于announce-list
announce-list的值是一个list,list的每一项又是一个list。可以理解为把trackers分级了,每一级又可能有多个 tracker。前面的tracker list比后面的tracker list的优先级高。当torrent中有announce-list时候,应当忽略announce信息,只管announce-list。同一级则第 一次读取所有tracker后,先混淆顺序,再挨个try,其实也就是随机了,跟随机不一样的是,如果总是把刚才connect ok的tracker放到list的前面了。
举几个例子:
(1)[[tracker1],[backup1],[backup2]]
首先尝试tracker1,tracker1 ok就不再尝试backup1和backup2,tracker1不可用再尝试backup1,backup1不可用再尝试backup2
(2)[[tracker1,tracker2,tracker3]]
第一次读取,先混淆顺序。我们假设这已经混淆好了。首先尝试tracker1,若tracker1不可用,再尝试tracker2,若tracker2可 用,则需要将列表修改为tracker2,tracker1,tracker3,下次按照这样的顺序,若下次tracker2不可用,tracker1也 不可用,tracker3可用,则顺序修改为tracker3,tracker2,tracker1。即总是把可用的放到list前面了。
(3)[[tracker1,tracker2],[backup1]]
这个就是上面两个的综合~

实战一把:从伊甸园美剧论坛上下载的 越狱第3季第5集的torrent文件,(为避免遗失,我把它放到我的live skydrive中) 把它用记事本打开,里面的前面部分内容是:

d8:announce35:http://tracker.ydy.com:102/announce13:announce-listll35:http://tracker.ydy.com:102/announceel26:http://bt.5qzone.net:8080/el27:http://itv.5qzone.net

:8080/el37:http://tracker.cnxp.com:8080/announceel36:http://btfans.3322.org:8000/an

nounceee10:created by13:uTorrent/172013:creation datei1193105051e8:encoding5:UTF-

84:infod5:filesld6:lengthi1153606218e4:pathl42:prison.break.s03e05.720p.hdtv.x264-

ctu.mkveed6:lengthi93e4:pathl118:銆栨缇庤繛缁墽浜ゆ祦鍖恒€?- HDTV鐖卞ソ鑰呯殑涔愬洯-锛o

绩锛よ仈鐩?HDTV鎶€鏈璁?HDTV - Powered by Discuz!.urleed6:lengthi81e4:pathl62:浼婄敻鍥

浗澶栬繛缁墽浜ゆ祦绔?- powered by

phpwind.net.urleee4:name47:Prison.Break.S03E05.720p.HDTV.x264-CTU[CHD_YDY]12:piece

lengthi2097152e6:pieces11020:詗
蹔vH7塕j衤4h""e钑X

从上面可以看出来
announce=http://tracker.ydy.com:102/announce
announce-list=[[http://tracker.ydy.com:102/announce],[http://bt.5qzone.net:8080/],

[http://itv.5qzone.net:8080/],[http://tracker.cnxp.com:8080/announce],

[http://btfans.3322.org:8000/announcee]]
created by=uTorrent/172013
creation date=1193105051
info:
  length=1153606218
  path=prison.break.s03e05.720p.hdtv.x264-ctu.mkve
........

注意到上面还有一个
encoding=UTF-8
可能是用来明确规定torrent中字符串采用UTF-8编码。这个encoding好像并没有在BitTorrent官方协议规

范中,可能也是谁提议增加的,或者是BitTorrent实现者们大家默认的,免得别人弄错了encoding。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值