#quic #async-api #scion #state-machine #protocols #udp-socket #deterministic

nightly squinn

支持SCION的灵活QUIC传输协议实现

17个版本

0.12.6 2024年1月25日
0.12.5 2024年1月19日
0.11.9 2024年1月9日
0.11.2 2023年12月30日

#1568 in 网络编程

Download history 8/week @ 2024-03-11 125/week @ 2024-03-25 8/week @ 2024-04-01

每月223次下载

MIT/Apache

195KB
4K SLoC

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

Quinn是纯Rust,与async兼容的IETF QUIC传输协议的实现。

特性

  • 客户端/服务器同时操作
  • 有序和无序流读取,以改进性能
  • 在稳定的Rust上工作,已在Linux、macOS和Windows上进行测试
  • 可插拔的加密,由rustlsring支持的标准实现
  • 适用于小型、不可靠消息的应用层数据报
  • 基于Future的异步API
  • 最低支持的Rust版本为1.65.0

概览

  • quinn: 基于tokio的高级async API,请参阅示例了解使用方法。大多数开发者将使用此API。(包括基本基准测试。)
  • quinn-proto: 协议的确定性状态机,内部不执行I/O,适用于使用自定义事件循环(以及可能的C或C++ API)。
  • quinn-udp: 调整了ECN信息的UDP套接字。
  • bench: 无框架的基准测试。
  • fuzz: 模糊测试。

入门

示例

$ cargo run --example server ./
$ cargo run --example client https://127.0.0.1:4433/Cargo.toml

此示例在回环地址上启动HTTP 0.9服务器,服务当前工作目录,客户端获取./Cargo.toml。默认情况下,服务器生成自签名证书并将其存储到磁盘,客户端将自动找到并信任它。

链接

使用说明

点击显示说明

缓冲区

Quinn端点对应一个单一的UDP套接字,无论有多少连接在使用。在单个端点上处理高聚合数据速率可能需要比大多数环境中默认配置更大的UDP缓冲区。如果您在一个稳定的网络链路上观察到不稳定的延迟和/或吞吐量,请考虑增加使用的缓冲区大小。例如,您可以将UDP套接字的SO_SNDBUFSO_RCVBUF选项调整到在传递给Quinn之前要使用的值。请注意,某些平台(例如Linux)要求提升权限或修改系统配置才能增加进程的UDP缓冲区大小。

证书

默认情况下,Quinn客户端验证它们连接的服务器的加密身份。这防止了路径上的主动攻击者拦截消息,但需要信任某些证书颁发机构。对于许多目的,这可以通过使用来自Let's Encrypt的服务器证书来实现,并依赖客户端的默认配置。

对于一些情况,包括点对点、首次使用即信任、故意不安全的应用程序或服务器不是通过域名识别的任何情况,这可能不实用。可以通过启用rustlsdangerous_configuration功能并手动构建一个具有覆盖证书验证器的Quinn ClientConfig来实现任意证书验证逻辑。

当操作自己的证书颁发机构没有意义时,可以使用rcgen在需要时生成自签名证书。为了支持首次使用即信任,应该自动生成自签名证书的服务器将它们的生成的证书写入持久存储并在未来的运行中重用它。

贡献

欢迎所有反馈。请随时提交错误报告、文档请求和其他反馈到问题跟踪器

quinn-proto测试套件使用模拟IO以提高可重复性和避免某些对时间敏感的测试中的长时间睡眠。如果设置了SSLKEYLOGFILE环境变量,测试将发出UDP数据包以供外部协议分析器(如Wireshark)检查,并将每个连接客户端侧的兼容NSS的关键日志写入变量指定的路径。

我们crate发布的版本支持的最小Rust版本将在发布时至少是6个月之前。

作者

  • Dirkjan Ochtman - 项目负责人 & 创始人
  • Benjamin Saunders - 项目负责人 & 创始人
  • Jean-Christophe Begue - 项目合作者,HTTP/3实现作者

依赖关系

~15–32MB
~518K SLoC