主要观点:Firezone 用 Rust 构建安全远程访问,其核心的连接库connlib
采用 sans-IO 设计。Rust 的特性使其适合 sans-IO 模式,该模式可解决传统 IO 方式的问题,如函数着色约束导致的异步依赖问题等,还具有易组合、API 灵活、测试方便、应对边缘情况等优点,但也存在编写顺序工作流代码较多、社区支持少等缺点。
关键信息:
connlib
用 Rust 构建,设计为 sans-IO,以tokio
等为基础,几乎无tokio::spawn
调用,通过单 UDP 套接字复用通信。- sans-IO 核心是依赖倒置原则,将政策与实现分离,通过抽象
Transmit
等实现。 - 以 STUN 为例,展示 sans-IO 下的状态机、事件循环及抽象时间的实现,如添加重传定时器。
- Rust 的所有权和可变性模型与 sans-IO 设计配合良好,可避免
async
中的一些问题。
重要细节: - Python 世界有关于 sans-IO 的专门网站,Rust 中如
quinn
、quiche
、str0m
等库也采用 sans-IO。 - 在 Firezone 中,
snownet
利用 sans-IO 结合 ICE 和 WireGuard。 - sans-IO 代码易测试,Firezone 实现参考状态机用于测试
connlib
,还可轻松测试 IO 失败等情况。 - sans-IO 设计虽有优点,但也存在编写顺序工作流代码繁琐、社区支持少等不足。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。