quiche: A Rust implementation of QUIC and HTTP/3
A low-level QUIC/HTTP/3 library for Rust and mobile apps where you own the network I/O and event loop.
GitHub cloudflare/quiche Updated 2026-09-20 Branch master Stars 12.0K Forks 1.1K
Rust QUIC HTTP/3 TLS Android iOS C FFI

🧭 Decision Guide

Try it if you

  • You need direct control over QUIC connections, flow control, and TLS configuration in a Rust application
    The README's “Configuring connections” section lists Config, ALPN, flow control, congestion control, and TLS configuration
  • You already have sockets, an event loop, and timers, and want to process recv, send, and stream data
    The README says the application is responsible for I/O, the event loop, and timers, and documents recv, send, timeout, on_timeout, stream_send, and stream_recv
  • You need to build libquiche FFI for Android NDK 19+ or iOS
    The README's “Building for Android” and “Building for iOS” sections provide cargo-ndk and cargo-lipo workflows
  • You maintain an integration like Cloudflare HTTP/3, Android DNS over HTTP/3, or curl HTTP/3
    The README's “Who uses quiche?” section lists Cloudflare, the Android DNS resolver, and curl

Skip it if you

  • You want to deploy the quiche-client or quiche-server examples from quiche-apps directly to production
    The README's “Command-line apps” section explicitly says these tools are unsuitable for production, and quiche-server uses a self-signed certificate
  • You do not want to implement network I/O, an event loop, and timers yourself
    The README explicitly requires the application to provide socket handling, an event loop, and timers
  • Your target is neither Android NDK 19+ nor iOS, and you do not need Rust or C FFI
    The provided README shows Android NDK, iOS, Rust API, and FFI build paths; information about other environments is not provided

Requirements

  • A Rust toolchain; the latest project version is 0.30.0
  • Android builds require Android NDK 19 or later, 21 recommended, with ANDROID_NDK_HOME set
  • Android builds require cargo-ndk v2.0 or later, with minimum API level 21
  • iOS builds require Xcode command-line tools, the aarch64-apple-ios or x86_64-apple-ios Rust targets, and cargo-lipo
  • The application must provide socket I/O, an event loop, and a timer implementation
  • Config must set flow-control parameters such as set_initial_max_streams_bidi(), set_initial_max_streams_uni(), and set_initial_max_data() for the application use case

First step (verbatim from README)

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

Watch out

  • Config defaults several flow-control properties to zero, which may not satisfy the application
    The README's “Configuring connections” section explicitly lists six set_initial_* methods that applications may need to set
  • After timeout expires, on_timeout must be called and send processing may need to run again
    The README's packet-handling and timeout examples require the application to maintain a timer and call timeout and on_timeout
  • The Android cargo ndk command requires the -t and -p options
    The README's “Building for Android” section explicitly states that the -t and -p options are mandatory
  • The iOS README only states that builds were tested with Xcode 10.1 and 11.2
    The README's “Building for iOS” section lists Xcode 10.1 and Xcode 11.2 at the end

Not stated in the README

  • The README does not provide a changelog, breaking-change list, or API-stability statement for 0.30.0
  • The README does not provide throughput, latency, connection-scale, or resource-usage benchmarks for QUIC or HTTP/3
  • The README does not specify supported TLS backend versions or their security configuration requirements
  • The README omits the detailed contents of the Pacing, HTTP/3, and Building Docker images sections
  • The README does not specify target platforms, compiler versions, or runtime compatibility beyond Android NDK and iOS
  • The README does not provide production deployment guidance for retries, monitoring, failure recovery, or security operations

💡 Deep Analysis

6
No I am new to QUIC and plan to deploy the README’s quiche-server example and bundled certificate directly as a production HTTP/3 service; is that viable?
For: A Rust engineer new to QUIC who wants to deploy the README’s quiche-server example directly in production with the repository’s bundled certificate.

No, because the README explicitly limits the command-line examples to validation and forbids using the bundled self-signed certificate in production.

  • Getting Started / Command-line apps states that the quiche tools “are not suitable for production environments.”
  • The server command uses apps/src/bin/cert.crt and apps/src/bin/cert.key, followed by a note that the certificate is self-signed and must not be used in production.
  • The example also does not solve production concerns such as resource limits, observability, error handling, event-loop integration, and timer scheduling; quiche leaves those runtime responsibilities to the application.
  • The command is therefore useful for validating basic connectivity and HTTP/3 behavior, not as a production delivery model.
  • Getting Started / Command-line apps: these tools 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: the provided certificate is self-signed and should not be used in production
  • Introduction: the application supplies I/O, the event loop, and timers
 $ cargo run --bin quiche-server -- --cert apps/src/bin/cert.crt --key apps/src/bin/cert.key
