#quic #quinn #protocols #performance #udp-socket #stream #async

kvarn-quinn

临时Kvarn分支:通用的QUIC传输协议实现

1个不稳定版本

0.11.0-alpha12024年2月4日

网络编程中排名第1338

每月下载量44
用于 2 个包

MIT/Apache

1MB
23K SLoC

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

当真正的Quinn 0.11发布并支持rustls 0.22时,将移除此临时Kvarn分支。

Quinn是纯Rust、支持异步的IETF QUIC传输协议实现。

特性

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

概述

  • quinn: 基于tokio的高级异步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的服务器证书,并依赖于客户端的默认配置来实现。

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

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

贡献

欢迎所有反馈。请随时提交错误报告、对文档的请求或其他任何反馈至问题追踪器

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

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

作者

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

依赖项

~3–18MB
~243K SLoC