初步探讨BitTorrent文件的结构

百度百科介绍:

torrent文件本质上是文本文件,包含Tracker信息和文件信息两部分。Tracker信息主要是BT下载中需要用到的Tracker服务器的地址和针对Tracker服务器的设置,文件信息是根据对目标文件的计算生成的,计算结果根据BitTorrent协议内的B编码规则进行编码。它的主要原理是需要把提供下载的文件虚拟分成大小相等的块,块大小必须为2k的整数次方(由于是虚拟分块,硬盘上并不产生各个块文件),并把每个块的索引信息和Hash验证码写入.torrent文件中;所以,.torrent文件就是被下载文件的“索引”。

bt下载原理

下载者要下载文件内容,需要先得到相应的.torrent文件,然后使用BT客户端软件进行下载。
下载时,BT客户端首先解析.torrent文件得到Tracker地址,然后连接Tracker服务器。Tracker服务器回应下载者的请求,提供下载者其他下载者(包括发布者)的IP。下载者再连接其他下载者,根据.torrent文件,两者分别告知对方自己已经有的块,然后交换对方没有的数据。此时不需要其他服务器参与,分散了单个线路上的数据流量,因此减轻了服务器负担。
下载者每得到一个块,需要算出下载块的Hash验证码与.torrent文件中的对比,如果一样则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容准确性的问题

引入

首先先了解一下BT文件的编码方式,就像http协议使用base64编码一样,BT文件普遍使用Bencode编码。

引用自百度百科

虽然比用纯二进制编码效率低,但由于结构简单而且不受字节存储顺序影响 (所有数字以十进制编码)——这对于跨平台性非常重要。 而且具有较好的灵活性,即使存在故障的字典键,只要将其忽略并更换新的就能兼容补充。

Bencode的编码方式

  1. 字符串(string):abc = 3:abc 或者 length = 6:length 形如 数字:字符串
  2. 整数(int):1234 = i1234e 或者 3455 = i3455e 形如:i整数e
  3. 链表(List):List<”abc” , 233> = l3:abci233ee 形如:l元素元素元素e 注意元素也按照相同的编码方式
  4. 字典(Dictionary

单文件例子

d8:announce34:http://tracker.ydy.com:86/announce10:createdby13:BitComet/0.5813:creationdatei1117953113e8:encoding3:GBK4:infod6:lengthi474499162e4:name51:05.262005.StarWars Episode IV A New Hope-Rv9.rmvb10:name.utf-851:05.26.2005.Star WasEpisode IV A New Hope-Rv9.rmvb12:pieceslengthi262144e6:pieces36220:XXXXXXXXXXXXXXX(SHA1杂凑值)e


然后咱们稍稍按照格式解析一下

d
8:announce
34:http://tracker.ydy.com:86/announce
10:createdby
13:BitComet/0.58    
13:creationdate
i1117953113e
8:encoding
3:GBK
4:info
d
6:length
i474499162e
4:name
51:05.262005.StarWars Episode IV A New Hope-Rv9.rmvb
10:name.utf-8
51:05.26.2005.Star WasEpisode IV A New Hope-Rv9.rmvb
12:pieceslength
i262144e
6:pieces
36220:XXXXXXXXXXXXXXX(SHA1杂凑值)
e
e

可以看出是一个字典套字典的结构,当中announce表明了tracker服务器的地址,还有createdby(被何人创建),creationdate(创建时间,unix元年时间到现在的秒数),encodeing(编码方式),info(文件信息,这里又是一个字典)。
length(文件大小),name(文件名),name.utf-8(也是BitComet的扩展,指出文件名编码不是GBK而是UTF-8),pieceslength(文件块大小),pieces(文件块的SHA1【secure hash algorithm】值,一般一个文件块是20字节,所以这里36220/20 = 1811个文件块)

试着来一个真实的例子

种子文件从这里下载的

http://www.dlkoo.com/down/3/2015/377259184.html

d
8:announce  
35:http://173.254.204.71:1096/announce
13:announce-list
l
l35:http://173.254.204.71:1096/announcee
l33:http://188.190.120.74:80/announcee
l31:http://95.68.246.30:80/announcee
l34:http://mgtracker.org:2710/announcee
l32:http://t2.popgo.org:7456/annoncee
l35:http://share.camoe.cn:8080/announcee
l40:http://open.acgtracker.com:1096/announcee
l40:http://retracker.adminko.org:80/announcee
l38:http://tracker.xelion.fr:6969/announcee
l36:udp://open.demonii.com:1337/announcee
l44:udp://tracker.openbittorrent.com:80/announcee
l38:udp://tracker.publicbt.com:80/announcee
l32:udp://tracker.prq.to:80/announcee
l34:http://121.14.98.151:9090/announcee
l29:http://94.228.192.98/announcee
l33:udp://208.67.16.113:8000/annonucee
l27:http://bt.dmhy.net/annonucee
l30:http://share.dmhy.org/annonucee
l29:http://share.dmhy.me/annonucee
l34:http://tracker.btcake.com/announcee
l42:http://tracker.ipv6tracker.org:80/announcee
l37:http://tracker.ktxp.com:6868/announcee
l37:http://tracker.ktxp.com:7070/announcee
l33:http://bt.sc-ol.com:2710/announcee
l35:http://btfile.sdo.com:6961/announcee
l40:https://t-115.rhcloud.com/only_for_ylbude
l36:https://tr.bangumi.moe:9696/announcee
l35:http://tr.bangumi.moe:6969/announcee
l38:http://exodus.desync.com:6969/announcee
l35:udp://coppersurfer.tk:6969/announcee
l39:http://tracker3.torrentino.com/announcee
l39:http://tracker2.torrentino.com/announcee
l31:udp://tracker.ex.ua:80/announcee
l29:http://pubt.net:2710/announcee
l32:http://tracker.tfile.me/announcee
l44:http://bigfoot1942.sektori.org:6969/announcee
l33:http://t.nyaatracker.com/announcee
l32:udp://bt.sc-ol.com:2710/announcee
e
10:created by
14:uTorrent/3.4.5
13:creation date
i1450142717e
8:encoding
5:UTF-8
4:info
d
6:length
i1488841251e
4:name
61:[CASO&SumiSora][LoveLive!The_School_Idol_Movie][GB][720p].mp4
12:piece length
i2097152e
6:pieces
14200:���
e
e

ps:14200之后其实有一大段乱码,为了防止混乱我就删除了,由此可以初步了解bt文件的结构了。

pss:多文件的也试着看了一下,结构大体相似,只是貌似有多个info,其他的基本一模一样。