quiche:用 Rust 实现 QUIC 与 HTTP/3 的底层库
一个给 Rust 和移动端应用接入 QUIC/HTTP/3 的底层库,网络 I/O 和事件循环由你掌控。
GitHub cloudflare/quiche 更新 2026-09-20 分支 master 星标 12.0K 分叉 1.1K
Rust QUIC HTTP/3 TLS Android iOS C FFI

🧭 决策指南

适合,如果你

  • 你要在 Rust 应用中直接控制 QUIC 连接、流控和 TLS 配置
    README 的“Configuring connections”章节列出 Config、ALPN、flow control、congestion control 和 TLS 配置
  • 你已有 socket、事件循环和 timer,并希望处理 recv、send 与 stream 数据
    README 开头说明应用负责 I/O、event loop 和 timers;章节中提供 recv、send、timeout、on_timeout、stream_send 和 stream_recv
  • 你要为 Android NDK 19+ 或 iOS 构建 libquiche FFI
    README 的“Building for Android”和“Building for iOS”章节分别提供 cargo-ndk 与 cargo-lipo 流程
  • 你维护类似 Cloudflare HTTP/3、Android DNS over HTTP/3 或 curl HTTP/3 的集成
    README 的“Who uses quiche?”章节列出 Cloudflare、Android DNS resolver 和 curl

不适合,如果你

  • 你想直接把 quiche-apps 的 quiche-client 或 quiche-server 示例部署到生产环境
    README 的“Command-line apps”章节明确说明这些工具“不适合生产环境”,且 quiche-server 使用自签名证书
  • 你不希望自行实现网络 I/O、事件循环和定时器
    README 开头明确要求应用提供 sockets handling、event loop 和 timers
  • 你的目标环境不是 Android NDK 19+、iOS,且不需要 Rust 或 C FFI
    提供的 README 仅展示 Android NDK、iOS、Rust API 和 FFI 构建路径;其他环境信息未提供

前置条件

  • Rust 工具链;项目最新版本为 0.30.0
  • Android 构建需要 Android NDK 19 或更高版本,推荐 21,并设置 ANDROID_NDK_HOME
  • Android 构建需要 cargo-ndk v2.0 或更高版本,且最低 API level 为 21
  • iOS 构建需要 Xcode command-line tools、aarch64-apple-ios 或 x86_64-apple-ios Rust target,以及 cargo-lipo
  • 应用必须提供 socket I/O、事件循环和 timer 实现
  • Config 需要按应用场景设置 set_initial_max_streams_bidi()、set_initial_max_streams_uni()、set_initial_max_data() 等流控参数

第一步命令(README 原文)

$ cargo run --bin quiche-client -- https://cloudflare-quic.com/

要注意

  • Config 默认将多项流控属性设为零,可能无法满足应用需求
    README 的“Configuring connections”章节明确列出六个需要应用设置的 set_initial_* 方法
  • timeout 到期后必须调用 on_timeout,并再次处理 send
    README 的“Handling incoming packets”和超时示例要求应用维护 timer、调用 timeout 与 on_timeout
  • Android cargo ndk 命令的 -t 和 -p 选项是 mandatory
    README 的“Building for Android”章节明确写明 -t 和 -p options are mandatory
  • iOS README 只说明在 Xcode 10.1 和 11.2 测试过
    README 的“Building for iOS”章节末尾列出 Xcode 10.1 和 Xcode 11.2

材料未说明

  • README 未提供 0.30.0 的变更日志、破坏性变更或 API 稳定性说明
  • README 未提供 QUIC、HTTP/3 的吞吐、延迟、连接规模或资源占用基准
  • README 未说明支持哪些具体 TLS 后端版本及其安全配置要求
  • README 省略了 Pacing、HTTP/3 和 Building Docker images 章节的具体内容
  • README 未说明除 Android NDK 和 iOS 外的目标平台、编译器版本或运行时兼容性
  • README 未提供生产环境部署所需的重试、监控、故障恢复和安全运维方案

💡 深度解析

6
不适合 我刚开始学习 QUIC,准备直接把 README 的 quiche-server 示例和仓库自带证书部署成生产 HTTP/3 服务;这样做是否可行?
适合读者: 刚开始学习 QUIC 的 Rust 工程师,想用 README 的 quiche-server 示例直接部署生产 HTTP/3 服务,并使用仓库自带证书。

不适合,因为 README 明确把命令行示例限定为验证用途,并明确禁止将随附的自签名证书用于生产。

  • Getting Started / Command-line apps 直接说明 quiche tools “are not suitable for production environments”。
  • 服务端命令使用 apps/src/bin/cert.crtapps/src/bin/cert.key,随后注释说明该证书是 self-signed,不能用于生产。
  • 示例还隐藏了生产系统必须处理的连接资源、监控、错误处理、事件循环和定时器集成问题;quiche 本身不会接管这些运行时职责。
  • 因此该命令适合作为基本连接和 HTTP/3 行为验证入口,不是生产服务交付方案。
  • Getting Started / Command-line apps:These are not suitable for production environments
  • Getting Started / Command-line apps:`$ cargo run --bin quiche-server -- --cert apps/src/bin/cert.crt --key apps/src/bin/cert.key`
  • Getting Started / Command-line apps:certificate provided is self-signed and should not be used in production
  • 开头:应用负责 I/O、event loop 和 timers
 $ cargo run --bin quiche-server -- --cert apps/src/bin/cert.crt --key apps/src/bin/cert.key
