LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

让两台NAT后面的设备直连,只需要一个公钥——iroh:Rust生态最优雅的P2P网络框架

admin
2026年7月18日 1:0 本文热度 44

一、一个所有开发者都遇到过的问题

假设你在写一个文件同步工具。两台设备不在同一个局域网,各自躲在不同的NAT后面。你要让它们互相找到对方、建立加密连接、稳定地传输数据。

用传统方式做这件事,你需要:配置端口转发、搭建STUN/TURN服务器、处理连接断开重连、管理TLS证书……千行胶水代码起步,还要和各种网络环境搏斗。

iroh想解决的,就是这件事。 它把以上所有步骤压缩成了一套统一的Rust API,核心理念是——把"公钥"当成网络地址来用。

二、iroh是什么?

iroh是n0-computer公司开发的开源P2P网络框架,使用Rust编写,目前在GitHub上拥有约9600颗Star。它的定位非常清晰:让"建立安全P2P通道"这件事抽象到极简。

协议栈三层架构

iroh的底层协议栈可以拆成三层来看:

最底层:QUIC传输(通过自研的noq库实现),提供加密传输、多路复用流和避免队头阻塞的能力中间层:连接管理,优先尝试NAT打洞建立直连,打不通就自动回退到公共中继网络——对开发者来说,这个切换是透明的最上层:三套高层协议,可以直接拿来用:

iroh-blobs:内容寻址的文件传输(基于BLAKE3哈希,KB到TB都行)iroh-gossip:发布订阅覆盖网络,适合群聊、状态同步iroh-docs:最终一致性的KV存储,适合协作编辑

和同类方案的对比

特性
iroh
libp2p (Rust)
quinn
定位
高层P2P框架
模块化P2P协议栈
QUIC传输层
NAT穿透
内置,透明
需自行组合
不提供
协议层封装
blobs/gossip/docs
多模块可选
仅传输
学习曲线
较平缓
陡峭
中等
API简洁度
极简
灵活但复杂
中等

iroh的定位卡在libp2p和quinn之间:比libp2p更简单,比quinn更"高层"。

三、快速上手:5分钟连接两个节点

环境准备

iroh需要Rust工具链。如果你还没有安装Rust:

# Linux/macOScurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Windows# 访问 https://rustup.rs 下载安装程序

第一步:克隆并运行ping示例

git clone https://github.com/n0-computer/iroh-pingcd iroh-ping

第二步:启动接收端

在一个终端中运行:

cargo run --example quickstart receiver

接收端会打印一个Ticket(一张连接凭证),类似:

Ticket: abc123def456...

复制这个Ticket。

第三步:启动发送端

在另一个终端中运行:

cargo run --example quickstart sender <TICKET>

<TICKET>替换为刚才复制的Ticket。发送端会打印出往返时延(RTT),连接成功。

就这样。 不需要配置IP地址、端口号、TLS证书,也不需要端口转发。iroh自动完成了NAT打洞和中继回退。

四、从零构建:将iroh集成到你自己的项目

创建项目并添加依赖

cargo init my-p2p-appcd my-p2p-appcargo add iroh tokio anyhow rand

编写一个简单的Echo服务

编辑src/main.rs

