torrent种子文件解析

.torrent种子文件解析

参考链接:https://zh.wikipedia.org/wiki/种子文件

结构

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

种子文件包含以下数据:

  • announce – tracker的URL
  • info – 该条映射到一个字典,该字典的键将取决于共享的一个或多个文件:
    • files — 每个对应一个文件的字典列表(仅当多个文件被共享时)。每个字典都有以下键:
      • length — 文件的daxn (以字节为单位)
      • path — 子目录名对应的字符串列表,最后一个是实际文件名
    • length – 每个文件块的字节数。通常为{\displaystyle 2^{8}}

      2^{{8}}

      = 256KiB = 262144B

    • pieces – 每个文件块的SHA-1的集成Hash。因为SHA-1会返回160-bit的Hash,所以pieces将会得到1个160-bit的整数倍的字符串。如果 torrent 包含多个文件,则通过按照文件在文件字典中出现的顺序连接文件来形成碎片(即,torrent 中的所有碎片都是完整的碎片长度,最后一个碎片可能更短)。
    • length – 文件的大小(以字节为单位)

所有字符串都必须是UTF-8编码的,除了pieces,它包含二进制数据。

一个 torrent 由infohash唯一标识,一个SHA-1散列以bencode形式在info字典的内容上计算。对 torrent 其他部分的更改不会影响哈希。该散列用于通过 DHT 向其他对等方和跟踪器识别 torrent。它也用于磁力链接

格式

参考链接:https://www.cnblogs.com/wgwyanfs/p/6847052.html

示例

前面的字符串都是UTF-8编码的,所以采用UTF-8格式的就能打开,pieces是二进制的,会乱码。

文字并没有分行,只有一行,非常长的,毕竟不是给人读的,不需要分行,但是我这里为了方便,按照格式进行了分行。

d13:announce-listl
l39:http://h4.trakx.nibba.trade:80/announcee
l36:http://t.nyaatracker.com:80/announcee
l37:http://tracker.bt4g.com:2095/announcee
l35:udp://zephir.monocul.us:6969/announceee
4:info
d6:lengthi2119287869e
4:name
51:灰猎犬号.2020.中英字幕.1080p.dytt5g.com.mp4
12:piece length
i524288e
6:pieces80860:后面就是二进制数据了

编码格式

为了在torrent文件里存储bt下载所需信息。须要一定规范记录这些信息,在这里torrent文件使用的是BEncode格式规范,和JSON一样,本质都是用来交换和存储信息。

存储类型

BEncode有四种存储类型:(字符串型、数值型、列表型、字典型)

1、字符串[string]

字符串表示方式为:数字前缀:字符串。比如super表示为:5:super 数字前缀以十进制数字指出字符串的长度。比如:

0:””
4:大庆
6:daqing
15:www.sina.com.cn

2、 数值[integers]

数值的表示方式为:以小写字母”i”開始。以小写字母”e”结尾,ie中间放置十进制数值。比如:

i0e 表示数字0(零)
i-3e表示数字-3
i7e 表示数字7

3、列表[list]

列表类型同意嵌套,列表中的能够存储列表。列表的表示方式:以小写字母”l”開始。以小写字母”e”结尾,le中间放置存储的内容。比如:

l7:figo’s4:blog3:url23:http://news.sina.com.cne
该list的内容为[‘super’s’ , ’blog’ , ’url’ , ’http://news.sina.com.cn’]

l4:yeari2013ee
该list的内容为[‘year’,2013]

4、字典[dictionary]

字典是为了让一个详细的名字[name]与一个详细的数据类型表示的数据关联,上面三种类型(字符串、整数、列表)的数据仅仅是单纯的表示数据本身,并未有变量名来指出该数据名称。字典类似C语言变量的定义,比如定义一个名为strName的字符串例如以下:

Char *strName=NULL;

当strName指向字符串”Figo”时,那么当我们说strName时也即在说”Figo”。

BEncode中字典类型的存在。就是为了让数据与名称关联配对。也即dictionary后的数据要两两配对。

这里须要注意的是。名称必须为string类型。

Dictionary可同意嵌套使用。表示方式:以小写字母’d’開始。以小写字母’e’结尾。de中间放置要存储的内容。例如以下:

d4:Name:4:Figo5:Hobbyl8:football5:sleep8:thinkingee

该dictionary内容为{

‘name’ = ‘Figo’,
’Hobby’ = [‘football’,’sleep’,’thinking’] }
d8:Name-dicd5:First4:Figo6:Second3:Tomee

该dictionary内容为{

‘Name-dic’= {
    ‘First’=’Figo’,
    ’Second’=’Tom’}
}

那么开头的torrent文件的announce部分

d13:announce-listl
l39:http://h4.trakx.nibba.trade:80/announcee
l36:http://t.nyaatracker.com:80/announcee
l37:http://tracker.bt4g.com:2095/announcee
l35:udp://zephir.monocul.us:6969/announceee

就可以理解为

announce-list = [ 'http://h4.trakx.nibba.trade:80/announce','http://t.nyaatracker.com:80/announce','http://tracker.bt4g.com:2095/announce','udp://zephir.monocul.us:6969/announce' ]

结构

在bitTorrent规范中,torrent文件又被称作Metainfo files,其主要有announce部分和info部分组成。

announce结构

keyword 含义
announce 必选 该keyword的值为Tracker的URL。(但不知道为什么我这个没有)
announce-list 可选 它的值存放的是备用Tracker的URL。
creation-date 可选 该keyword相应的值存放的是种子文件创建的时间,为UNIX时间格式。
comment 可选 string类型,它的值存放的是种子文件制作者的备注信息。
created by 可选 值存放生成种子文件的BTclient软件的信息,如client名、版本。
encoding 可选 指出info中pieces部分的编码类型,一般为UTF-8。有时也会遇到GBK。

补充说明:

announce-list

(对标准的扩展)备选的trackerserver列表,这里须要说明一下备选server的选择和尝试连接顺序。

例如以下的表示为announce-list的一种表示:

{‘announce-list’ = [ [tracker1,tracker2,tracker3], [backup2-list], [backup3-list] ] }

在btclient程序连接trackerserver时,对于announce-list的处理步骤例如以下:

1)、首先依次尝试连接第一个列表提供的url。假设tracker1无响应。尝试tracker2.当tracker2连接成功时。则第一个备份列表中的处理顺序变为:

