BitTorrent协议规范(BitTorrent Protocol Specification)系列之B编码(Bencoding)-第一部分
鉴定
BitTorrent是由布莱姆·科恩设计的一个端对端(peer to peer)文件共享协议,此协议使多个peers通过不可信任的网络的文件传输变得更容易。
目的
此规范的目的是详细介绍 BitTorrent 协议规范 v1.0 。Bram 的协议规范网站 http://www.bittorrent.com/protocol.html 简要地叙述了此协议,在部分范围缺少详细的行为阐述。该文档使用清楚明确的措辞书写,希望它能够成为一个正式的规范,当然也可用于将来实现和讨论的基础。
此文档旨在由 BitTorrent 开发社区维护和使用。欢迎大家为它做贡献,其中的内容仅代表当前协议,但它已经被目前许多存在的客户端实现所采用。
应用范围
本文档适用于 BitTorrent 协议规范的第一版(v1.0)。目前,这份文档应用于 torrent 文件结构规范、peer wire协议规范和Tracker HTTP/HTTPS 协议规范。如果某个协议有了新的修订,请到对应页面查看,而不是在这里。
(译者注:在本文档翻译过程中,如果遇到没有对应标准翻译的术语,一律不予翻译,例如torrent,peer,tracker等)
约定
为了简明和准确地表达信息,在本文档中,使用了许多约定。
peer v/s 客户端(client):在本文档中,一个peer可以是任何参与下载的 BitTorrent 客户端。客户端也是一个peer,尽管 BitTorrent 客户端运行在本地机器上。本规范的读者可能会认为自己是连接了许多peer的客户端。
片(piece) v/s 块(block):在本文档中,片是指在元信息文件(metainfo file)中描述的一部分已下载的数据,它可通过 SHA-1 hash 来验证。而块是指客户端向peer请求的一部分数据。两块或更多块组成一个完整的可以被验证的片。
实际标准(defacto standard):粗斜体文本指出一个规则在许多不同的BitTorrent客户端实现中如此通用,以致于该规则被当做是一个实际标准。
(译者注:peer一般翻译成‘端’,所以p2p应该翻译成端对端,但是这并没有一个标准的译法,因此在本文中不作翻译,同时读者应该将peer to peer和数据链路层的点对点协议(也缩写为p2p)区分开)
B编码(Bencoding)
B编码是一种以简洁的格式描述和组织数据的方法。支持下列类型:字节串、整数、lists和dictionaries。
字节串
字节串按如下方式编码:<以十进制ASCII编码的串长度>:<串数据>
注意:字节串编码没有开始和结束分隔符。
例:4:spam表示字节串“spam”
整数
整数按如下方式编码:i<以十进制ASCII编码的整数>e
开始的“i”与结尾的“e”分别是开始和结束分隔符。可以使用如“i-3e”之类的负数。但是你不能把“0”放到数字的前面,如“i04e”。另外,“i0e”是有效的。
例:“i3e”表示整数“3”
注意:对于这个整数的最大位数规范并没有做出规定,(待译)
lists
lists按如下方式编码:l<B编码值>e
开始的“l”(l是小写的L,而不是大写的i)与结尾的“e”分别是开始和结束分隔符。lists可以包含任何B编码的类型,包括整数、串、dictionaries和其他的lists。
例:l4:spam4:eggse 表示含有两个串的lists:[“spam”、“eggs”]
dictionaries
dictionaries按如下方式编码:d<B编码串><B编码元素>e
开始的“d”与结尾的“e”分别是开始和结束分隔符。 注意键(key)必须被B编码为串。值可以是任何B编码的类型,包括整数、串、lists和其他的dictionaries。键(key)必须是串,并且以排序的顺序出现(以原始串排列,而不是以字母数字顺序)。串采用二进制比较方式,而不是特定于某种文化的自然比较(即既不是按照中文的比较方式,也不是按照英文的排序方式)。
例1:d3:cow3:moo4:spam4:eggse 表示dictionary { "cow" => "moo", "spam" => "eggs" }
例2:d4:spaml1:a1:bee 表示dictionary { "spam" => ["a", "b"] }
例3:d9:publisher3:bob17:publisher-webpage15:www.example.com18:publisher.location4:homee表示dictionary { "publisher" => "bob", "publisher-webpage" => "www.example.com", "publisher.location" => "home" }
(译者注:对于string和integer,目前已经存在官方的翻译,但是list和dictionary并没有存在一个统一的译法,在此以原文示之,相信学过Java和c#的人不会对这两个术语感到陌生)
B编码实现
C
Perl
Java
Python by Hackeron
Decoding encoding bencoded data with haskell by Edi
Objective-C by Chrome