quinn-rs/quinn
GitHub: quinn-rs/quinn
纯 Rust 实现的异步 QUIC 协议库,提供安全高性能的网络通信能力
Stars: 4976 | Forks: 538

[](https://docs.rs/quinn/)
[](https://crates.io/crates/quinn)
[](https://github.com/djc/quinn/actions?query=workflow%3ACI)
[](https://codecov.io/gh/quinn-rs/quinn)
[](https://matrix.to/#/#quinn:matrix.org)
[](https://discord.gg/SGPEcDfVzh)
[](LICENSE-MIT)
[](LICENSE-APACHE)
Quinn 是 IETF [QUIC][quic] 传输协议的纯 Rust、异步兼容实现。
该项目由 [Dirkjan Ochtman](https://github.com/djc) 和 [Benjamin Saunders](https://github.com/Ralith) 于 2018 年作为一个副业项目创立,自那以后已经发布了 30 多个版本。如果您在商业环境中使用 Quinn,请考虑[赞助](https://opencollective.com/quinn-rs)该项目。
## 功能特性
- 同时进行客户端/服务端操作
- 有序和无序流读取,以提升性能
- 支持稳定版 Rust,已在 Linux、macOS 和 Windows 上测试
- 可插拔的加密技术,标准实现由 [rustls][rustls] 和 [*ring*][ring] 支持
- 应用层数据报,用于小型、不可靠的消息
- 基于 Future 的异步 API
- 最低支持的 Rust 版本为 1.80.0
## 概览
- **quinn:** 基于 tokio 的高级异步 API,用法请参阅 [示例][examples]。这是大多数开发者会使用的部分。(包含基础基准测试。)
- **quinn-proto:** 协议的确定性状态机,内部[**不执行** I/O][sans_io],适用于自定义事件循环(以及潜在的 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 (2018 年 5 月) 演讲][talk];[幻灯片][slides];[YouTube][youtube]
- 使用[示例][examples]
- 指南[手册][documentation]
## 使用说明
点击展开说明
### 缓冲区
一个 Quinn 端点对应一个 UDP 套接字,无论使用了多少连接。在单个端点上处理高聚合数据速率可能需要比大多数环境中默认配置更大的 UDP 缓冲区。如果您在稳定的网络链路上观察到不稳定的延迟和/或吞吐量,请考虑增加所使用的缓冲区大小。例如,您可以在将 UDP 套接字传递给 Quinn 之前,调整其 `SO_SNDBUF` 和 `SO_RCVBUF` 选项。请注意,某些平台(例如 Linux)需要提升权限或修改系统配置,进程才能增加其 UDP 缓冲区大小。
### 证书
默认情况下,Quinn 客户端会验证其连接到的服务器的加密身份。这可以防止主动的、路径上的攻击者拦截消息,但需要信任某个证书颁发机构。对于许多用途,这可以通过为服务器使用来自 [Let's Encrypt][letsencrypt] 的证书,并依赖客户端的默认配置来实现。
对于某些情况,包括点对点、首次使用时信任、故意不安全的应用程序,或任何不由域名识别服务器的情况,这并不实用。可以通过自定义 `rustls` 配置来实现任意证书验证逻辑;详情请参阅 [insecure_connection.rs][insecure] 示例。
当运营自己的证书颁发机构没有意义时,可以使用 [rcgen][rcgen] 按需生成自签名证书。为了支持首次使用时信任,自动生成自签名证书的服务器应将其生成的证书写入持久存储,并在未来的运行中重复使用它。
## 贡献
欢迎所有反馈。请随时将错误、文档请求和任何其他反馈提交到[问题追踪器][issues]。
quinn-proto 测试套件使用模拟 IO 以确保可重复性,并避免在某些时间敏感的测试中出现长时间休眠。如果设置了 `SSLKEYLOGFILE` 环境变量,测试将发出 UDP 数据包以供 Wireshark 等外部协议分析器检查,并且每个连接客户端端的 NSS 兼容密钥日志将被写入该变量中指定的路径。
我们发布的 crate 版本所支持的最低 Rust 版本在发布时至少已有 6 个月历史。
标签:API, DNS解析, HTTP/3, MacOS取证, QUIC, QUINN, Ring, Rust, Rustls, Tokio, Web传输, 传输层, 低延迟, 内核驱动, 加密通信, 协议栈, 可视化界面, 开源项目, 异步编程, 微服务通信, 流量控制, 网络协议, 网络安全, 网络库, 网络流量审计, 通知系统, 隐私保护