[tracker2,tracker1,tracker3]

2)、假设第一个备份列表依次连接失败,则尝试backup2-list。假设backup2-list也依次连接失败。

则尝试连接backup3-list。可是backup2-list与backup3-list不会由于连接失败而像backup1-list那样改变处理顺序;

3)、改变的list顺序仅仅对此次程序连接尝试顺序有影响,原始的torrent文件并不更改,下次重新启动程序后依然依照torrent文件里的announce-list次序尝试。

info结构

这里须要注意info部分的单文件传输和多文件传输时的不同:单文件传输是指torrent文件仅仅存储了单个文件下载信息;多文件传输指torrent中存储了一个以上的文件下载信息。

keyword 含义
piece length 每一个piece的长度,值是B编码类型,通常为i262144e。即256K
pieces 字符串类型。存放每一个piece的hash值,这个字符串长度一定是20的倍数。由于每一个piece的hash值的长度为20字节。
private 该值假设为1。则表明client必须通过连接Tracker来获取其他下载者信息。即peer的IP地址和port号;假设为0,则表明client还能够通过其他方式获取peer的IP地址和port号,如DHT方式。DHT(Distribute Hash Tabel)即分布式哈希表。它是一种以分布式的方式来获取peer的方法,如今很多BTclient既支持通过Tracker来获取peer,也支持通过DHT来获取peer,假设种子文件里没有privatekeyword。则表明不限制一定要通过连接tracker来获取peer。
keyword 含义
单文件 name 共享文件的文件名称。也就是要下载的文件的文件名称。
单文件 length 共享文件的长度,以byte为单位。
单文件 md5sum 可选,是共享文件的md5值,这个值在bt协议中根本不使用。
多文件 name 存放共享文件的目录名字。
多文件 file 它的值是一个列表。含有多个字典,每一个共享文件为一个字典。每一个字典中含有三个keyword:length、md5sum、path
files字典 length 共享文件的长度。以byte为单位。
files字典 md5sum 可选,同上。
files字典 path 存放共享文件的路径和文件名称。

1、单文件传输形式:

name

要下载的文件名称字

length

要下载文件的大小(单位为byte)

md5sum

32为的16进制MD5字符串。

piece length

要下载文件依照piece length指定大小分片,此处指明单个分片大小。

pieces

存储每一个分片的SHA1值(每一个SHA1的hash长度为20byte)

比如:目标文件大小FileSpace为 1039143285 bytes,文件每一个分片大小PerPieceSpace为 1048576 bytes,计算可得:

1039143285 = 1048576 x 991 + 4469

即 FileSpace= PerPieceSpace*991 + 4469

目标文件依照指定大小分片后,为991个满足分片大小的分片文件和1个余数文件。总共是992个小文件。

其存储的SHA1每一个长度为20 bytes。进而可知pieces中存储的SHA1个数为:
NumberOfSHA1 = 19840/20 = 992

即torrent文件的pieces中存储了992个SHA1值。这样每一个小文件都相应上了一个SHA1校验值。

2、多文件传输形式

files

表示该torrent为多文件形式,每一个文件都是dictionary类型数据表示。

name

表示多个文件存储在以name命名的目录。

length

要下载文件的大小(单位为byte)

path

指出要下载文件存储相对于name字段表示的目录的位置。

如果name为dir1,此时:

  1. 假设path值为file1.rmvb。表示file1.rmvb的存储路径为dir1\file1.rmvb

  2. 假设path值为dir2\file1.rmvb。表示file1.rmvb的存储路径为dir1\dir2\file1.rmvb

md5sum

32位的16进制MD5值字符串。

piece length

要下载文件安装piece length指定大小分片,此处指明单个分片大小。

pieces

存储每一个分片的SHA1值(每一个SHA1的hash长度为20字节)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