一切都要从一个蝙蝠说起,在家无聊下电影时想到研究下bt的文件结构。
bencode
BT 的种子文件进行了bencode 编码。bencode有4种数据类型:string, integer, list 和 dictionary。
string类型
string类型格式[length]:[string]
,例子:
int类型
int类型格式为i[int]e
,例子:
List类型
List类型(List<object>类型)格式为l[object]e
,例子:
1 2
| List<"abc","ghe"> → l3:abc3:ghee List<"abc",123> → l3:abci123ee
|
Dictionary类型
Dictionary(Dictionary<string, object>)类型格式为d[KeyValue]e
,例子:
1
| Dictionary<{"name":"bob"},{"age":20}> → d4:name3:bob3:agei20ee
|
Torrent结构
解码后分析文件结构信息。在单文件和多文件时,结构略有不同,不过前面部分字段是相同的,不同在info部分,以下说明了主要字段。
多文件情况下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Torrent ├─ announce Tracker主服务器 ├─ announce-list Tracker主服务器列表 ├─ comment 注释 ├─ creation date 创建的时间戳 ├─ created by 创建者 ├─ encoding 默认编码 ├─ info 下载信息相关 | ├─ files | | ├─ length | | ├─ path | | └─ path.utf-8 | ├─ name | ├─ name.utf-8 | ├─ piece length | ├─ pieces | ├─ publisher | ├─ publisher-url | ├─ publisher-url.utf-8 | └─ publisher.utf-8 └─ nodes
|
单文件时:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Torrent ├─announce ├─announce-list ├─comment ├─comment.utf-8 ├─creation date ├─encoding ├─info │ ├─length │ ├─name │ ├─name.utf-8 │ ├─piece length │ ├─pieces │ ├─publisher │ ├─publisher-url │ ├─publisher-url.utf-8 │ └─publisher.utf-8 └─nodes
|
Info
files
多文件种子的files表示了文件的名字、大小。其包含三个子段:
1 2 3 4 5
| length:文件的大小,byte为单位计算
path:文件的名字,不可改
path.utf-8 文件名的utf-8编码
|
这三个字段每个文件都有一组值。
其他字段
1 2 3 4 5 6 7
| name: 推荐文件夹名,下载时可改 name.utf-8: 上述的utf-8编码 piece length: 每个文件块的大小,Byte计算 pieces: 文件特征信息,其实是文件按照上面大小分段后得到每段的sha1值,然后进行拼接。由于SHA1的校验值为20Byte,所以该字段的大小始终为20的整数倍字节。这说明了文件分段越多torrent文件体积越大。 publisher: 文件发布者名字 publisher-url: 文件发布者的网址 publisher.utf-8 && publisher-url.utf-8: utf-8编码的信息
|
nodes
这个字段包含一系列ip和相应端口的列表,是用于连接DHT初始node。
关于BT协议的下次再看…