A
Another_eYes
Unregistered / Unconfirmed
GUEST, unregistred user!
(转载请指明作者)
Bittorrent Protocol Specification v1.0 中文版
官方文档 http://www.bitconjurer.org/BitTorrent/protocol.html
BT协议是BT下载工具的通讯协议,官方文档中有些细节描述不是很详细。最近正在写一个BT下载的DELPHI控件,这里先提供一份个人理解(并参阅了其他一些资料后)的BT协议中文版。希望对打算开发BT下载工具者有所帮助。同时希望大家能指出其中的错误。
BT协议是一种点对点文件多段传输协议,它主要包含三个部分:.torrent文件、和Tracker服务器的通讯协议、和其他客户端的通讯协议。
Bencode编码规则:这是BT协议中的一种主要编码方式,用于.torrent文件和与Tracker服务器通讯时使用。Bencode编码规则非常简单,它将数据归纳为4种类型:
1、 字符串(string)
编码形式:“长度:字符串内容”(不包括“”)
其中:“长度”是一个十进制整数字符串,“字符串内容”是真正的字符串,其中可以包含任意字符。
例如:“个人认为BT官方协议写得有点白痴” --> 30:个人认为BT官方协议写得有点白痴
2、 整数(Int)
编码形式:“i整数字符串e”(不包括“”)
例如:整数1234567 --> i1234567e
3、 列表(list)
编码形式:“l列表内容e”(不包括“”)
例如:列表(“张三”, 23,“男”) --> l4:张三i23e2:男e
4、 字典(dictionary)
编码形式:“d字典内容e”(不包括“”)
可以发现字典的编码和列表一样,除了开头字母是d而不是l。据我个人的理解,一个字典其实就是ini文件中的一个session,只不过具体项不是表现成“key=value”这种形式而是表现成Bencode编码形式而已。一个字典中可以包含很多这种key=value的项,其中的key是Bencode编码的字符串,而value则是上述4种数据类型中的任意一种(和ini不同的当然是不存在那个“=”,也没有一行一项的概念)。
.torrent文件:
大家都知道,BT下载都是先下载一个.torrent文件,然后根据这个.torrent文件的内容开始真正的下载工作。其实.torrent文件就是本次下载的一个配置文件,它的内容就是按Bencode编码的一个字典(dictionary)项,所以所有.torrent文件的第一个字符肯定是“d”,最后一个字符肯定是“e”。下面列出的就是这个字典中的各个key=value项中的key的内容和value的说明:
announce:announce关键字指明Tracker服务器的URL,所以这项的value内容是一个字符串。
Announce-list:这是一个可选项(也就是说也许不存在),并且它是一个扩展协议,不是标准协议的一部分(噢,那它在大多数.torrent文件中是不存在的),它的value是一个list,list中每项是一个string,指出一个备份Tracker服务器的URL。
creation date:这是一个可选项,指出.torrent文件创建的时间。它的value是一个int,记录了从1970-01-01 00:00:00以来所过的秒数。
comment:这是一个可选项,供作者写些关于这个.torrent的废话,它的value是一个string。
created by:这是一个可选项,记录了生成这个.torrent文件的程序的作者与版本号。
Info:它的value是一个字典,.torrent文件中最重要的部分,也是整个.torrent文件的核心内容。它和announce项构成下载所需要的信息(所以写BT程序时分析.torrent文件只需要关心announce项和info项,其他项可以忽略掉)。Info这个字典项有两种形式:分别针对单个文件和针对一批文件。
针对单个文件:主要包含以下key=value项:
length:指明文件长度,它的value是一个int
md5sum:可选项(忽略掉它好了)。是一个32字节长的16进制数字符串,是这个文件的MD5码。
name:指明文件名,它的value是一个字符串
piece length:指明每个文件块的长度,它的value是一个int
pieces:它的value是一个字符串,包含一系列文件块的SHA1校验码,每个文件块对应20字节的SHA1校验码,所以这个字符串的长度是20的倍数
针对多个文件:主要包含以下key=value项:
name:指明安装需要所处的根目录名,它的value是一个字符串
piece length:指明每个文件块的长度,它的value是一个int(文件块是按.torrent中包含的所有文件连在一起后的内容算的)
pieces:它的value是一个字符串,包含一系列文件块的SHA1校验码,每个文件块对应20字节的SHA1校验码,所以这个字符串的长度是20的倍数
files:它的value是一个list,list中每项是一个字典(晕),指明每个文件的文件路径、文件名、文件长度等信息。这个字典主要包含以下key=value项:
length:文件的长度,它的value是一个int
md5sum:可选项(忽略掉它算了),它的value是一个字符串
path:它的value是一个list(呵呵,昏倒了吗?),这个list中每项是个字符串,将list中所有字符串中间加上‘/’连在一起之后就是包含路径的文件名
注意:.torrent文件中除了上述内容外可能还包含其他key=value项,不过那些都是扩展协议,也许针对特定BT程序才有效。所以这里不作什么说明了(也没能力说明)
和Tracker服务器之间的通讯协议
(待续)
Bittorrent Protocol Specification v1.0 中文版
官方文档 http://www.bitconjurer.org/BitTorrent/protocol.html
BT协议是BT下载工具的通讯协议,官方文档中有些细节描述不是很详细。最近正在写一个BT下载的DELPHI控件,这里先提供一份个人理解(并参阅了其他一些资料后)的BT协议中文版。希望对打算开发BT下载工具者有所帮助。同时希望大家能指出其中的错误。
BT协议是一种点对点文件多段传输协议,它主要包含三个部分:.torrent文件、和Tracker服务器的通讯协议、和其他客户端的通讯协议。
Bencode编码规则:这是BT协议中的一种主要编码方式,用于.torrent文件和与Tracker服务器通讯时使用。Bencode编码规则非常简单,它将数据归纳为4种类型:
1、 字符串(string)
编码形式:“长度:字符串内容”(不包括“”)
其中:“长度”是一个十进制整数字符串,“字符串内容”是真正的字符串,其中可以包含任意字符。
例如:“个人认为BT官方协议写得有点白痴” --> 30:个人认为BT官方协议写得有点白痴
2、 整数(Int)
编码形式:“i整数字符串e”(不包括“”)
例如:整数1234567 --> i1234567e
3、 列表(list)
编码形式:“l列表内容e”(不包括“”)
例如:列表(“张三”, 23,“男”) --> l4:张三i23e2:男e
4、 字典(dictionary)
编码形式:“d字典内容e”(不包括“”)
可以发现字典的编码和列表一样,除了开头字母是d而不是l。据我个人的理解,一个字典其实就是ini文件中的一个session,只不过具体项不是表现成“key=value”这种形式而是表现成Bencode编码形式而已。一个字典中可以包含很多这种key=value的项,其中的key是Bencode编码的字符串,而value则是上述4种数据类型中的任意一种(和ini不同的当然是不存在那个“=”,也没有一行一项的概念)。
.torrent文件:
大家都知道,BT下载都是先下载一个.torrent文件,然后根据这个.torrent文件的内容开始真正的下载工作。其实.torrent文件就是本次下载的一个配置文件,它的内容就是按Bencode编码的一个字典(dictionary)项,所以所有.torrent文件的第一个字符肯定是“d”,最后一个字符肯定是“e”。下面列出的就是这个字典中的各个key=value项中的key的内容和value的说明:
announce:announce关键字指明Tracker服务器的URL,所以这项的value内容是一个字符串。
Announce-list:这是一个可选项(也就是说也许不存在),并且它是一个扩展协议,不是标准协议的一部分(噢,那它在大多数.torrent文件中是不存在的),它的value是一个list,list中每项是一个string,指出一个备份Tracker服务器的URL。
creation date:这是一个可选项,指出.torrent文件创建的时间。它的value是一个int,记录了从1970-01-01 00:00:00以来所过的秒数。
comment:这是一个可选项,供作者写些关于这个.torrent的废话,它的value是一个string。
created by:这是一个可选项,记录了生成这个.torrent文件的程序的作者与版本号。
Info:它的value是一个字典,.torrent文件中最重要的部分,也是整个.torrent文件的核心内容。它和announce项构成下载所需要的信息(所以写BT程序时分析.torrent文件只需要关心announce项和info项,其他项可以忽略掉)。Info这个字典项有两种形式:分别针对单个文件和针对一批文件。
针对单个文件:主要包含以下key=value项:
length:指明文件长度,它的value是一个int
md5sum:可选项(忽略掉它好了)。是一个32字节长的16进制数字符串,是这个文件的MD5码。
name:指明文件名,它的value是一个字符串
piece length:指明每个文件块的长度,它的value是一个int
pieces:它的value是一个字符串,包含一系列文件块的SHA1校验码,每个文件块对应20字节的SHA1校验码,所以这个字符串的长度是20的倍数
针对多个文件:主要包含以下key=value项:
name:指明安装需要所处的根目录名,它的value是一个字符串
piece length:指明每个文件块的长度,它的value是一个int(文件块是按.torrent中包含的所有文件连在一起后的内容算的)
pieces:它的value是一个字符串,包含一系列文件块的SHA1校验码,每个文件块对应20字节的SHA1校验码,所以这个字符串的长度是20的倍数
files:它的value是一个list,list中每项是一个字典(晕),指明每个文件的文件路径、文件名、文件长度等信息。这个字典主要包含以下key=value项:
length:文件的长度,它的value是一个int
md5sum:可选项(忽略掉它算了),它的value是一个字符串
path:它的value是一个list(呵呵,昏倒了吗?),这个list中每项是个字符串,将list中所有字符串中间加上‘/’连在一起之后就是包含路径的文件名
注意:.torrent文件中除了上述内容外可能还包含其他key=value项,不过那些都是扩展协议,也许针对特定BT程序才有效。所以这里不作什么说明了(也没能力说明)
和Tracker服务器之间的通讯协议
(待续)