• 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

  • 相关阅读:
    2011年 CIO简历该怎么写?
    OC内存管理
    【Android游戏开发十五】关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记!
    【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
    ORA16014: 日志 1 的序列号 83 未归档, 没有可用的目的
    【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
    2011来临 IT人员应该具备哪些技能?
    垃圾控件DatePicker
    【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
    【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/1530848.html
Copyright © 2020-2023  润新知