Not stated in the README:The excerpt does not specify a production topology, certificate-management system, listening configuration, capacity targets, or monitoring plan.;It does not define the feature gap between the example tool and a production API integration or the coverage of production-grade error handling.
Yes I am building a custom QUIC application protocol in Rust rather than standard HTTP/3, and I need control over ALPN, bidirectional/unidirectional streams, and flow-control windows; is quiche suitable?
For: A Rust network-service engineer building a custom QUIC protocol who needs precise control over ALPN, concurrent streams, and flow control.

Yes, because quiche exposes QUIC as a general-purpose transport and lets the application control negotiation, streams, and flow control instead of forcing a high-level HTTP client model.

  • The README configures ALPN with set_application_protos() and says Config controls the QUIC version, flow control, congestion control, and idle timeout.
  • It specifically lists set_initial_max_streams_bidi(), set_initial_max_streams_uni(), and several initial data-window setters, which fit custom protocol resource models.
  • Connections are created with connect() or accept(), while application data is transferred with stream_send() and stream_recv().
  • Several of these properties default to zero; failing to set them according to the protocol can leave an established connection unable to carry application data.
  • Configuring connections: `set_application_protos()`
  • Configuring connections: Config controls QUIC version, ALPN IDs, flow control, congestion control, and idle timeout
  • Configuring connections: the six initial stream/data configuration methods
  • Sending and receiving stream data: `stream_send()` and `stream_recv()`
Not stated in the README:The excerpt does not define message framing, retry semantics, authentication, or version compatibility for a custom protocol.;It does not say whether the custom ALPN identifier requires coordination or registration elsewhere.
Yes I am maintaining Rust HTTP/3 infrastructure similar to the Cloudflare edge network, and I must manage UDP sockets, the event loop, and timers myself; is quiche suitable as the protocol core?
For: A Rust infrastructure engineer maintaining HTTP/3 on the Cloudflare edge network who must retain control of UDP I/O, the event loop, and timers.

Yes, because quiche deliberately separates the protocol core from the host networking runtime, matching edge infrastructure that must control I/O and scheduling.

  • The README describes a low-level QUIC/HTTP/3 API where the application supplies socket handling, I/O, and an event loop with timers.
  • recv() processes incoming packets, send() produces outgoing packets, and timeout() plus on_timeout() drive retransmission and time-based events.
  • The README explicitly states that quiche powers HTTP/3 on the Cloudflare edge network, demonstrating real adoption of this model.
  • Connection limits, observability, resource controls, and application-level HTTP behavior remain the host system’s responsibility.
  • Introduction: the application is responsible for I/O and an event loop with timer support
  • Generating outgoing packets: `send()`, `timeout()`, and `on_timeout()`
  • Who uses quiche? / Cloudflare: quiche powers Cloudflare edge network's HTTP/3 support
  • Project insight: the protocol core is decoupled from the networking runtime
 $ cargo run --bin quiche-client -- https://cloudflare-quic.com/
Not stated in the README:The provided README does not specify the production async runtime, connection scale, performance targets, or resource limits.;It does not describe Cloudflare’s exact production settings for migration, pacing, fallback, or observability.
No I have an HTTP/1.1/HTTP/2 service and only want ordinary HTTP access without managing UDP sockets, an event loop, and timers; should I integrate quiche directly?
For: An application developer with an existing HTTP/1.1/HTTP/2 service who only wants ordinary HTTP access without implementing UDP I/O and timers.

No, unless you specifically need direct control over QUIC/HTTP/3 state; for ordinary HTTP access, quiche adds substantial runtime and protocol-management work.

  • The README calls quiche a low-level API for processing QUIC packets and connection state, with the application responsible for I/O, sockets, and the event loop.
  • The host must also handle recv(), send(), timeout(), on_timeout(), and stream operations, which is not a plug-and-play high-level HTTP client interface.
  • Project insights state that a high-level client is usually easier when ordinary HTTP access is the only requirement.
  • Replacing a library alone does not provide a complete production HTTP/3 system; TLS, ALPN, certificates, HTTP/3 semantics, and resource governance still require configuration or implementation.
  • Introduction: low-level API; the application supplies I/O and the timer-based event loop
  • Handling incoming packets / Generating outgoing packets / Sending and receiving stream data
  • Project insight: a high-level client is usually easier for ordinary HTTP access
  • Project insight: not a turnkey HTTP server, reverse proxy, or async networking runtime
