Description
There are a couple of reasons to support QUIC network protocol.
The first, slightly minor, is that validators are maintaining more than 1000 TCP connections open and are running into file descriptor limits.
Second is we use Yamux for multiplexing multiple substreams into one, which is a rather poor protocol that does the best it can on top of TCP, but can't do more.
Because we can't know the TCP window size from user space, we can't actually properly allocate window sizes to individual substreams. If two or more substreams send a big volume of data, we'll run into head of line blocking issues (This is the same reason why HTTP2 is not so great and is being replaced with HTTP3, if you want to read more)
Third reason is we're suffering from a TCP slow start issue. A TCP connection is almost unused, and suddenly we send for example 2 MiB on it. Because of TCP slow start, it's going to take a rather long time to send these 2 MiBs even if the connection would be capable of sending them quickly.
First attempt was made in paritytech/substrate#6366.
So far there is https://crates.io/crates/libp2p-quic which should be reviewed.
The list of sub issues will be updated time to time:
- TLS 1.3 vs Noise. The golang version uses TLS (see https://github.com/libp2p/specs/blob/master/tls/tls.md#peer-authentication), also there is no nQUIC specs, so to be compatible with libp2p we have to use TLS+QUIC.
- Inspect whether we can replace
x509-signature
withpicky
. The answer is we can replace it with any crate we can includingx509-parser
,picky
, etc... - Implement x509 cert serializer, parser, verifier Add initial code handling certificate kpp/rust-libp2p#1
- Implement verification of all signature algorithms according to TLS 1.3 standard Support all verification algorithms kpp/rust-libp2p#4
- Implement rustls ServerCertVerifier & ClientCertVerifier Implement rustls ServerCertVerifier & ClientCertVerifier kpp/rust-libp2p#6
- Make libp2p-quic binary compatible with the go implementation (a standalone issue) Make tls cert binary compat with the go implementation ipfs-rust/libp2p-quic#6
- R&D: a basic QUIC server R&D: accept tls handshake and read a simple QUIC message kpp/rust-libp2p#8
- The existing crate
libp2p-quic
now supports TLS, but there still some issues left. - Integrate
libp2p-quic
intorust-libp2p
with the help of its maintainersLibp2p quic second attempt libp2p/rust-libp2p#2159transports/quic: Add implementation based onquinn-proto
libp2p/rust-libp2p#2289 - Integrate
libp2p-quic
intosubstrate
Add experimental support for QUIC substrate#11514.
Metadata
Assignees
Labels
Type
Projects
Status
In Progress 🛠