# noq
[](https://docs.rs/noq/)
[](https://crates.io/crates/noq)
[](https://discord.com/invite/DpmJgtU7cW)
[](LICENSE-MIT)
[](LICENSE-APACHE)
General purpose implementation of the [QUIC transport
protocol](https://www.rfc-editor.org/rfc/rfc9000.html) in pure
Rust. Noq is built as an async-friendly API in the `noq` crate on top
of a sans-io protocol library in `noq-proto`.
Noq started out as a fork of the excellent
[Quinn](https://github.com/quinn-rs/quinn) project. The main focus of
development has been towards adding support for more QUIC (draft)
extensions:
- [QUIC Multipath](https://datatracker.ietf.org/doc/draft-ietf-quic-multipath/)
- [QUIC Address Discovery](https://datatracker.ietf.org/doc/draft-ietf-quic-address-discovery/) (QAD)
- [Using QUIC to traverse Nat's](https://datatracker.ietf.org/doc/draft-seemann-quic-nat-traversal/) (QNT)
## Features
- Easy to use futures-based async API.
- Client and server server functionality.
- 0-RTT and 0.5-RTT data support.
- Ordered and unordered stream reads.
- Custom and zero-length connection identifiers.
- Fully pluggable crypto API with a [Rustls] implementation using
[ring] or [aws-lc-rs] provided by default for convenience.
- Broad platform support, including Linux, Windows, macOS, android,
iOS and wasm.
[Rustls]: https://github.com/rustls/rustls
[ring]: https://github.com/briansmith/ring
[aws-lc-rs]: https://github.com/aws/aws-lc-rs
## Standards
The noq library aims to be correct implementation of various QUIC
standards:
- Supports the core QUIC specifications:
- [RFC 8999 - Version-Independent Properties of QUIC].
- [RFC 9000 - QUIC: A UDP-Based Multiplexed and Secure Transport].
- [RFC 9001 - Using TLS to Secure QUIC].
- [RFC 9002 - QUIC Loss Detection and Congestion Control].
- The standardised QUIC extensions:
- [RFC 9221 - An Unreliable Datagram Extension to QUIC].
- [RFC 9287 - Greasing the QUIC Bit].
- [RFC 9368 - Compatible Version Negotiation for QUIC].
- Draft extensions:
- [qlog: Structured Logging for Network Protocols].
- [QUIC Multipath].
- With experimental qlog support.
- [QUIC Address Discovery] (QAD).
- [Using QUIC to traverse NATs] (QNT).
[RFC 8999 - Version-Independent Properties of QUIC]: https://www.rfc-editor.org/rfc/rfc8999.html
[RFC 9000 - QUIC: A UDP-Based Multiplexed and Secure Transport]: https://www.rfc-editor.org/rfc/rfc9000.html
[RFC 9001 - Using TL'S to Secure QUIC]: https://www.rfc-editor.org/rfc/rfc9001.html
[RFC 9002 - QUIC Loss Detection and Congestion Control]: https://www.rfc-editor.org/rfc/rfc9002.html
[RFC 9221 - An Unreliable Datagram Extension to QUIC]: https://www.rfc-editor.org/rfc/rfc9221.html
[RFC 9287 - Greasing the QUIC Bit]: https://www.rfc-editor.org/rfc/rfc9287.html
[RFC 9368 - Compatible Version Negotiation for QUIC]: https://www.rfc-editor.org/rfc/rfc9368.html
[RFC 9369 - QUIC Version 2]: https://www.rfc-editor.org/rfc/rfc9369.html
[qlog: Structured Logging for Network Protocols]: https://quicwg.org/qlog/draft-ietf-quic-qlog-main-schema.html
[QUIC Multipath]: https://datatracker.ietf.org/doc/draft-ietf-quic-multipath/
[QUIC Address Discovery]: https://datatracker.ietf.org/doc/draft-ietf-quic-address-discovery/
[Using QUIC to traverse NATs]: https://datatracker.ietf.org/doc/draft-seemann-quic-nat-traversal/.
## Getting started
Examples at https://github.com/n0-computer/noq/blob/main/noq/examples
```
$ cargo run --example server ./
$ cargo run --example client https://localhost:4433/Cargo.toml
```
This launches an HTTP 0.9 server over the QUIC transport on the
loopback address serving the current working directory, with the
client fetching ./Cargo.toml. By default, the server generates a
self-signed certificate and stores it to disk, where the client will
automatically find and trust it.
## License
Copyright 2025 The quinn developers
Copyright 2025 N0, INC.
This project is licensed under either of
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or
http://opensource.org/licenses/MIT)
at your option.
## Contribution
Unless you explicitly state otherwise, any contribution intentionally
submitted for inclusion in this project by you, as defined in the
Apache-2.0 license, shall be dual licensed as above, without any
additional terms or conditions.