Not stated in the README:The excerpt does not identify the application’s high-level HTTP client, its HTTP/3 support, or migration cost.;It does not describe the existing service’s fallback, connection-pooling, or request-retry requirements.
Yes I maintain curl’s C/C++ HTTP/3 integration and cannot turn curl into a Rust application; can quiche serve as a reusable QUIC implementation?
For: A C/C++ infrastructure engineer maintaining curl’s HTTP/3 integration who needs to reuse QUIC within an existing non-Rust toolchain.

Yes, because quiche’s Rust protocol core can be integrated into the C ecosystem through FFI, and the README directly lists curl as an integration target.

  • The README states that quiche can be integrated into curl to provide HTTP/3 support.
  • Project insights explicitly identify FFI support for non-Rust projects, so the host does not need to be rewritten in Rust; ABI, ownership, and TLS boundaries still must be handled.
  • The low-level API leaves sockets, the event loop, and timers to curl or its networking abstraction, enabling reuse of existing I/O while requiring correct mapping of recv(), send(), timeouts, and stream operations.
  • The BSD 2-Clause Simplified License is suitable for embedding in commercial software, although licensing does not replace build and release validation.
  • Who uses quiche? / curl: quiche can be integrated into curl to provide HTTP/3 support
  • Project insight: FFI integration for Android, iOS, and the C ecosystem
  • Introduction: the application supplies I/O, socket handling, and the event loop
  • Project data: BSD 2-Clause Simplified License
Not stated in the README:The excerpt does not specify the FFI APIs, BoringSSL versions, build systems, or platform matrix required by the curl integration.;It does not state the C ABI stability guarantee, error-code mapping, or upgrade strategy across versions.
Yes I maintain the Android DNS resolver and need to integrate DNS over HTTP/3 into a non-Rust system component; is quiche suitable, or must I rewrite QUIC?
For: A mobile systems engineer responsible for the Android DNS resolver who needs to integrate QUIC/HTTP/3 into a non-Rust environment through FFI.

Yes, provided the team can handle FFI, mobile builds, and low-level event scheduling rather than expecting a turnkey Android HTTP client.

  • The README explicitly says that Android’s DNS resolver uses quiche to implement DNS over HTTP/3, directly matching this use case.
  • Project insights state that quiche exposes FFI for Android, iOS, and C/C++ projects; the project is primarily Rust with some C code.
  • quiche does not own sockets, the event loop, or timers, so the Android host must connect these to its own networking and scheduling model.
  • ABI compatibility, ownership across the FFI boundary, TLS dependencies, and minimum OS versions matter; the provided README excerpt does not specify their complete requirements.
  • Who uses quiche? / Android: Android's DNS resolver uses quiche to implement DNS over HTTP/3
  • Project insight: FFI support for Android, iOS, and C/C++ projects
  • Introduction: the application supplies I/O and the timer-capable event loop
  • Project data: primary language Rust; language distribution includes C
Not stated in the README:The excerpt does not provide the Android NDK, cargo-ndk, minimum API level, target ABIs, or complete build commands.;It does not describe the resolver’s FFI interface, threading model, TLS backend, or lifetime management.

✨ Highlights

  • Implements the IETF QUIC transport protocol and HTTP/3
  • Used by Cloudflare, Android DNS, and curl
  • Provides a Rust API and a C FFI build path
  • Supports Android NDK 19+ and iOS architectures

🔧 Engineering

  • Config manages QUIC version, ALPN, flow control, and congestion control
  • connect, accept, recv, and send form the connection-processing API
  • stream_send and stream_recv handle application stream data
  • cargo-ndk and cargo-lipo support mobile-platform builds

⚠️ Risks

  • The low-level API requires the application to provide sockets, an event loop, and timers
  • The README explicitly says quiche-apps are unsuitable for production
  • Several Config defaults are zero, requiring six categories of flow-control settings
  • The quiche-server example uses a self-signed certificate that must not be used in production

👥 For who?

  • Teams integrating QUIC or HTTP/3 into Rust applications
  • Network engineers who already have socket, event-loop, and timer infrastructure
  • Mobile teams needing an Android NDK or iOS FFI library
  • Developers maintaining curl HTTP/3 or DNS-over-HTTP/3 integrations