12 个不稳定版本 (3 个重大变更)
使用旧的 Rust 2015
0.4.4 | 2017 年 11 月 17 日 |
---|---|
0.4.1 | 2017 年 10 月 14 日 |
0.3.0 | 2017 年 2 月 20 日 |
0.2.0 | 2016 年 12 月 31 日 |
0.1.0 | 2015 年 12 月 18 日 |
#1198 in 编码
每月下载量 127 次
在 8 个 crate(直接使用 3 个) 中使用
60KB
1K SLoC
BitTorrent 基础设施项目
用于构建使用 BitTorrent 技术的应用程序的 crate 集合。
聊天:irc.mozilla.org #bip.rs
Bencode (bip_bencode) -
关于:Bencode 是 BitTorrent 技术中从元信息文件到 DHT 消息使用的二进制编码。Bencode 类型包括整数、字节数组、列表和字典,其中最后两种可以包含任何 bencode 类型(它们可以是递归构建的)。
磁盘 (bip_disk) -
关于:磁盘管理涉及将块存储/加载到实现 FileSystem
接口的对象中,这意味着 torrent 存储可以作为磁盘透明地发送,存储在内存中,推送到一个分布式文件系统,或者在块到来时上传到云端。此外,在将足够多的块发送到磁盘管理器以组成完整块时,会发送通知以检测到好或坏的块。
握手 (bip_handshake) -
关于:握手是连接对等体并交换有关对等体如何与您以及反之亦然的通信信息的进程。在我们的案例中,有许多比特orrent技术可以一般性地被认为是发现对等体的机制(本地对等体发现、DHT、跟踪器、对等体交换),一旦发现对等体,客户端可能想要立即通过握手尝试建立连接。此模块提供了一种自定义握手实现的特质,以及标准的比特orrent握手,以便客户端可以为发现对等体服务指定握手机制,以便将联系信息传递下去。
对等体(bip_peer)-
关于:与比特orrent对等体通信涉及阻塞(告诉某人我们现在不会回应他们)、表达兴趣(告诉某人,如果我们解除阻塞,我们会对某些数据感兴趣),以及向对等体下载和上传数据块。此软件包定义了一些常见的比特orrent消息,包括那些在 ExtensionBits
中作为 bip_handshake
部分的内容,以及包含在 扩展协议 中的内容。我们还提供了一个 PeerManager
用于心跳对等体和复用对等体发送和接收的消息,以便客户端更容易与多个对等体异步通信。
选择(bip_select)-
关于:选择分为三类算法。首先,我们有 数据块揭示,它侧重于确定我们应该向谁揭示哪些数据块(即使我们没有该数据块...)。其次,我们有 数据块选择,它侧重于我们应该下载/上传哪些数据块。第三,我们有 数据块排队,给定一个我们想要下载的数据块,我们应该向哪些对等体发送此类请求。我们可以混合和匹配不同的算法,以创建可能具有与其他群集不同特性的群集。
主线DHT(bip_dht)-
关于:主线DHT被比特orrent用于分发对特定文件感兴趣的对等体的联系信息。更普遍地,任何应用程序都可以使用主线DHT以分布式和去中心化的方式发现对等体。只要您的应用程序有通过SHA-1哈希(20字节值)公开对其他对等体感兴趣的方式,您就可以利用DHT。
示例:例如,一个去中心化的聊天应用程序可以要求用户输入要加入的房间名称,然后您可以对该房间名称进行哈希处理,并使用该应用程序搜索其他也感兴趣加入同一房间的对等体。
元信息(bip_metainfo)-
关于:元信息文件的核心作用是为对特定文件感兴趣的客户端提供校验和列表、每个哈希块的长度以及文件的目录结构。这使得客户端能够验证接收到的文件完整性,以及能够精确地重建文件的目录结构。除此之外,还可以在该文件中包含大量可选信息,例如在DHT中要联系的路由节点、要联系的反向代理以及注释、创建日期、创建元信息文件的人等。
追踪器(bip_utracker) -
关于:追踪器为bittorrent生态系统内的节点发现提供了一个集中式解决方案。客户端向一组特定的追踪器发送消息,更新它们与文件下载相关的任何状态变化。然而,我们可以使用启动和停止事件,以通用的方式使用追踪器来添加或删除自己,以实现任何应用的节点发现。
参考资料
- 官方规范
- 可读规范
- 非官方规范
- 其他有趣论文
许可证
许可协议为以下之一
- Apache License,版本2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,均应按上述方式双许可,不附加任何其他条款或条件。
lib.rs
:
用于解析和转换bencoded数据的库。
示例
解码bencoded数据
extern crate bip_bencode;
use std::default::Default;
use bip_bencode::{BencodeRef, BRefAccess, BDecodeOpt};
fn main() {
let data = b"d12:lucky_numberi7ee";
let bencode = BencodeRef::decode(data, BDecodeOpt::default()).unwrap();
assert_eq!(7, bencode.dict().unwrap().lookup("lucky_number".as_bytes())
.unwrap().int().unwrap());
}
编码bencoded数据
#[macro_use]
extern crate bip_bencode;
fn main() {
let message = (ben_map!{
"lucky_number" => ben_int!(7),
"lucky_string" => ben_bytes!("7")
}).encode();
assert_eq!(&b"d12:lucky_numberi7e12:lucky_string1:7e"[..], &message[..]);
}
依赖项
~2.5–3.5MB
~73K SLoC