材料未说明:README 节选未说明生产服务器的部署拓扑、证书管理系统、监听地址、容量指标和监控方案。;未说明示例工具与正式 API 集成之间的功能差异及生产级错误处理覆盖范围。
适合 我用 Rust 开发自定义 QUIC 应用协议,不是标准 HTTP/3,并且需要控制 ALPN、双向/单向流数量和流量窗口;quiche 是否适合?
适合读者: 用 Rust 开发自定义 QUIC 协议的网络服务工程师,需要精确控制 ALPN、并发流和流量控制参数。

适合,因为 quiche 把 QUIC 作为通用传输协议暴露,并允许应用直接配置协议协商、流和流量控制,而不是限定为高层 HTTP 客户端。

  • README 示例使用 set_application_protos() 配置 ALPN,并说明 Config 控制 QUIC 版本、流量控制、拥塞控制和空闲超时。
  • README 特别列出 set_initial_max_streams_bidi()set_initial_max_streams_uni() 及多项初始数据窗口设置,适合自定义协议按消息模型分配资源。
  • 连接可通过 connect()accept() 建立,应用再用 stream_send()stream_recv() 传输数据。
  • 这些参数默认可能为零;若未按应用需求设置,连接建立后可能无法承载应用数据。
  • Configuring connections:`set_application_protos()`
  • Configuring connections:Config 控制 QUIC version、ALPN IDs、flow control、congestion control、idle timeout
  • Configuring connections:列出的六个初始 stream/data 配置方法
  • Sending and receiving stream data:`stream_send()`、`stream_recv()`
材料未说明:README 节选未说明自定义协议的消息 framing、重试语义、认证方式和版本兼容策略。;未说明自定义 ALPN 标识是否需要在其他组件或注册流程中协调。
适合 我正在用 Rust 维护类似 Cloudflare edge network 的 HTTP/3 基础设施,并且必须自己管理 UDP socket、事件循环和定时器;quiche 是否适合作为协议核心?
适合读者: 维护 Cloudflare 边缘网络 HTTP/3 的 Rust 基础设施工程师,需要保留自有 UDP I/O、事件循环和定时器控制。

适合,因为 quiche 的协议核心与宿主网络运行时明确解耦,正好匹配需要自行控制 I/O 和调度的边缘基础设施。

  • README 说明它提供低层 QUIC/HTTP/3 API,应用负责 socket handling、I/O 和带定时器的 event loop。
  • 可用 recv() 处理入站包、send() 生成出站包,并通过 timeout()on_timeout() 推进重传和时间事件。
  • README 明确列出 Cloudflare edge network 使用 quiche 提供 HTTP/3 支持,说明该组合已有实际采用背景。
  • 但连接数、资源限制、日志、监控和业务层 HTTP 服务逻辑仍需宿主系统自行实现。
  • 开头:应用负责提供 I/O(例如 socket handling)以及支持 timers 的 event loop
  • Generating outgoing packets:`send()`、`timeout()`、`on_timeout()`
  • Who uses quiche? / Cloudflare:quiche powers Cloudflare edge network's HTTP/3 support
  • 项目洞察:协议核心与网络运行时解耦
 $ cargo run --bin quiche-client -- https://cloudflare-quic.com/
材料未说明:README 节选未说明生产环境使用的异步运行时、连接规模、性能指标和资源上限。;未说明 Cloudflare 实际部署中对连接迁移、pacing、回退策略和可观测性的具体配置。
不适合 我已有 HTTP/1.1/HTTP/2 服务,只想快速增加普通 HTTP 访问能力,不想自己管理 UDP socket、事件循环和定时器;我应该直接集成 quiche 吗?
适合读者: 已有 HTTP/1.1/HTTP/2 服务的应用开发者,只想快速获得普通 HTTP 访问能力,不希望自行实现 UDP I/O 和定时器。

不适合,除非你确实需要直接控制 QUIC/HTTP/3 协议状态;对普通 HTTP 访问而言,quiche 的低层模型会引入不必要的运行时和协议管理工作。

  • README 明确称 quiche 是处理 QUIC 数据包和连接状态的 low level API,应用必须提供 I/O、socket handling 和 event loop。
  • 使用者还要管理 recv()send()timeout()on_timeout() 以及流读写,这不是普通高层 HTTP 客户端的即插即用接口。
  • 项目洞察指出,如果只需要普通 HTTP 访问,直接使用高层客户端通常比集成 quiche 更容易。
  • 即使采用 quiche,也不能仅替换库就自动获得完整生产级 HTTP/3;TLS、ALPN、证书、HTTP/3 语义和资源治理仍需配置或实现。
  • 开头:low level API;应用负责 I/O 和 event loop with timers
  • Handling incoming packets / Generating outgoing packets / Sending and receiving stream data
  • 项目洞察:只需要普通 HTTP 访问时,直接使用高层客户端通常更容易
  • 项目洞察:不是开箱即用的完整 HTTP 服务器、反向代理或异步网络运行时
