0.8.0
We are happy to announce the release of 0.8.0 of Quinn, our pure-Rust implementation of the QUIC transport protocol, a next-generation TCP successor specified by the IETF.
After 8 months of development since the release of 0.7.0, we finally have a new release. This release is the first to support QUIC v1 as specified in RFC 9000, in addition to supporting draft versions 29 to 32 (inclusive). The configuration API has been substantially simplified in part to work with the new rustls 0.20 configuration builders, two modern congestion controller implementations are now available, Quinn types are no longer parametrized with the crypto session type, and performance has been significantly improved.
Important changes:
- Update to rustls 0.20, which necessitated numerous changes to configuration APIs (#1150)
- Use
dyn Session
for crypto session types, simplifying the API and reducing compile times (#1201) - Add support for multiple QUIC versions (#1232)
Functional improvements
- Add an implementation of the CUBIC congestion controller (#1122, thanks to @FrankSpitulski)
- Make the Cubic congestion controller the default (#1165)
- Add an implementation of the BBR congestion controller (#1151, thanks to @FrankSpitulski)
- Add
must_use
warnings for all types that implementFuture
(#1139, thanks to @lberrymage) - Drop outgoing packets on permission errors during transmission (#1157, thanks to @Matthias247)
- Log (with rate limiting), then ignore transmission errors (#1172, thanks to @Matthias247)
- Make
TransportConfig
setters infallible (#1177, thanks to @connec) - Allow dynamically changing an
Endpoint
'sServerConfig
(#1191, thanks to @BiagioFesta) - Send ping on rebind to ensure peers notice migration (#1217)
- Improve persistent congestion handling to allow faster recovery (#1223)
- Relax anti-amplification checks to be less strict (#1148, thanks to @Matthias247)
Performance improvements
- Increase the amount of CRYPTO data sent in handshake packets (#1112, thanks to @Matthias247)
- Add alternative range set implementation for tracking ACKs (#1115, thanks to @Matthias247)
- Dynamically adapt endpoint work distribution (#1133, thanks to @Matthias247)
- Use
WorkLimiter
for sending data (#1192, thanks to @Matthias247) - Improve fairness of task execution (#1119 and #1127, thanks to @Matthias247)
- Avoid allocations for connection IDs (#1120, thanks to @Matthias247)
- Prevent sending ACK-only packets (#1130, thanks to @Matthias247)
Bug fixes
- Reduce default size of datagrams in order to comply with the spec (#1156, thanks to @BiagioFesta)
- Apply (QUIC) datagram frame size to entire frame (#1229)
- Fix cases of spurious transmit readiness (#1227)
- Remove incorrect spurious migration handling (#1144)
- Prevent incorrect end-of-stream result when reading into empty slice (#1159)
- Account received data for the most recent path (#1143, thanks to @Matthias247)
- Disable generic segmentation offload (GSO) after encountering EIO on send (#1210)
Other improvements
- Reduce dependencies on futures-rs crates (#1175, thanks to @xMAC94x)
- Disable unused default features for various crates (#1184, thanks to @some-dood)
- Extract quinn-udp crate for reuse in different projects (#1180, thanks to @kpp)
- Remove unused
ConfigError
variant (#1181, thanks to @connec) - Improved bulk data benchmarks (#1193, thanks to @Matthias247)
While we don't always have large amounts of pre-defined good first issues setup due to the fast moving development, we're also always happy to mentor new contributors, independent of their prior level of Rust experience! We tend to respond to issues and PRs pretty quickly, and we have a responsive Gitter/Matrix channel.