B编码分析

什么是B编码

B编码是种子文件以及tracker服务器返回信息的编码格式,DHT协议和BT协议传输的格式都是经过B编码压缩的

B编码格式

B编码有以下4种数据类型:

  • 字符串:编码格式为<十进制ASCII编码的长度>:<字符串>,需要注意的是字符串没有开始结束符。如4:span,表示字符串span。
  • 整数:编码格式为i<十进制ASCII编码的整数>e,以i开头,e结尾,中间的数值可以是负数,如i-3e是有效的。
  • 列表:编码格式为l<编码值>e,以l开头,e结尾,<编码值>可以是任意的B编码的字符串、整数、字典或者其他列表。如l4:info3:path,表示由字符串info、path组成的列表。
  • 字典:编码格式为d<字符串><编码元素>e,以d开头,e结尾。 需要注意的是<字符串>必须是B编码的字符串,<编码元素>可以是任意的B编码的字符串、整数、列表或者其他字典。

种子文件结构

种子文件里的内容其实就是文本,是经过B编码之后的文本。它主要包含以下字段

主文件结构

  • info:必须,一个描述torrent文件的字典,有两种可能形式,一种是没有目录结构的“单一文件”,一种是有目录结构的“多文件”
  • announce:可选,tracker服务器的地址URL(字符串)
  • announce-list:可选,tracker服务器列表,这是官方规范的一个扩展,向后兼容,用来存储备用服务器列表
  • creation date:可选,torrent文件的创建时间,为Unix时间戳
  • comment:可选,备注信息
  • created by:可选,说明torrent文件是由哪个程序创建的
  • encoding:可选,种子文件的默认编码
  • nodes:可选,这个字段包含一系列ip和相应端口的列表,用于连接DHT初始node

info结构

所有关于下载的文件的信息都在这个字段里,它包括多个子字段,而且根据下载的是单个文件还是多个文件,子字段会有所不同

单文件结构如下:

  • name:必须,文件名(字符串)
  • name.utf-8:可选,内容同上,区别在于使用了UTF-8编码
  • length:文件长度,单位字节(整数)
  • piece length:必须,每个块的大小,单位字节(整数)
  • pieces:必须,文件的特征信息,该字段比较大,实际上是种子内包含所有的文件段的SHA1的校验值的连接,即将所有文件按照piece length的字节大小分成块,每块计算一个SHA1值,然后将这些值连接起来就形成了pieces字段,由于SHA1的校验值为20Byte,所以该字段的大小始终为20的整数倍字节。该字段是种子文件中体积最大的部分,可见如果大文件分块很小,会造成种子文件体积十分庞大
  • publisher:可选,发布者的名字
  • publisher.utf-8:可选,发布者的名字的utf-8编码
  • publisher-url:可选,发布者的网址
  • publisher-url.utf-8:可选,发布者网址的utf-8编码。

多文件结构如下:

  • files:必须,是一个列表,存储文件的名字与大小信息,该字段包含以下三个子字段:

    • length:必须,文件的大小(字节)
    • path:必须,是一个列表,从上到下识别,最末尾的字段是文件名,前面的是文件路径。内容在下载时不允许更改
    • path.utf-8:可选,内容同上,区别在于使用了UTF-8编码
  • name:必须,推荐的文件夹名,此项可于下载时更改(字符串)

  • name.utf-8:可选,内容同上,区别在于使用了UTF-8编码

  • piece length:必须,每个块的大小,单位字节(整数)

  • pieces:必须,文件的特征信息,该字段比较大,实际上是种子内包含所有的文件段的SHA1的校验值的连接,即将所有文件按照piece length的字节大小分成块,每块计算一个SHA1值,然后将这些值连接起来就形成了pieces字段,由于SHA1的校验值为20Byte,所以该字段的大小始终为20的整数倍字节。该字段是种子文件中体积最大的部分,可见如果大文件分块很小,会造成种子文件体积十分庞大

  • publisher:可选,发布者的名字

  • publisher.utf-8:可选,发布者的名字的utf-8编码

  • publisher-url:可选,发布者的网址

  • publisher-url.utf-8:可选,发布者网址的utf-8编码。

当种子里包含单个文件时,name字段描述的是资源的名称了,此时name字段在下载时不允许更改

简单的例子了解一下种子文件和B编码

工欲善其事,必先利其器,要想更好地了解B编码,就需要拿一个种子文件来分析其中的内容。我们可以自己去随便一个网站下载一个种子文件下来,下载的话使用用迅雷之类的软件就行了。然后使用BEncode Editor v0.7.1 for Windows这个软件打开种子,可以看到类似下面的内容,和我们之前描述的差不多

种子内容

说明

Python下有现成的包bencoder,bencode.pyx

参考资料

-B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!