材料未说明:README 节选未说明目标应用所使用的高层 HTTP 客户端、其 HTTP/3 支持状态及迁移成本。;未说明现有 HTTP/1.1/HTTP/2 服务的回退、连接池和请求重试需求。
适合 我正在维护 curl 的 C/C++ HTTP/3 集成,不能把 curl 改造成 Rust 应用;quiche 是否能作为可复用的 QUIC 实现?
适合读者: 维护 curl HTTP/3 集成的 C/C++ 基础设施工程师,需要在已有非 Rust 工具链中复用 QUIC。

适合,因为 quiche 的 Rust 协议核心可以通过 FFI 接入 C 系生态,而且 README 直接把 curl 列为实际集成对象。

  • README 的使用者章节写明,quiche 可以集成到 curl,为 curl 提供 HTTP/3 支持。
  • 项目洞察明确指出它通过 FFI 支持非 Rust 项目;因此宿主不必重写为 Rust,但需要处理 ABI、内存生命周期和 TLS 依赖。
  • 低层 API 会把 socket、事件循环、定时器留给 curl 或其网络抽象,这有利于复用既有 I/O 模型,也意味着集成方必须正确映射 recv()send()、超时和流读写。
  • quiche 采用 BSD 2-Clause Simplified License,适合嵌入商业软件,但许可证并不能替代具体的构建和发布验证。
  • Who uses quiche? / curl:quiche can be integrated into curl to provide support for HTTP/3
  • 项目洞察:通过 FFI 支持 Android、iOS 及 C 系生态集成
  • 开头:应用负责提供 I/O、socket handling 和 event loop
  • 项目数据:BSD 2-Clause "Simplified" License
材料未说明:README 节选未说明 curl 集成所需的具体 FFI API、BoringSSL 版本、构建系统和平台矩阵。;未说明 C ABI 的稳定性承诺、错误码映射及跨版本升级策略。
适合 我负责 Android DNS resolver,需要把 DNS over HTTP/3 集成到非 Rust 的系统组件中;quiche 是否适合,还是必须重写一套 QUIC 实现?
适合读者: 负责 Android DNS resolver 的移动系统工程师,需要通过 FFI 把 QUIC/HTTP/3 集成到非 Rust 环境。

适合,前提是团队能够承担 FFI、移动端构建和底层事件调度,而不是期待一个开箱即用的 Android HTTP 客户端。

  • README 的使用者章节明确写出 Android 的 DNS resolver 使用 quiche 实现 DNS over HTTP/3,这与目标场景直接对应。
  • 项目洞察说明 quiche 提供 FFI,可嵌入 Android、iOS 和 C/C++ 项目;核心语言是 Rust,另有 C 代码分布。
  • quiche 不接管 socket、事件循环和定时器,因此 Android 宿主仍需把这些能力接到自身网络线程或调度模型。
  • 移动端 ABI、内存所有权、TLS 依赖和最低系统版本是集成边界;README 节选未给出完整构建命令和这些约束的具体值。
  • Who uses quiche? / Android:Android's DNS resolver uses quiche to implement DNS over HTTP/3
  • 项目洞察:通过 FFI 支持 Android、iOS 及 C/C++ 项目
  • 开头:应用负责提供 I/O 以及带定时器的 event loop
  • 项目数据:主语言 Rust;语言分布包含 C
材料未说明:README 节选未提供 Android NDK、cargo-ndk、最低 API level、目标 ABI 及完整构建命令。;未说明 Android resolver 的 FFI 接口、线程模型、TLS 后端和生命周期管理方式。

✨ 核心亮点

  • 实现 IETF QUIC 传输协议与 HTTP/3
  • Cloudflare、Android DNS 和 curl 已使用
  • 提供 Rust API 与 C FFI 构建路径
  • 支持 Android NDK 19+ 与 iOS 架构

🔧 工程化

  • Config 管理 QUIC 版本、ALPN、流控和拥塞控制
  • connect、accept、recv、send 组成连接处理 API
  • stream_send 与 stream_recv 处理应用流数据
  • cargo-ndk 和 cargo-lipo 支持移动端构建

⚠️ 风险

  • 低层 API 要求应用自行提供 socket、事件循环和 timer
  • quiche-apps README 明确不适合生产环境
  • Config 多项默认值为零,需设置六类流控参数
  • quiche-server 示例证书是自签名证书,不能用于生产

👥 适合谁?

  • 需要在 Rust 应用中接入 QUIC 或 HTTP/3 的团队
  • 已有 socket、事件循环和 timer 框架的网络工程师
  • 需要 Android NDK 或 iOS FFI 库的移动端团队
  • 维护 curl HTTP/3 或 DNS over HTTP/3 集成的开发者