📌 项目地址:n0-computer/iroh | ⭐ 9,188 颗星 | 🔧 Rust | 📜 未标注
核心痛点:IP 地址靠不住,公钥才是真“地址”
传统网络通信依赖 IP 地址,但在移动设备、Cellular 网络、NAT 后面,IP 频繁变化或不可达。Iroh 提供了一种新思路:根据公钥(public key)进行“拨号”。你只需要知道对方的公钥,Iroh 会自动尝试建立最快速的连接,优先打洞(hole-punching)走直连,失败则回退到公共中继服务器,并持续测量网络性能以保证最佳路径。这一切都建立在 QUIC 协议之上,默认获得认证加密、多路并发流、数据报传输以及去队首阻塞。
快速上手:Rust 库中的双向流示例
Iroh 的核心是一个 QUIC 端点(Endpoint),通过绑定本地端口创建。连接时你指定对方的地址(包含公钥和 relay 信息)以及一个 ALPN(应用协议标识)。以下代码来自 README 中的 echo 示例:
连接端(发起方):
const ALPN: &[u8] = b"iroh-example/echo/0";
let endpoint = Endpoint::bind().await?;
// 连接到接受端
let conn = endpoint.connect(addr, ALPN).await?;
// 打开双向 QUIC 流
let (mut send, mut recv) = conn.open_bi().await?;
// 发送数据,期望被回显
send.write_all(b"Hello, world!").await?;
send.finish()?;
// 读取回显
let response = recv.read_to_end(1000).await?;
assert_eq!(&response, b"Hello, world!");
// 作为最后发送数据的端,发送再见
conn.close(0u32.into(), b"bye!");
// 关闭所有连接
endpoint.close().await;
接受端(监听方):
let endpoint = Endpoint::bind().await?;
let router = Router::builder(endpoint)
.accept(ALPN.to_vec(), Arc::new(Echo))
.spawn()
.await?;
// 协议处理定义
#[derive(Debug, Clone)]
struct Echo;
impl ProtocolHandler for Echo {
async fn accept(&self, connection: Connection) -> Result {
let (mut send, mut recv) = connection.accept_bi().await?;
// 直接将收到的字节回写
let bytes_sent = tokio::io::copy(&mut recv, &mut send).await?;
send.finish()?;
connection.closed().await;
Ok(())
}
}
完整示例见 echo.rs。要将其集成到你的 Rust 项目中,只需 cargo add iroh,然后按上述模式编写你的协议处理器。
组合协议:无需从零造轮子
Iroh 提供了三个预构建的高层协议,你可以直接使用或组合:
- iroh-blobs:基于 BLAKE3 内容寻址的 blob 传输,支持从 KB 到 TB 级别,适合文件分享、数据分发。
- iroh-gossip:建立可扩展的发布-订阅覆盖网络,资源消耗仅相当于普通手机能承受的范围。
- iroh-docs:最终一致性的键值存储,底层使用 iroh-blobs 存储数据。
这些协议可以叠加使用,例如利用 iroh-gossip 广播 iroh-docs 的变更,实现去中心化协作。
与同类工具的区别
对比 libp2p(另一个知名的模块化 P2P 网络栈),Iroh 的显著特点包括:
- 公钥寻址而非 PeerID/PubSub Topic:Iroh 直接用公钥作为连接标识,无需额外的命名服务。
- 纯 QUIC 底层:Iroh 使用 noq(一个 Rust 的 QUIC 实现),自带 TLS 1.3 加密、多路复用和流优先级,省去手动管理 TCP+TLS 的麻烦。
- 更激进的中继+打洞测量:Iroh 持续测量网络性能(参见 iroh-perf),动态选择最优中继或直连。
- 内置高层协议:blob 传输、gossip、docs 都经过专门优化,开箱即用,而 libp2p 的类似协议(如 kademlia、bitswap)需要更多配置和定制。
需要注意的是,Iroh 目前主要面向 Rust 生态,其他语言绑定尚不成熟。如果你需要跨语言/跨平台的 P2P 库,libp2p 可能有更广泛的适配。
注意事项
- 许可证:该项目采用 MIT 或 Apache-2.0 双许可证(任选其一),可放心用于商业项目。
- 开发状态:Iroh 仍在积极开发中,API 可能变化(参考当前版本 v0.x)。建议锁定版本或紧跟官方更新日志。
- 依赖:底层依赖 tokio 异步运行时,需要你的项目同样基于异步(async/await)。
- 安全:公钥直接用于加密和身份认证,请妥善保管私钥。中继场景下会暴露连接的公钥,但通信内容始终加密。
更多细节请访问 文档站 和 Discord 社区。
这篇文章对你有帮助吗?