BitTorrent 协议规范(翻译)

2008-02-23 05:26:57来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

BitTorrent 协议规范原文(英文)

BitTorrent 是一种分发文档的协议。他通过URL来识别内容,并且能够无缝的和web进行交互。他基于HTTP协议,他的优势是:假如有多个下载者并发的下载同一个文档,那么,每个下载者也同时为其他下载者上传文档,这样,文档源能够支持大量的用户进行下载,而只带来适当的负载的增长。(译注:因为大量的负载被均衡到整个系统中,所以提供源文档的机器的负载只有少量增长)

一个BT文档分布系统由下列实体组成:
一个普通的web服务器
一个静态的“元信息”文档
一个跟踪(tracker)服务器
终端用户的web浏览器
终端下载者

理想的情况是多个终端用户在下载同一个文档。
要提供文档共享,那么一台主机需要执行以下步骤:
Ø运行一个 tracker服务器(或,已有一个tracker服务器在运行了也能够)
Ø运行一个web服务器,例如apache,或已有一个web服务器在运行了。
Ø在web服务器上,将文档扩展名.torrent 和MIME类型 application/x-bittorrent关联起来(或已关联了)
Ø根据 tracker服务器的 URL 和要共享的文档来创建一个“元信息”文档(.torrent)。
Ø将“元信息”文档发布到web服务器上
Ø在某个web页面上,添加一个到“元信息”文档的链接。
Ø运行一个已拥有完整文档的下载者(被成为’origin’,或’seed’,种子)

要开始下载文档,那么终端用户执行以下步骤:
Ø安装 BT(或已安装)
Ø访问提供 .torrent 文档的web服务器
Ø点击到 .torrent 文档的链接(译注:这时候,bt会弹出一个对话框)
Ø选择要把下载的文档保存到哪里?或是一次断点续传
Ø等待下载的完成。
Ø结束bt程式的运行(假如不主动结束,那么bt会一直为其他人提供文档上传)

各个部分之间的连通性如下:
网站负责提供一个静态的文档,而把BT辅助程式(客户端)放在客户端机器上。
Trackers从任何下载者处接收信息,并返回给他们一个随机的peers的列表。这种交互是通过HTTP或HTTPS协议来完成的。
下载者周期性的向tracker登记,使得tracker能了解他们的进度;下载者之间通过直接连接进行数据的上传和下载。这种连接使用的是 BitTorrent 对等协议,他基于TCP。
Origin只负责上传,从不下载,因为他已拥有了完整的文档。Origin是必须的。

元文档和tracker的响应都采用的是一种简单、有效、可扩展的格式,被称为bencoding,他能够包含字符串和整数。由于对无需的字典关键字能够忽略,所以这种格式具备可扩展性,其他选项以后能够方便的加进来。

Bencoding格式如下:
对于字符串,首先是个字符串的长度,然后是冒号,后面跟着实际的字符串,例如:4:spam,就是“ spam”
整数编码如下,以 ‘i’ 开始,然后10进制的整数值,最后以’e’结尾。例如,i3e表示3,I-3e表示-3。整数没有大小限制。I-0e是无效的。除了 i0e外,所以以0起始的整数都无效。I0e当然表示0。
列表编码如下,以’l’开始,接下来是列表值的编码(也采用bencoded编码),最后以’e’结束。例如:l4:spam4:eggse 表示 [‘spam’, ‘eggs’]。
字典编码如下,以’d’开始,接下来是可选的keys和他对应的值,最户以’e’结束。例如:d3:cow3:moo4:spam4:eggse,表示{‘cow’:’moo’,’spam’:’eggs’},而d4:spaml1:al:bee 表示 {‘spam’:[‘a’,’b’]}。键值必须是字符串,而且已排序(并非是按照字母顺序排序,而是根据原始的字符串进行排序)。

元文档是采用bencoded编码的字典,包括以下关键字:

announce tracker的服务器

info 他实际上是个字典,包括以下关键字:

Name:
一个字符串,在保存文档的时候,作为一个建议值。仅仅是个建议而已,您能够用别的名字保存文档。
Piece length:
为了更好的传输,文档被分隔成等长的片断,除了最后一个片断以外,这个值就是片断的大小。片断大小几乎一直都是2的幂,最常用的是 256k(BT的前一个版本3.2,用的是1M作为默认大小)
Pieces:
一个长度为20的整数倍的字符串。他将再被分隔为20字节长的字符串,每个子串都是相应片断的hash值。

此外,更有一个length或files的关键字,这两个关键字只能出现一个。假如是length,那么表示要下载的仅仅是单个文档,假如是files那么要下载的是个目录中的多个文档。
假如是单个文档,那么length是该文档的长度。

为了能支持其他关键字,对于多个文档的情况,也把他当作一个文档来看,也就是按照文档出现的顺序,把每个文档的信息连接起来,形成一个字符串。每个文档的信息实际上也是个字典,包括以下关键字:
Length:文档长度
Path:子目录名称的列表,列表最后一项是文档的实际名称。(不允许出现列表为空的情况)。
Name:在单文档情况下,name是文档的名称,而在多文档情况下,name是目录的名称。

Tracker查询。Trakcer通过HTTP的GET命令的参数来接收信息,而响应给对方(也就是下载者)的是经过bencoded编码的消息。注意,尽管当前的tracker的实现需要一个web服务器,他实际上能够运行的更轻便一些,例如,作为apache的一个模块。
Tracker GET requests have the following keys:

发送给Tracker的GET请求,包含以下关键字:

Info_hash:
元文档中info部分的sha hash,20字节长。这个字符创几乎肯定需要被转义(译注:在URL中,有些字符不能出现,必须通过unicode进行编码)

Peer_id:
下载者的id,一个20字节长的字符串。每个下载者在开始一次新的下载之前,需要随机创建这个id。这个字符串通常也需要被转义。

Ip:
一个可选的参数,给出了peer的ip地址(或dns名称?)。通常用在origin身上,假如他和tracker在同一个机器上。

Port:
peer所监听的端口。下载者通常在在 6881 端口上监听,假如该端口被占用,那么会一直尝试到 6889,假如都被占用,那么就放弃监听。

Uploaded:
已上载的数据大小,十进制表示。

Downloaded:
已下载的数据大小,十进制表示

Left:
该peer更有多少数据没有下载完,十进制表示。注意,这个值不能根据文档长度和已下载数据大小计算出来,因为很可能是断点续传,假如因为检查文档完整性失败而必须重新下载的时候,这也提供了一个机会。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 使用纯粹的C 语言编写COM组件

下一篇: Bjarne:什么是函数对象?