use anyhow::Result;use iroh::{Endpoint, endpoint::presets};use std::sync::Arc;
// 定义协议标识符(类似HTTP的Host头)const ALPN: &[u8] = b"my-echo/1";
// 定义Echo协议处理器#[derive(Debug)]struct Echo;
impl iroh::protocol::ProtocolHandler for Echo {    fn accept(&self, conn: iroh::endpoint::Connecting) -> Box<dyn Future<Output = Result<()>> + Send> {        Box::new(async move {            let conn = conn.await?;            let (mut send, mut recv) = conn.accept_bi().await?;            // 读取数据并原样返回            let data = recv.read_to_end(1024).await?;            send.write_all(&data).await?;            send.finish()?;            Ok(())        })    }}
#[tokio::main]async fn main() -> Result<()> {    // 创建Endpoint,使用n0公共中继    let endpoint = Endpoint::bind(presets::N0).await?;
    // 构建Router,注册Echo协议    let router = iroh::protocol::Router::builder(endpoint.clone())        .accept(ALPN.to_vec(), Arc::new(Echo))        .spawn()        .await?;
    // 打印连接信息    let node_id = endpoint.node_id();    println!("节点ID: {node_id}");    println!("等待连接...");
    // 保持运行    tokio::signal::ctrl_c().await?;    router.shutdown().await?;
    Ok(())}

关键代码解读

Endpoint::bind(presets::N0):创建端点并自动使用n0提供的公共中继服务器,无需手动配置ALPN:协议标识符,Router根据它将连接分发到对应的处理器,概念上类似HTTP的Host头路由Router::builder().accept():注册协议处理器,可以同时注册多个不同协议node_id:节点的公钥,其他节点通过这个公钥找到你——不需要IP地址

五、构建P2P聊天应用

iroh的iroh-gossip协议可以让多台设备组成一个发布订阅网络,非常适合构建聊天、协作等应用。

添加gossip依赖

cargo add iroh-gossip

核心聊天逻辑

use iroh::{Endpoint, endpoint::presets, NodeId};use iroh_gossip::{net::Gossip, proto::TopicId};
#[tokio::main]async fn main() -> Result<()> {    let endpoint = Endpoint::bind(presets::N0).await?;    let gossip = Gossip::builder().spawn(endpoint.clone()).await?;
    let topic = TopicId::from_bytes([0u8; 32]); // 共享话题ID    gossip.subscribe(topic, Vec::new()).await?;
    // 发送消息    gossip.broadcast(topic, b"Hello from iroh!").await?;
    // 接收消息    while let Some(event) = gossip.next_event().await {        if let GossipEvent::Received(msg) = event {            println!("收到: {}", String::from_utf8_lossy(&msg.content));        }    }
    Ok(())}

Ticket机制:如何让其他节点加入

iroh使用Ticket来实现节点发现。Ticket包含了目标节点的公钥和中继服务器地址:

// 生成Ticketlet ticket = endpoint.ticket().await?;println!("分享此Ticket给对方: {ticket}");
// 使用Ticket连接let conn = endpoint.connect(ticket.into(), ALPN).await?;

​六、文件传输:iroh-blobs实战

iroh-blobs提供了基于内容寻址的文件传输,使用BLAKE3哈希校验:

添加依赖

cargo add iroh-blobs

发送文件

use iroh_blobs::{store::Store, BlobFormat};
async fn send_file(endpoint: &Endpoint, path: &Path) -> Result<Hash> {    let store = Store::memory().await?;    let hash = store.import_file(path).await?;    println!("文件哈希: {hash}");    // 将hash分享给对方即可下载    Ok(hash)}

接收文件

async fn recv_file(endpoint: &Endpoint, hash: Hash, path: &Path) -> Result<()> {    let store = Store::memory().await?;    let ticket = /* 从发送方获取 */;    store.download(hash, endpoint.clone()).await?;    store.export_file(hash, path).await?;    Ok(())}

iroh-blobs支持从KB到TB级别的文件传输,断点续传,且基于BLAKE3哈希校验确保数据完整性。

七、iroh适用的场景

场景
使用哪个模块
说明
文件同步/传输
iroh-blobs
跨NAT的大文件传输,内容寻址
实时聊天/消息
iroh-gossip
多人发布订阅,群组通信
协作编辑
iroh-docs
最终一致性KV,冲突自动合并
IoT设备互联
iroh-blobs + gossip
轻量级P2P,无需公网IP
边缘计算数据分发
iroh-blobs
内容寻址,去重传输
游戏状态同步
iroh-gossip
低延迟广播,适合实时场景

八、需要注意的局限性

iroh目前仍有一些需要正视的局限:

1.API稳定性:核心API仍在向1.0版本迁移,2025年10月刚经历大规模重命名(Node改为Endpoint,NodeId改为EndpointId),生产环境使用需做好应对Breaking Changes的准备]2.Keep-alive行为:keep-alive和空闲计时器的行为还在调整中,官方文档明确提到"这些值和交互目前还有点乱"3.语言绑定:核心是Rust,虽然有Python、Swift、Kotlin的FFI绑定,但生态成熟度不如Rust原生4. 仅适合P2P场景:如果你的应用是传统的客户端-服务器架构,服务器有固定IP、Nginx在前反代,iroh的P2P能力是多余的,不如直接用quinn

九、快速参考

信息
链接
GitHub仓库
https://github.com/n0-computer/iroh[1]
官方文档
https://docs.iroh.computer[2]
API文档
https://docs.rs/iroh[3]
示例仓库
https://github.com/n0-computer/iroh-experiments[4]
协议
Apache 2.0 / MIT
最低Rust版本
1.91
Star数
~9600

最小化安装命令速查

# 安装Rustcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 创建项目cargo init my-p2p-app && cd my-p2p-app
# 添加irohcargo add iroh tokio anyhow
# 运行cargo run

iroh的价值不在于它做了什么前无古人的事情——NAT穿透、加密传输、P2P协议都有成熟方案。它的价值在于把这一切压缩到了极简的API,让开发者不再需要和端口转发、证书配置、中继服务器打交道。如果你正在构建一个去中心化应用,iroh值得认真评估。

References

[1]https://github.com/n0-computer/iroh
[2]https://docs.iroh.computer
[3]https://docs.rs/iroh
[4]https://github.com/n0-computer/iroh-experiments


阅读原文:点击这里


该文章在 2026/7/18 1:00:25 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-1  粤公网安备44030602007207号