MsQuic: Microsoft's C QUIC Library for C, C++, C# and Rust
Cross-platform, C implementation of the IETF QUIC protocol, exposed to C, C++, C# and Rust.
At a glance
- What is it?
- MsQuic is a cross-platform C implementation of IETF QUIC with C++, Rust and C# interop layers. It fits teams that need QUIC inside an existing native stack, and it is heavier than a self-contained QUIC crate.
- Who is it for?
- Adopt MsQuic if you need QUIC behind a C ABI and want the same library on Windows and Linux, with C++, Rust or C# bindings on top. Do not adopt it if you want a pure-Rust or pure-C# QUIC stack with no native artifact in your build, or if you cannot vendor the quictls and OpenSSL submodules.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly C, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The gap MsQuic fills: QUIC as a library, not a product
QUIC is defined in RFC 9000 and its companions, and the README lists support for RFC 9000, 9001, 9002, 9221, 9287, 9368 and 9369, plus drafts for load balancers, ACK frequency, disabling encryption, performance, CIBIR, timestamps and reliable stream reset. The practical question for an engineer is not whether QUIC exists but where the implementation sits in your process. MsQuic is a general purpose QUIC library written in C, so it can be linked into a C or C++ service, wrapped by C++ API classes, or reached through the Rust and C# interop layers. That is a different product shape from a QUIC server binary or a language-native stack. The intended audience is people who already own a transport path and want QUIC underneath it: proxies, storage clients, RPC layers, game and media backends, and anything that needs one implementation across Windows and Linux rather than one per platform. The README is explicit that MsQuic is optimized for client and server, which matters because several QUIC implementations pick one side.
Handles, callbacks and the asynchronous core
The API is handle based and asynchronous. You register a configuration, open listeners or connections, and the library drives the handshake and stream state machine, delivering results through callbacks rather than blocking calls. That design is what makes the same core usable from a C event loop, a C# async method and a Rust wrapper. Underneath, the library advertises receive side scaling, UDP send and receive coalescing, and kernel stack bypass through XDP on Windows. Those are throughput and latency features, and they also explain why the library is not a thin wrapper over a socket: it wants control of the UDP path and, on some platforms, of the kernel path. The README also points at a deployment document, which is the honest signal that QUIC in production is a network configuration problem as much as a code problem. The C# and Rust surfaces are interop layers over the same C core, not reimplementations, so behaviour and bugs are shared across all four languages. The README does not spell out the internal worker, timer or buffer architecture; for that you have to read the contributor docs and the source.
Installing MsQuic and running a first sample
The README points to docs/BUILD.md for building the library and docs/Sample.md for the quick start guide, which covers running a sample server and client app. The sample source lives at src/tools/sample/sample.c. The repository carries CMakeLists.txt, CMakePresets.json and a scripts directory, and the Rust crate lists scripts/build.rs as its build script, so the Rust path compiles the C library from the same tree. The Rust package on crates.io is named msquic, version 2.7.0-beta in Cargo.toml, and the C# packages are published under the Microsoft.Native.Quic.MsQuic.* names on NuGet. Read docs/BUILD.md before running anything; the exact configure and build commands are there and are platform specific, and the Rust and C# routes have their own build steps. A minimal Rust dependency looks like this:
[dependencies]
msquic = "2.7.0-beta"The C# route uses the NuGet packages instead, and the C route links the built library and includes the API header described in docs/API.md. The README does not give a single copy-paste build command that works on every platform, so treat the platform documents as the entry point rather than guessing flags.
Where MsQuic is the wrong tool
MsQuic is a C library with submodules, and the Rust crate manifest includes the quictls and OpenSSL trees in its package contents. If your project forbids vendored TLS code or a native build step, this is friction you cannot remove by configuration. A pure managed or pure Rust stack avoids that, at the cost of a second implementation to track. The second boundary is scope: MsQuic is a QUIC transport, not an HTTP/3 server. The README describes a general purpose QUIC library and does not claim HTTP/3 framing, so if you want a web server you are choosing the wrong layer. Third, the README does not document rollback or downgrade behaviour, and it does not describe a supported migration path between release lines beyond pointing at docs/Release.md. Version management is therefore something you verify from that document and from the release notes rather than from the README. Finally, the README does not document operational limits such as connection ceilings or memory budgets, so capacity planning has to come from the performance dashboard and your own load tests.
MsQuic compared with Quiche
Quiche is the comparison people search for, and the difference is architectural. Quiche is a Rust implementation of QUIC and HTTP/3 from Cloudflare, with C bindings layered on top of the Rust core. MsQuic goes the other way: the core is C, and the Rust and C# layers are interop on top of it. That direction decides what you debug. With MsQuic, a crash or a stall lands in C, and the Rust crate is a wrapper over that C library, which is why the crate ships a build script that compiles the C sources. With Quiche, the core is Rust and the C API is the wrapper, so a Rust project gets a native dependency and a C project gets a binding. The second difference is HTTP/3. Quiche is positioned around QUIC and HTTP/3 together, while MsQuic's README presents a general purpose QUIC library and lists protocol drafts such as load balancers and ACK frequency. If your requirement is an HTTP/3 endpoint, that distinction matters more than language preference. Both are permissively licensed, both are cross-platform, and both expect you to own the UDP socket and deployment story.
Releases, maintenance and the MIT licence
The last push to the default branch was on 2026-09-22, and the most recent releases are v2.6.1, v2.5.11 and v2.4.20, all dated 2026-08-28. Three release lines published on the same day is a deliberate pattern: fixes land on older lines rather than only on the newest one. The cost is that you have to know which line you are on and read docs/Release.md, which the README names as the place for release details and supported versions. Upgrading across lines is a real task, not a version bump, and the README does not describe an automatic migration path. The licence is MIT, stated in the README badge list and in Cargo.toml, which is permissive and compatible with closed-source linking. That is not legal advice, and it does not cover the bundled TLS code: the repository carries a THIRD-PARTY-NOTICES file and the Cargo manifest includes the quictls and OpenSSL submodule trees, so the licence obligations of those components travel with your build. Check that file before shipping a product that links MsQuic statically.
Editorial conclusion
Adopt MsQuic if you need QUIC behind a C ABI and want the same library on Windows and Linux, with C++, Rust or C# bindings on top. Do not adopt it if you want a pure-Rust or pure-C# QUIC stack with no native artifact in your build, or if you cannot vendor the quictls and OpenSSL submodules. Before committing, read docs/Platforms.md for the platforms you target, docs/Release.md for which release lines are supported, and docs/Deployment.md for what the library expects from the host around UDP and TLS.
Frequently asked questions
What is MsQuic?
MsQuic is Microsoft's cross-platform implementation of the IETF QUIC protocol, written in C and designed as a general purpose QUIC library. It also provides C++ API wrapper classes and interop layers for Rust and C#.
How do I use MsQuic in a project?
The README points to docs/BUILD.md for building the library, docs/API.md and src/tools/sample/sample.c for the API, and docs/Sample.md for running a sample server and client. Rust users depend on the msquic crate, and C# users take the Microsoft.Native.Quic.MsQuic.* NuGet packages.
What is msquic sys?
The README and repository files describe the msquic crate, whose build script compiles the C library from the same tree, but they do not describe a separate msquic-sys package.
What is the msquic service?
The README does not document a service component or a Windows service wrapper. It describes a library plus a sample server and client app under src/tools/sample, with deployment covered in docs/Deployment.md.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/microsoft-msquic)