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。

BitTorrent协议规范之torrent文件相关推荐

  1. [转载] BitTorrent协议规范

    BitTorrent 协议规范(BT协议集合)一 BitTorrent 是一种分发文件的协议.它通过URL来识别内容,并且可以无缝的和web进行交互.它基于HTTP协议,它的优势是:如果有多个下载者并 ...

  2. BEncode编码方式以及torrent文件的一些内容

    字符串: 字符串被如此编码:<字符串长度>:字符串正文.这种表示法没有任何的分界符. 例子:如"8:announce"指"announce". 整数 ...

  3. [译]BitTorrent协议规范

    BitTorrent 是一个用于文件分发的协议.它通过 URL 来标识内容,其设计使其可以与 Web 无缝集成.BitTorrent 相对于一般 HTTP 的优势在于,当相同文件的多个下载并行进行时, ...

  4. BitTorrent协议规范(BitTorrent Protocol Specification)系列之元信息文件结构(Metainfo File Structure)-第二部分...

    元信息文件结构(Metainfo File Structure) 元信息文件里面的所有数据都以B编码方式编码,B编码规范请参考本系列文档之B编码. 元信息文件(就是平常咱们经常接触到的以.torren ...

  5. BT种子的技术原理是什么?就是.torrent文件该如何理解?

    看到很多咨询BT种子原理的问题,在这里整理些资料,希望对需要的朋友有帮助. 可以分两个层面来分析一下: 1.torrent文件的原理:如果这个问题是指torrent文件本身,那么,当你对一个文件(或者 ...

  6. torrent文件解析器

    第二步工作是解析torrent文件,有了bencoding编码解析器 解析torrent文件当然是易如反掌的任务了. 实现的封装类CTorrentParser,完成的主要任务有: 1.判断torren ...

  7. torrent文件编码

    Torrent小记 由于某些众所周知的原因,我对torrent文件(也就是我们常说的种子文件)产生了浓厚的兴趣,这里是官方百科对torrent文件的定义: torrent文件本质上是文本文件,包含Tr ...

  8. Torrent文件的解析与转换

    阅读目录 Torrent简介 Torrent结构 Torrent文件编码 Torrent文件解析 Torrent文件与Magnet 具体实现 Reference 回到顶部 Torrent简介 BitT ...

  9. torrent文件打开成php,.torrent格式用什么打开

    .torrent格式用迅雷打开,.torrent种子文件本质上是文本文件,包含Tracker信息和文件信息两部分,Tracker信息主要是BT下载中需要用到的Tracker服务器的地址和针对Track ...

最新文章

  1. plSQL复制数据的方法
  2. 破解前端面试系列(3):如何搞定纸上代码环节?
  3. net start mysql 无法启动mysql解决方案之一【NET HELPMSG 3534】
  4. PSP自制系统3.xxOE相关内容
  5. 加载执行预编译的Sql :prepareStatement
  6. 【LeetCode】【HOT】617. 合并二叉树(递归)
  7. fragment类中的点击事件空指针异常
  8. c# 程序员学习android(2)登陆界面
  9. python贪吃蛇设计思路_Python深度剖析贪吃蛇游戏的设计与实现
  10. linux镜像迅雷下载,【转】红帽 Red Hat Linux相关产品iso镜像下载【迅雷快传】【百度云】【更新7.1】...
  11. HTML从入门到入土 - CSS基础
  12. Nodejs修改镜像以及缓存路径
  13. PHP与其他语言的比较
  14. XML配置文件的读取
  15. Vizard基础操作
  16. 券业零售业务转型方向已显现?从打造个人IP开始
  17. itop启动mysql_使用iTOP进行CMDB资产管理
  18. 2022年软件测试行业就业发展前景,软件测试前景好吗?我该学什么?
  19. 财报对比:GREE和DeNA由来已久的竞争
  20. sqrt (2)不使用数学库,求2的开方。

热门文章

  1. 未转变者服务器保存红字警告,未转变者3.1版开服图文教程,未转变者3.1版怎么开服 - 攻略心得 - 找游戏手游网...
  2. Chris——Daily conversation topics Lesson 2
  3. html5是什么意思,HTML5是什么 HTML5是什么意思 HTML5简介
  4. 五种典型启发式算法对比总结
  5. bemusic,一个音乐网站建站心得分享
  6. python方向键控制角色_Python控制鼠标和键盘-PyAutoGUI用法详解
  7. Qt5 on Wayland
  8. 谈谈 CTO 如何做好技术管理?
  9. 打造最全皮肤,Python采集英雄联盟(LOL)官网数据!
  10. Andriod-解决签名错误导致wifi 扫描不到ap