图片来源:https://www.pixiv.net/artworks/113139569
整个 .torrent 文件实际上就是一个包含了约定字段的 bencode 编码字典, bencode 编码规则见 https://blog.geekgo.tech/programming/bencode/
顶层字段
字段(含空格)类型必要含义infoDictionary是包含文件信息的字典,详细结构见下文announceString否tracker 的 URLannounce-listList否额外 tracker,列表的每个元素都是一个字符串列表,每个字符串都是一个 tracker 的 URL (另外官方文档里对这些 tracker 的处理顺序有一些要求,详情见 这里)creation dateInteger否种子创建时间(Unix 时间戳)commentString否没有格式要求的文本备注created byString否创建种子的程序名称和版本(实际也可以填任意其他内容)encodingString否未在官方文档中找到定义,似乎是字符串编码,值多为 UTF-8,但 The BitTorrent Protocol Specification 已经明确了 “All strings in a .torrent file that contains text must be UTF-8 encoded.”。这里 的解释是 “the string encoding format used to generate the pieces part of the info dictionary in the .torrent metafile ”httpseedsList否每个元素是一个 URL,通过在 URL 后添加参数可以直接从这些网站下载需要的 torrent 数据,详见 这里
info 字典结构
info 的结构分为单文件和多文件两种情况
单文件
字段(含空格)类型必要含义nameString是文件名lengthInteger是文件长度,单位 bytemd5sumString否MD5 校验和 (32个十六进制字符),bittorrent 中实际完全用不到该值piece lengthInteger是每个分片的长度,单位字节piecesString是 每 20 字节是对应分片的 SHA1 值(二进制字节串,非十六进制字符)privateInteger否当存在 private 字段且设置为 1 时,bittorrent 客户端仅向种子文件中声明的 tracker 声明自己的存在,并且仅与该 tracker 返回的其他客户端连接(一些 Private Tracker,即 PT 站会用到该字段 )info 单文件结构
多文件
字段(含空格)类型必要含义nameString是顶层文件夹名filesList是每个元素都是一个字典,对应一个文件,字典包含文件长度、路径和 MD5 校验和,详见下文piece lengthInteger是同单文件piecesString是同单文件privateInteger否同单文件info 多文件结构
files 列表中每个字典的结构
字段类型必要含义lengthInteger是文件长度,单位 bytemd5sumString否MD5 校验和 (32个十六进制字符),bittorrent 中实际完全用不到该值pathList是字符串列表,表示文件路径,路径中的文件夹和文件名会按顺序拆分成列表中的元素,如:dir1/dir2/file.ext,会被编码为 l4:dir14:dir28:file.exte
参考:
https://wiki.theory.org/BitTorrentSpecification#Metainfo_File_Structure
Private Torrents
Multitracker Metadata Extension
HTTP Seeding
The BitTorrent Protocol Specification