feat: auto-tune stream receive window
Previously the stream send and receive window had a hard limit at 1MB. On high latency and/or high bandwidth connections (i.e. large bandwidth-delay product), 1 MB is not enough to exhaust the available bandwidth.
Sample scenario:
delay_s = 0.05
window_bits = 1 * 1024 * 1024 * 8
bandwidth_bits_s = window_bits / delay_s
bandwidth_mbits_s = bandwidth_bits_s / 1024 / 1024 # 160.0
In other words, on a 50 ms connection a 1 MB window can at most achieve 160 Mbit/s.
This commit introduces an auto-tuning algorithm for the stream receive window, increasing the window towards the bandwidth-delay product of the connection.
Work in progress for now. Able to transfer >160Mbit/s on a 50ms link already.
Currently implementing the algorithm proposed in https://github.com/mozilla/neqo/issues/733#issuecomment-2065966029. I still have to familiarize myself with the algorithm proposed in https://github.com/mozilla/neqo/issues/733#issuecomment-2081974078. Which ever is chosen, both need the same scaffolding.
Fixes https://github.com/mozilla/neqo/issues/733.
TODO
- [ ] Reasonable upper limit (e.g. 500ms and 1gbit/s)
- [ ] Shrink buffers
- [ ] Investigate only linear CC increase on simulator (no loss)
Failed Interop Tests
QUIC Interop Runner, client vs. server
All results
QUIC Interop Runner, client vs. server
Succeeded Interop Tests
- aioquic vs. neqo-latest: H DC
- go-x-net vs. neqo-latest: H DC
- kwik vs. neqo-latest: H DC
- lsquic vs. neqo-latest: H DC
- msquic vs. neqo-latest: H DC
- mvfst vs. neqo-latest: H DC
- neqo vs. neqo-latest: H DC
- neqo-latest vs. aioquic: H DC
- neqo-latest vs. go-x-net: H DC
- neqo-latest vs. haproxy: H DC
- neqo-latest vs. kwik: H DC
- neqo-latest vs. lsquic: H DC
- neqo-latest vs. msquic: H DC
- neqo-latest vs. mvfst: H
- neqo-latest vs. neqo: H DC
- neqo-latest vs. neqo-latest: H DC
- neqo-latest vs. nginx: H DC
- neqo-latest vs. ngtcp2: H DC
- neqo-latest vs. picoquic: H DC
- neqo-latest vs. quic-go: H DC
- neqo-latest vs. quiche: H DC
- neqo-latest vs. quinn: H DC
- neqo-latest vs. s2n-quic: H DC
- neqo-latest vs. xquic: H DC
- ngtcp2 vs. neqo-latest: H DC
- picoquic vs. neqo-latest: H DC
- quic-go vs. neqo-latest: H DC
- quiche vs. neqo-latest: H DC
- quinn vs. neqo-latest: H DC
- s2n-quic vs. neqo-latest: H DC
- xquic vs. neqo-latest: H DC
Unsupported Interop Tests
- chrome vs. neqo-latest: H DC
Failed Interop Tests
QUIC Interop Runner, client vs. server
neqo-latest as client
- neqo-latest vs. aioquic: Z L1
- neqo-latest vs. msquic: A
- neqo-latest vs. mvfst: A L1 C1
- neqo-latest vs. quic-go: L1
- neqo-latest vs. quiche: C1
- neqo-latest vs. quinn: L1
- neqo-latest vs. xquic: M A
neqo-latest as server
- chrome vs. neqo-latest: 3
- lsquic vs. neqo-latest: run cancelled after 20 min
- msquic vs. neqo-latest: Z U
- mvfst vs. neqo-latest: Z A L1 C1
- quinn vs. neqo-latest: V2
- xquic vs. neqo-latest: M
All results
Succeeded Interop Tests
QUIC Interop Runner, client vs. server
neqo-latest as client
- neqo-latest vs. aioquic: H DC LR C20 M S R 3 B U A L2 C1 C2 6 V2
- neqo-latest vs. go-x-net: H DC LR M B U A L2 C2 6
- neqo-latest vs. haproxy: H DC LR C20 M S R Z 3 B U A L1 L2 C1 C2 6 V2
- neqo-latest vs. kwik: H DC LR C20 M S R Z 3 B U A L1 L2 C1 C2 6 V2
- neqo-latest vs. lsquic: H DC LR C20 M S R Z 3 B U E A L1 L2 C1 C2 6 V2
- neqo-latest vs. msquic: H DC LR C20 M S R Z B U L1 L2 C1 C2 6 V2
- neqo-latest vs. mvfst: H DC LR M R Z 3 B U L2 C2 6
- neqo-latest vs. neqo: H DC LR C20 M S R Z 3 B U E A L1 L2 C1 C2 6 V2
- neqo-latest vs. neqo-latest: H DC LR C20 M S R Z 3 B U E A L1 L2 C1 C2 6 V2
- neqo-latest vs. nginx: H DC LR C20 M S R Z 3 B U A L1 L2 C1 C2 6
- neqo-latest vs. ngtcp2: H DC LR C20 M S R Z 3 B U E A L1 L2 C1 C2 6 V2
- neqo-latest vs. picoquic: H DC LR C20 M S R Z 3 B U E A L1 L2 C1 C2 6 V2
- neqo-latest vs. quic-go: H DC LR C20 M S R Z 3 B U A L2 C1 C2 6
- neqo-latest vs. quiche: H DC LR C20 M S R Z 3 B U A L1 L2 C2 6
- neqo-latest vs. quinn: H DC LR C20 M S R Z 3 B U E A L2 C1 C2 6
- neqo-latest vs. s2n-quic: H DC LR C20 M S R 3 B U E A L1 L2 C1 C2 6
- neqo-latest vs. xquic: H DC LR C20 R Z 3 B U L1 L2 C1 C2 6
neqo-latest as server
- aioquic vs. neqo-latest: H DC LR C20 M S R Z 3 B A L1 L2 C1 C2 6 V2
- go-x-net vs. neqo-latest: H DC LR M B U A L2 C2 6
- kwik vs. neqo-latest: H DC LR C20 M S R Z 3 B U A L1 L2 C1 C2 6 V2
- msquic vs. neqo-latest: H DC LR C20 M S R B A L1 L2 C1 C2 6 V2
- mvfst vs. neqo-latest: H DC LR M 3 B L2 C2 6
- neqo vs. neqo-latest: H DC LR C20 M S R Z 3 B U E A L1 L2 C1 C2 6 V2
- ngtcp2 vs. neqo-latest: H DC LR C20 M S R Z 3 B U E A L1 L2 C1 C2 6 V2
- picoquic vs. neqo-latest: H DC LR C20 M S R Z 3 B U E A L1 L2 C1 C2 6 V2
- quic-go vs. neqo-latest: H DC LR C20 M S R Z 3 B U A L1 L2 C1 C2 6
- quiche vs. neqo-latest: H DC LR M S R Z 3 B A L1 L2 C1 C2 6
- quinn vs. neqo-latest: H DC LR C20 M S R Z 3 B U E A L1 L2 C1 C2 6
- s2n-quic vs. neqo-latest: H DC LR M S R 3 B E A L1 L2 C1 C2 6
- xquic vs. neqo-latest: H DC LR C20 S R Z 3 B U A L1 L2 C1 C2 6
Unsupported Interop Tests
QUIC Interop Runner, client vs. server
neqo-latest as client
- neqo-latest vs. aioquic: E
- neqo-latest vs. go-x-net: C20 S R Z 3 E L1 C1 V2
- neqo-latest vs. haproxy: E
- neqo-latest vs. kwik: E
- neqo-latest vs. msquic: 3 E
- neqo-latest vs. mvfst: C20 S E V2
- neqo-latest vs. nginx: E V2
- neqo-latest vs. quic-go: E V2
- neqo-latest vs. quiche: E V2
- neqo-latest vs. quinn: V2
- neqo-latest vs. s2n-quic: Z V2
- neqo-latest vs. xquic: S E V2
neqo-latest as server
- aioquic vs. neqo-latest: U E
- chrome vs. neqo-latest: H DC LR C20 M S R Z B U E A L1 L2 C1 C2 6 V2
- go-x-net vs. neqo-latest: C20 S R Z 3 E L1 C1 V2
- kwik vs. neqo-latest: E
- msquic vs. neqo-latest: 3 E
- mvfst vs. neqo-latest: C20 S R U E V2
- quic-go vs. neqo-latest: E V2
- quiche vs. neqo-latest: C20 U E V2
- s2n-quic vs. neqo-latest: C20 Z U V2
- xquic vs. neqo-latest: E V2