mirror of
https://github.com/n0-computer/noq.git
synced 2026-09-19 01:36:08 +00:00
110 lines
4.7 KiB
Markdown
110 lines
4.7 KiB
Markdown
# 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 TLS 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.
|