zoukankan      html  css  js  c++  java
  • Torrent 文件图文解析

    Torrent文件格式分析


    首先。我在网上找一个近期比較流行的大片《环太平洋》的torrent文件。通过用UE把它打开。我们来看一下此torrent文件的内容:

    d8:announce39:http://tracker.bestxl.com:8077/announce13:announce-listll39:http://tracker.bestxl.com:8077/announceel30:http://tracker.prq.to/announceee8:codepagei936e13:creation datei1381766089e4:infod5:filesld6:lengthi202e4:pathl40:本片简单介绍,海报,截图等,双击进入查看.urle10:path.utf-8l58:鏈�墖绠€浠嬶紝娴锋姤锛屾埅鍥剧瓑锛屽弻鍑昏繘鍏ユ煡鐪?urleed6:lengthi275e4:pathl37:飞鸟网-和浪子一起来开心农场偷菜吧.urle10:path.utf-8l53:椋為笩缃?

    鍜屾氮瀛愪竴璧锋潵寮€蹇冨啘鍦哄伔鑿滃惂.urleed6:lengthi266e4:pathl45:飞鸟娱乐-边看电影边学英语,娱乐学习两不误.urle10:path.utf-8l65:椋為笩濞变箰-杈圭湅鐢靛奖杈瑰�鑻辫�锛屽ū涔愬�涔犱袱涓嶈�.urleed6:lengthi2640e4:pathl37:飞鸟娱乐论坛-超多最新爆爽资源下载.rtfe10:path.utf-8l53:椋為笩濞变箰璁哄潧-瓒呭�鏈€鏂扮垎鐖借祫婧愪笅杞?rtfeed6:lengthi288e4:pathl45:飞鸟娱乐原创IMDB TOP250 经典大片 一网打尽.urle10:path.utf-8l59:椋為笩濞变箰鍘熷垱IMDB TOP250 缁忓吀澶х墖 涓€缃戞墦灏?urleed6:lengthi2195501970e4:pathl55:环太平洋 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4e10:path.utf-8l59:鐜�お骞虫磱 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4eed6:lengthi266e4:pathl35:老调网-下载中英字幕电影的好地方.urle10:path.utf-8l50:鑰佽皟缃?涓嬭浇涓�嫳瀛楀箷鐢靛奖鐨勫ソ鍦版柟.urleee4:name51:环太平洋 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD10:name.utf-855:鐜�お骞虫磱 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD12:piece lengthi2097152e6:pieces20940:(此处省略20940个字节的hash值,每一个piece的hash值占用20个字节,即20940/20=1047个piece。) 9:publisher8:飞鸟娱乐13:publisher-url21:http://bbs.hdbird.com19:publisher-url.utf-821:http://bbs.hdbird.com15:publisher.utf-812:椋為笩濞变箰e5:nodesll21:router.bittorrent.comi6881eel20:router.lanspirit.neti53eeee

    以下我们開始具体解说一下torrent文件格式:

    B编码

    为了在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部分

    d8:announce39:http://tracker.bestxl.com:8077/announce13:announce-listll39:http://tracker.bestxl.com:8077/announceel30:http://tracker.prq.to/announceee8:codepagei936e13:creation datei1381766089e

    就可以理解为:

    announce = [ ‘http://tracker.bestxl.com:8077/announce’]

    announce-list = [‘http://tracker.bestxl.com:8077/announce’,’http://tracker.prq.to/announce’]

    codepage = 936                    #代码936 中文简体GBK

    creation date = 1381766089        #unix时间格式。此处是2013-10-14 23:54:49

    种子文件结构

    keyword

    含义

    info

    该keyword相应的值是一个字典。它有两种模式,”single file”和”multiple file”:单文件模式和多文件模式,单文件模式是指共享的文件仅仅有一个,多文件模式是指提供共享的文件不止一个。而是两个或两个以上,假设使用BT软件下载一部影片时,影片的上下部分可能分别放在不同的文件中。

    announce

    必选

    该keyword的值为Tracker的URL。

    announce-list

    可选

    它的值存放的是备用Tracker的URL。

    creation-date

    可选

    该keyword相应的值存放的是种子文件创建的时间。

    comment

    可选

    它的值存放的是种子文件制作者的备注信息。

    created by

    可选

    值存放生成种子文件的BTclient软件的信息,如client名、版本。

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

    1、announce部分(红色表示必选,蓝色部分表示可选)

    比如:

     

    announce

    默认的trackerserver地址

    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次序尝试。

    creation date

    torrent文件的创建时间,为UNIX时间格式。

    comment

    string类型,是关于torrent文件的描写叙述信息。

    created by

    创建此torrent文件的程序信息。

    encoding

    指出info中pieces部分的编码类型,一般为UTF-8。有时也会遇到GBK。

    比如文件前面的B编码

    d8:announce39:http://tracker.bestxl.com:8077/announce13:announce-listll39:http://tracker.bestxl.com:8077/announceel30:http://tracker.prq.to/announceee8:codepagei936e13:creation datei1381766089e

    可分解为

    d

      8:announce

      39:http://tracker.bestxl.com:8077/announce

      13:announce-list

      

        l39:http://tracker.bestxl.com:8077/announcee

        l30:http://tracker.prq.to/announcee

      e

      8:codepage

      i936e

      13:creation date

      i1381766089e

    #上图中:D表示字典型、S表示字符串型、L表示列表型、N表示数值型

    2、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。

    单文件

    name

    共享文件的文件名称。也就是要下载的文件的文件名称。

    length

    共享文件的长度,以byte为单位。

    md5sum

    可选,是共享文件的md5值,这个值在bt协议中根本不是用。

    多文件

    name

    存放共享文件的目录名字。

    file

    它的值是一个列表。含有多个字典,每一个共享文件为一个字典。每一个字典中含有三个keyword:length、md5sum、path

    files字典

    length

    共享文件的长度。以byte为单位。

    md5sum

    可选,同上。

    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的存储路径为dir1file1.rmvb

    2) 假设path值为dir2file1.rmvb。表示file1.rmvb的存储路径为dir1dir2file1.rmvb

    md5sum

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

    piece length

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

    pieces

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

    以下我们看一下info部分的演示样例:

     4:infod5:filesld6:lengthi202e4:pathl40:本片简单介绍,海报,截图等,双击进入查看.urle10:path.utf-8l58:鏈�墖绠€浠嬶紝娴锋姤锛屾埅鍥剧瓑锛屽弻鍑昏繘鍏ユ煡鐪?

    urleed6:lengthi275e4:pathl37:飞鸟网-和浪子一起来开心农场偷菜吧.urle10:path.utf-8l53:椋為笩缃?鍜屾氮瀛愪竴璧锋潵寮€蹇冨啘鍦哄伔鑿滃惂.urleed6:lengthi266e4:pathl45:飞鸟娱乐-边看电影边学英语,娱乐学习两不误.urle10:path.utf-8l65:椋為笩濞变箰-杈圭湅鐢靛奖杈瑰�鑻辫�锛屽ū涔愬�涔犱袱涓嶈�.urleed6:lengthi2640e4:pathl37:飞鸟娱乐论坛-超多最新爆爽资源下载.rtfe10:path.utf-8l53:椋為笩濞变箰璁哄潧-瓒呭�鏈€鏂扮垎鐖借祫婧愪笅杞?

    rtfeed6:lengthi288e4:pathl45:飞鸟娱乐原创IMDB TOP250 经典大片 一网打尽.urle10:path.utf-8l59:椋為笩濞变箰鍘熷垱IMDB TOP250 缁忓吀澶х墖 涓€缃戞墦灏?urleed6:lengthi2195501970e4:pathl55:环太平洋 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4e10:path.utf-8l59:鐜�お骞虫磱 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4eed6:lengthi266e4:pathl35:老调网-下载中英字幕电影的好地方.urle10:path.utf-8l50:鑰佽皟缃?涓嬭浇涓�嫳瀛楀箷鐢靛奖鐨勫ソ鍦版柟.urleee4:name51:环太平洋 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD10:name.utf-855:鐜�お骞虫磱 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD12:piece lengthi2097152e6:pieces20940: (此处省略20940个字节的hash值,每一个piece的hash值占用20个字节。即20940/20=1047个piece。

    ) 9:publisher8:飞鸟娱乐13:publisher-url21:http://bbs.hdbird.com19:publisher-url.utf-821:http://bbs.hdbird.com15:publisher.utf-812:椋為笩濞变箰e5:nodesll21:router.bittorrent.comi6881eel20:router.lanspirit.neti53eeee

    分解文件为

    4:info

    d

      5:files

        l

    d

            6:length

            i202e

            4:path

            l40:本片简单介绍,海报,截图等,双击进入查看.urle

            10:path.utf-8

            l58:鏈�墖绠€浠嬶紝娴锋姤锛屾埅鍥剧瓑锛屽弻鍑昏繘鍏ユ煡鐪?urle

          e

          d

            6:length

            i275e

            4:path

            l37:飞鸟网-和浪子一起来开心农场偷菜吧.urle

            10:path.utf-8

            l53:椋為笩缃?鍜屾氮瀛愪竴璧锋潵寮€蹇冨啘鍦哄伔鑿滃惂.urle

          e

          d

            6:length

            i266e

            4:path

            l45:飞鸟娱乐-边看电影边学英语,娱乐学习两不误.urle

            10:path.utf-8

            l65:椋為笩濞变箰-杈圭湅鐢靛奖杈瑰�鑻辫�锛屽ū涔愬�涔犱袱涓嶈�.urle

          e

          d

            6:length

            i2640e

            4:path

            l37:飞鸟娱乐论坛-超多最新爆爽资源下载.rtfe

            10:path.utf-8

            l53:椋為笩濞变箰璁哄潧-瓒呭�鏈€鏂扮垎鐖借祫婧愪笅杞?

    rtfe

          e

          d

            6:length

            i288e

            4:path

            l45:飞鸟娱乐原创IMDB TOP250 经典大片 一网打尽.urle

            10:path.utf-8

            l59:椋為笩濞变箰鍘熷垱IMDB TOP250 缁忓吀澶х墖 涓€缃戞墦灏?urle

          e

          d

            6:length

            i2195501970e

            4:path

            l55:环太平洋 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4e

            10:path.utf-8

            l59:鐜�お骞虫磱 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4e

          e

          d

            6:length

            i266e

            4:path

            l35:老调网-下载中英字幕电影的好地方.urle

            10:path.utf-8 

            l50:鑰佽皟缃?

    涓嬭浇涓�嫳瀛楀箷鐢靛奖鐨勫ソ鍦版柟.urle

          e

        e     #这是紧随files后L的结束符。

    4:name

        51:环太平洋 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD      #存放共享文件的目录名字

        10:name.utf-8

        55:鐜�お骞虫磱 Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD

        12:piece length

        i2097152e

        6:pieces

    20940:....................           #20940/20=1047个piece

       

    9:publisher

    8:飞鸟娱乐

    13:publisher-url

    21:http://bbs.hdbird.com

    19:publisher-url.utf-8

    21:http://bbs.hdbird.com

    15:publisher.utf-8

    12:椋為笩濞变箰

    e  #这个e是紧随info后面d的结束符

    5:nodes       

    l

        l

          21:router.bittorrent.com

          i6881e

        e

        l

          20:router.lanspirit.net

          i53e

        e

      e

    e   #这个e是文件开头d的结束符

    #这个nodes部分是torrent文件的扩展,包括IP和port的列表,用于连接DHT网络的初始节点。并通过这些节点进行find_node

    终于维护一张完整的DHT路由表。

     

    至此!torrent文件格式所有解说完成,有时间再把BT的通信过程总结一下以作编程及(P2SP、P4P)网络使用。


  • 相关阅读:
    Hadoop Mapreduce分区、分组、二次排序过程详解
    hadoop的NullWritable
    CentOS7.0修改主机名(hostname)
    Linux下不重启永久修改hostname
    稀缺——我们是如何陷入贫穷与忙碌的
    slf4j log4j logback关系详解和相关用法
    使用logstash+elasticsearch+kibana快速搭建日志平台
    安装XAMPP时出现 unable to realloc 83886080 bytes
    ElasticSearch查询max_result_window问题处理
    后台CMS日志处理记录
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6847052.html
Copyright © 2011-2022 走看看