#gossip-protocol #mesh #swim #p2p #gossip #networking

bin+lib kaboodle

基于 SWIM 消息协议的低配置对等发现机制,用于构建对等网络和网状应用程序

5 个版本

0.1.5 2023 年 4 月 13 日
0.1.4 2023 年 4 月 4 日
0.1.3 2023 年 3 月 30 日

6#gossip-protocol

每月 34 次下载

BSD-2-Clause-Patent

89KB
1.5K SLoC

卡布多

卡布多是一个 Rust crate,包含 SWIM 成员消息协议的近似实现,细节可能有所不同。它可以用来在 LAN 上发现其他对等体,无需任何中心协调,准确跟踪成员资格,随着时间的推移,机器来来去去。

概念与特性

维基百科有 SWIM 协议的简要概述;我们不会详细介绍协议的工作原理。

卡布多通过在特定端口上发送 UDP 组播消息来发现本地网络上的潜在对等体。你选择的端口号由你决定;只需确保所有希望发现彼此的对等体都使用相同的端口号即可。使用卡布多的不同应用程序可以独立地在同一网络上运行,只要它们使用不同的端口号。

你可以选择告诉卡布多使用哪个网络接口。默认情况下,它将选择第一个非环回 IPv6 接口;如果没有可用,它将选择第一个非环回 IPv6 接口。

任何给定的 Kadoodle 运行副本都称为实例。卡布多不知道任何有关实例的信息——它在时间上没有持久身份,只是参与网状的对等体。根据你打算在卡布多之上构建的内容,你可能需要一个持久身份(例如某种机器 ID),你可以访问它。为此,你可以在实例化时为 Kadoodle 提供一个身份。卡布多身份是 Bytes 实例,并由系统视为完全不可透明的数据块;其含义完全取决于你。

检查网状结构

给定足够的时间,特定网状结构中的所有对等体应该会达成一致的看法——也就是说,每个对等体都应该知道其他每个对等体,并且他们都应该注意到某个对等体加入或离开网状结构。卡布多跟踪网状的“指纹”,它使用这个指纹来确保所有对等体对事物达成一致。

在任何时候,你可以检索网状的指纹和所有已知对等体的列表

let fingerprint = kaboodle.fingerprint().await;
let peers = kaboodle.peers().await;
println!("{fingerprint} {peers:?}");

指纹是从当前实例的角度对网格成员的CRC-32哈希值;网格中的所有机器应该能够快速收敛到相同的哈希值。对等节点列表是一个从对等节点的Kaboodle套接字地址映射到其身份的HashMap。请注意,这些SocketAddr值中的端口号与广播端口号不同:所有对等节点都监听广播端口,但他们也在另一个单独的端口上相互发送一对一的消息。

注意事项和已知问题

该软件包仍处于早期积极开发阶段,可能还不适合生产使用。欢迎提交拉取请求、功能请求和反馈。

开发

本项目使用just (brew install just)进行开发工作流程和自动化。不带参数运行just以查看可用命令列表。

cargo run将运行一个演示应用程序,通过端口7475寻找对等节点。如果您已安装zellij (brew install zellij),您可以通过运行just run2x2在2x2网格中运行四个演示应用程序的副本。尝试退出一些实例并观察剩余实例如何发现它们的缺失;每个面板上方都有一个标题,显示该实例的IP地址和端口号,以及从该节点角度的网格指纹。

许可证

BSD-2-Clause-Patent

依赖项

~8–19MB
~244K SLoC