Quinn 是一个纯 Rust 编写、兼容异步的 IETF QUIC 传输协议实现。 该项目由 Dirkjan Ochtman 和 Benjamin Saunders 于 2018 年作为副业项目创立,此后已发布了 30 多个版本。如果您在商业环境中使用 Quinn,请考虑 赞助 该项目。
特性
- 同时支持客户端/服务器操作
- 有序和无序流读取以提升性能
- 在稳定版 Rust 上运行,已在 Linux、macOS 和 Windows 上测试
- 可插拔的加密,标准实现基于 rustls 和 ring
- 用于小型不可靠消息的应用层数据报
- 基于 Future 的异步 API
- 最低支持的 Rust 版本为 1.80.0
概述
- quinn: 基于 tokio 的高级异步 API,用法参见 examples。大多数开发者将使用此模块。(包含基础基准测试。)
- quinn-proto: 协议的确定性状态机,内部执行 无 I/O,适用于与自定义事件循环配合使用(并可能提供 C 或 C++ API)。
- quinn-udp: 针对该协议优化的、带有 ECN 信息的 UDP 套接字。
- bench: 无框架的基准测试。
- fuzz: 模糊测试。
入门指南
示例
$ cargo run --example server ./
$ cargo run --example client https://localhost:4433/Cargo.toml
这将在回环地址上启动一个 HTTP 0.9 服务器,用于提供当前工作目录的服务,客户端获取 ./Cargo.toml。默认情况下,
服务器会生成自签名证书并将其存储到磁盘,客户端会自动找到并信任该证书。
链接
- 在 RustFest Paris (May 2018) 演讲 中的演讲;幻灯片;YouTube
- 使用 示例
- 指南 书籍
使用说明
点击显示笔记
缓冲区
无论使用多少连接,一个 Quinn 端点都对应于单个 UDP 套接字。在单个端点上处理高聚合数据速率
可能需要比大多数环境中默认配置更大的 UDP 缓冲区。如果您在稳定的网络链路上观察到不稳定的延迟和/或吞吐量,
请考虑增加所使用的缓冲区大小。例如,您可以在将其传递给 Quinn 之前,
调整要使用的 UDP 套接字的 SO_SNDBUF 和 SO_RCVBUF 选项。请注意,某些平台(例如 Linux)需要
提升权限或修改系统配置,进程才能增加其 UDP 缓冲区大小。
证书
默认情况下,Quinn 客户端会验证其连接的服务器的加密身份。这可以防止主动的、位于路径上的攻击者拦截消息,但需要信任某个证书颁发机构。对于许多用途,可以通过为服务器使用 Let's Encrypt 的证书,并依赖客户端的默认配置来实现这一点。
在某些情况下,包括点对点、首次使用时信任、故意不安全的应用程序,或者服务器未通过域名标识的任何情况,这并不实用。可以通过自定义 rustls 配置来实现任意的证书验证逻辑;有关详细信息,请参阅 insecure_connection.rs 示例。
当运营自己的证书颁发机构没有意义时,可以使用 rcgen 按需生成自签名证书。为了支持首次使用时信任,自动生成了自签名证书的服务器应将其生成的证书写入持久存储,并在未来的运行中重复使用它。
贡献
欢迎所有反馈。请随时在 issue tracker 中提交 bug、文档请求 以及其他任何反馈。
quinn-proto 测试套件使用模拟 IO 以确保可复现性,并避免在
某些对时间敏感的测试中出现长时间休眠。如果设置了 SSLKEYLOGFILE
环境变量,测试将使用外部协议分析器(如 Wireshark)发出 UDP 数据包以供检查,
并且每个连接客户端侧的 NSS 兼容密钥日志将被写入变量指定的路径。
我们发布的 crate 版本所支持的最低 Rust 版本,在发布时 至少已有 6 个月的历史。