ITADN
quinn-rs/quinn
quinn-rs/quinn · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Documentation Crates.io Build status codecov Chat Chat License: MIT License: Apache 2.0

Quinn 是一个纯 Rust 编写、兼容异步的 IETF QUIC 传输协议实现。 该项目由 Dirkjan OchtmanBenjamin Saunders 于 2018 年作为副业项目创立,此后已发布了 30 多个版本。如果您在商业环境中使用 Quinn,请考虑 赞助 该项目。

特性

  • 同时支持客户端/服务器操作
  • 有序和无序流读取以提升性能
  • 在稳定版 Rust 上运行,已在 Linux、macOS 和 Windows 上测试
  • 可插拔的加密,标准实现基于 rustlsring
  • 用于小型不可靠消息的应用层数据报
  • 基于 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。默认情况下, 服务器会生成自签名证书并将其存储到磁盘,客户端会自动找到并信任该证书。

链接

使用说明

点击显示笔记

缓冲区

无论使用多少连接,一个 Quinn 端点都对应于单个 UDP 套接字。在单个端点上处理高聚合数据速率 可能需要比大多数环境中默认配置更大的 UDP 缓冲区。如果您在稳定的网络链路上观察到不稳定的延迟和/或吞吐量, 请考虑增加所使用的缓冲区大小。例如,您可以在将其传递给 Quinn 之前, 调整要使用的 UDP 套接字的 SO_SNDBUFSO_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 个月的历史。