Futures-based QUIC implementation in Rust

Overview

Documentation Crates.io Build status codecov Chat Chat License: MIT License: Apache 2.0

Pure-rust QUIC protocol implementation

Quinn is a pure-rust, future-based implementation of the QUIC transport protocol undergoing standardization by the IETF. This library is at draft 32.

Features

  • Simultaneous client/server operation
  • Ordered and unordered stream reads for improved performance
  • Works on stable Rust, tested on Linux, macOS and Windows
  • Pluggable cryptography, with a standard implementation backed by rustls and ring
  • Application-layer datagrams for small, unreliable messages
  • Future-based async API
  • Experimental HTTP over QUIC
  • The minimum supported Rust version is 1.45.0

Overview

  • quinn: High-level async API based on tokio, see for usage. This will be used by most developers. (Basic benchmarks are included.)
  • quinn-proto: Deterministic state machine of the protocol which performs no I/O internally and is suitable for use with custom event loops (and potentially a C or C++ API).
  • quinn-h3: Contains an implementation of HTTP-3 and QPACK. It is split internally in a deterministic state machine and a tokio-based high-level async API.
  • bench: Benchmarks without any framework.
  • interop: Tooling that helps to run interoperability tests.
  • fuzz: Fuzz tests.

Getting Started

Examples

$ cargo run --example server ./
$ cargo run --example client https://localhost:4433/Cargo.toml

This launches an HTTP 0.9 server 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.

Links

Usage Notes

Click to show the notes

Buffers

A Quinn endpoint corresponds to a single UDP socket, no matter how many connections are in use. Handling high aggregate data rates on a single endpoint can require a larger UDP buffer than is configured by default in most environments. If you observe erratic latency and/or throughput over a stable network link, consider increasing the buffer sizes used. For example, you could adjust the SO_SNDBUF and SO_RCVBUF options of the UDP socket to be used before passing it in to Quinn. Note that some platforms (e.g. Linux) require elevated privileges or modified system configuration for a process to increase its UDP buffer sizes.

Certificates

By default, Quinn clients validate the cryptographic identity of servers they connect to. This prevents an active, on-path attacker from intercepting messages, but requires trusting some certificate authority. For many purposes, this can be accomplished by using certificates from Let's Encrypt for servers, and relying on the default configuration for clients.

For some cases, including peer-to-peer, trust-on-first-use, deliberately insecure applications, or any case where servers are not identified by domain name, this isn't practical. Arbitrary certificate validation logic can be implemented by enabling the dangerous_configuration feature of rustls and constructing a Quinn ClientConfig with an overridden certificate verifier by hand.

When operating your own certificate authority doesn't make sense, rcgen can be used to generate self-signed certificates on demand. To support trust-on-first-use, servers that automatically generate self-signed certificates should write their generated certificate to persistent storage and reuse it on future runs.

Contribution

All feedback welcome. Feel free to file bugs, requests for documentation and any other feedback to the issue tracker.

The quinn-proto test suite uses simulated IO for reproducibility and to avoid long sleeps in certain timing-sensitive tests. If the SSLKEYLOGFILE environment variable is set, the tests will emit UDP packets for inspection using external protocol analyzers like Wireshark, and NSS-compatible key logs for the client side of each connection will be written to the path specified in the variable.

The minimum supported Rust version for published releases of our crates will always be at least 6 months old at the time of release.

Authors

  • Dirkjan Ochtman - Project owner & founder
  • Benjamin Saunders - Project owner & founder
  • Jean-Christophe Begue - Project collaborator, author of the HTTP/3 Implementation
Comments
  • Invalid assumption about SocketAddrV{4,6} layout

    Invalid assumption about SocketAddrV{4,6} layout

    It looks like we're assuming that std::net::Ipv4 matches the libc sockaddr_in (same for IPv6), for example in https://github.com/quinn-rs/quinn/blob/main/quinn/src/platform/unix.rs#L357. However, the standard library never guaranteed this, and in fact is looking at changing this in https://github.com/rust-lang/rust/pull/78802. We should fix our usage.

    bug 
    opened by djc 32
  • (Pie in the sky) Supporting Noise as the cryptographic protocol

    (Pie in the sky) Supporting Noise as the cryptographic protocol

    We have an internal abstraction over the cryptographic protocol used called the crypto::Session. (Note that this trait is currently private, so you'd have to make this public to start work. We'd be happy to merge that, but would likely prefer doing so when something materializes that actually uses that.)

    Currently we have a single implementation for rustls. In QUIC v1, only TLS 1.3 is officially supported, so supporting something else is technically outside of the spec and can thus probably only be made to work between two consenting endpoints.

    If we wanted to support Noise, that would likely start by writing an implementation of this thread that is based on Noise. I think there are some crates that implement (parts of) Noise -- snow probably makes for a good start.

    There was a 2018 attempt at integrating Noise support into a much earlier version of Quinn. Quinn looks basically nothing like it did at the time, but maybe there are still useful bits to look at there.

    If you want to work on this, we're usually available for questions on our Gitter channel -- just commenting in this issue should also work fine.

    help wanted 
    opened by djc 24
  • quinn_udp: use async_io instead of tokio

    quinn_udp: use async_io instead of tokio

    This is a continuation of https://github.com/quinn-rs/quinn/pull/1180. I tried to keep both the changes by @dvc94ch and the original code, however I had to make a monkey fix in cmgs.rs in order to fix tests.

    @dvc94ch all good?

    opened by kpp 21
  • Allow connection to return peer certificates

    Allow connection to return peer certificates

    Experiment on implement libp2p-tls.

    But it need peer's certificates. I see rustls has get_peer_certificates func on Session trait. Consider add it to crypto::Session in quinn-proto and Connection in quinn.

    opened by zeroqn 21
  • Update `tokio`, `futures` and `bytes`.

    Update `tokio`, `futures` and `bytes`.

    Old postI had to put `tracing` to `0.1.9` until https://github.com/tokio-rs/mio/pull/1170 is resolved.

    Also https://github.com/carllerche/string/pull/17 and https://github.com/carllerche/string/pull/18 need to pass, but there are probably workarounds for those. This is also an option: https://github.com/carllerche/string/pull/20.

    Examples and tests aren't done yet, ~~I'm still trying to get the server <-> client example to work~~.

    Any help is appreciated!

    This updates the following:

    • tokio: 0.2.0-alpha.6 -> 0.2.2
    • futures: 0.3.0-alpha.18 -> 0.3.1
    • bytes: 0.4.7 -> 0.5.2
    • string: 0.2 -> master
    • http: a3a8fcb213bc456e0b7a42cf0e2bd57afa49851b -> 43dffa1eb79f6801e5e07f3338fa56191dc454bb

    Tests, examples and benchmarks are minimally changed to keep the PR small.

    opened by daxpedda 21
  • Provide local and remote socket addresses from a `Connecting`

    Provide local and remote socket addresses from a `Connecting`

    libp2p needs to know the local and remote socket addresses for every incoming connection as soon as the connection is accepted. Is this a feature that you would be willing to include? If so, I will submit a PR.

    enhancement 
    opened by Demi-Marie 21
  • [Feature]: Make configuration fields in `quinn-proto` public

    [Feature]: Make configuration fields in `quinn-proto` public

    Some Arc Shenanigans

    To initialize a server/client endpoint, Quinn first requires configuration (e.g. via TransportConfig, ServerConfig, etc.). As mentioned in the documentation, the default options are sufficient for most use cases. Otherwise, we have to go through some hoops with setter methods to achieve the behavior we want.

    use quinn::{ServerConfig, TransportConifg, VarInt};
    use std::{sync::Arc, time::Duration};
    
    // Configure some special ALPN protocols via `rustls`
    let mut server_config = ServerConfig::with_crypto(crypto);
    
    // Create a new transport configuration, and modify its defaults
    let mut transport_config = TransportConfig::default();
    transport_config
        .keep_alive_interval(Some(Duration::from_secs(30)))
        .max_idle_timeout(Some(VarInt::from(60u32).into()));
    
    // And then... replace the old transport config? This is necessary
    // because there's no public constructor for `ServerConfig` that accepts a
    // `TransportConfig` at the moment; there is only one for the `crypto` field.
    server_config.transport = Arc::new(transport_config);
    
    // Alternatively, we may also modify through the `Arc` directly
    // since we're the sole owner of the reference at the moment.
    // But, now we're forced to use a nasty `unwrap` in the code...
    //
    // We may, of course, succumb to the `unsafe` version: `unwrap_unchecked`.
    // Although this is technically legal, the Quinn public API documents
    // no guarantees about the reference count of the `transport` field. Hence,
    // a version bump may unintentionally invoke undefined behavior if we're not careful.
    Arc::get_mut(&mut server_config.transport)
        .unwrap()
        .keep_alive_interval(Some(Duration::from_secs(30)))
        .max_idle_timeout(Some(VarInt::from(60u32).into()));
    
    // Finally initialize the endpoint
    let (endpoint, incoming) = Endpoint::server(server_config, addr)?;
    

    I hope the example above demonstrates my nitpicks with the current API. This is exactly what I faced in one of my projects which required a custom protocol (mostly for network efficiency's sake because JSON-over-HTTP is too verbose).

    My Proposed Solution

    Instead, I propose that all fields of the various *Config structs be made public. After all, most of their methods are solely transparent setters. We may as well treat the fields to be public.

    To accommodate for default values, we simply use the default spread syntax (..Default::default()) when initializing from the user code.

    use quinn::{ServerConfig, TransportConifg, VarInt};
    use std::{sync::Arc, time::Duration};
    
    // NOTE: Observe that `mut` is no longer necessary.
    let server_config = ServerConfig {
        // Configure some special ALPN protocols via `rustls`
        crypto: Arc::new(rustls::server::ServerConfig { ... }),
        transport: Arc::new(TransportConfig {
            keep_alive_interval: Some(Duration::from_secs(30)),
            max_idle_timeout: Some(VarInt::from(60u32).into()),
            // πŸŽ‰ Hooray for default values! πŸŽ‰
            ..Default::default()
        }),
        // πŸŽ‰ Hooray for **more** default values! πŸŽ‰
        // ASIDE: `ServerConfig` does not currently implement `Default`
        // as of Quinn 0.8. This should be addressed before proceeding.
        ..Default::default()
    };
    
    // Finally initialize the endpoint
    let (endpoint, incoming) = Endpoint::server(server_config, addr)?;
    

    Here, I demonstrate the fact that we no longer have to jump through the hoops of indirection. In particular, direct initialization allows us to remove the Arc shenanigans altogether.

    This, to me, is a significantly more ergonomic API than using the original setters. Of course, we don't have to remove the setters from the library. Though, I am not totally against deprecation.

    I would love to know your thoughts about this API change. I'd love to send in a PR that addresses this. Just wanted to collect some feedback before committing my time.

    opened by Some-Dood 20
  • Relation between Connection and IncomingStreams

    Relation between Connection and IncomingStreams

    On a successful connection in either direction (i.e., either actively via connect or passively via listen) I get two things eventually - one Connection and one IncomingStreams. As a user i expect these to be related at some level since they denote a connection to the peer. However it seems that closing the connection does nothing for the IncomingStreams.

    Details:

    1. I get a Connection and IncomingStreams from a peer while I'm listening
    2. Something happens and I decide I don't want this peer any more
    3. I get the Connection object and do Connection::close(...).
    4. Nothing happens to the IncomingStreams - it continue to stay indefinitely with tokio event loop - I would have expected it to resolve to completion/failure at this point and destroy itself.
    5. Remote peer still tries to send something to us on their connection to us (Which is still alive for them) by trying to open a new stream to us. The peer keeps getting "ConnectionAborted - closed by remote peer" error which is fine and expected.

    So the IncomingStreams stream (and possibly any other stream obtained from it which the remote hasn't shutdown/closed/destroyed yet - though I haven't checked this part) uselessly remains unresolved with tokio. I have to now keep extra knowledge about closing these streams when I close the Connection to the peer.

    Wouldn't the better/expected design be that when I close Connection (or drop/destroy it) all the related stuff resolve into an error (or anything, but resolve) to gracefully collect all resources ?

    opened by ustulation 20
  • unexpected low throughput

    unexpected low throughput

    Hi, Thanks for the hard work.

    I am trying to implement a proxy client/server pair using quinn, I get it working quickly thanks to quinn's succinct APIs, but the throughput is quite low.

    The client is running on MacOS, and server on Linux, RTT reported by ping is 170ms, while quinn::Connection::rtt() reports 190ms. I have another C++ proxy implementation using TCP, which runs alot faster with the same network link. I can observe that the server is quite fast at writing data to the client, each write with 6k to 8k bytes for most the time, but the client reads 1k to 3k bytes for each attempt and never catches up with server's write speed. I tried setting SND_BUF/RCV_BUF up to 3 megabytes, but nothing changes, and I don't know what to investigate on. I guess there may be some mistakes in my code, The client code for relaying traffic is as the following:

    pub async fn serve(&mut self, local_conn_receiver: &mut Receiver<TcpStream>) -> Result<()> {
        let remote_conn = &self.remote_conn.as_ref().unwrap();
        // accept local connections and build a tunnel to remote for accepted connections
        while let Some(local_conn) = local_conn_receiver.recv().await {
            match remote_conn.open_bi().await {
                Ok((remote_send, remote_recv)) => {
                    tokio::spawn(Self::handle_stream(local_conn, remote_send, remote_recv));
                }
                Err(e) => {
                    error!("failed to open_bi on remote connection: {}", e);
                    break;
                }
            }
        }
    
        info!("quit!");
        Ok(())
    }
    
    async fn handle_stream(
        mut local_conn: TcpStream,
        mut remote_send: SendStream,
        mut remote_recv: RecvStream,
    ) -> Result<()> {
        info!("open new stream, id: {}", remote_send.id().index());
    
        let mut local_read_result = ReadResult::Succeeded;
        loop {
            let (mut local_read, mut local_write) = local_conn.split();
            let local2remote = Self::local_to_remote(&mut local_read, &mut remote_send);
            let remote2local = Self::remote_to_local(&mut remote_recv, &mut local_write);
    
            tokio::select! {
                Ok(result) = local2remote, if !local_read_result.is_eof() => {
                    local_read_result = result;
                }
                Ok(result) = remote2local => {
                    if let ReadResult::EOF = result {
                        info!("quit stream after hitting EOF, stream_id: {}", remote_send.id().index());
                        break;
                    }
                }
                else => {
                    info!("quit unexpectedly, stream_id: {}", remote_send.id().index());
                    break;
                }
            };
        }
        Ok(())
    }
    
    async fn local_to_remote<'a>(
        local_read: &'a mut ReadHalf<'a>,
        remote_send: &'a mut SendStream,
    ) -> Result<ReadResult> {
        let mut buffer = vec![0_u8; 8192];
        let len_read = local_read.read(&mut buffer[..]).await?;
    
        if len_read > 0 {
            remote_send.write_all(&buffer[..len_read]).await?;
            Ok(ReadResult::Succeeded)
        } else {
            remote_send.finish().await?;
            Ok(ReadResult::EOF)
        }
    }
    
    async fn remote_to_local<'a>(
        remote_recv: &'a mut RecvStream,
        local_write: &'a mut WriteHalf<'a>,
    ) -> Result<ReadResult> {
        let mut buffer = vec![0_u8; 8192];
        let result = remote_recv.read(&mut buffer[..]).await?;
        if let Some(len_read) = result {
            local_write.write_all(&buffer[..len_read]).await?;
            local_write.flush().await?;
            Ok(ReadResult::Succeeded)
        } else {
            Ok(ReadResult::EOF)
        }
    }
    
    opened by neevek 19
  • async_std support

    async_std support

    quinn-proto is extremely low-level and difficult to use. quinn is much nicer to use, but depends on Tokio. Would it be possible for quinn to also support async_std via a Cargo feature?

    enhancement help wanted good first issue 
    opened by Demi-Marie 18
  • clarification on stateless reset

    clarification on stateless reset

    I was hoping to get some clarification on how the stateless reset functionality works in quinn/QUIC. My understanding of the stateless reset feature is that if a connection exists between two endpoints A and B and one side of the connection state is lost for some reason (say endpoint A crashed and was restarted) then the side that lost state would be able to inform the other side and the old connection would be closed quickly on the side that didn't lose state. In my limited testing i've found this to not be the case though, and instead (via logs) i'm able to see that the side the lost sate (A) is sending a stateless reset but the other side (B) doesn't seem to handle the reset and close the connection on its side, instead the connection hangs until the configured idle timeout period at which point the connection is timed out.

    Is my understanding of how the stateless reset is supposed to work not correct? Is there some configuration that I need to be doing differently in order to have this work properly? (eg do you need to use a non-default EndpointConfig)

    opened by bmwill 17
  • quinn_proto hangs in connection.handle_event() method

    quinn_proto hangs in connection.handle_event() method

    Hello, I am implementing quinn_proto within Kompact, a distributed actor framework which has its own event loop(reason I chose quinn_proto instead of quinn_rs) as a part of my master thesis.

    I am encountering couple of problems with the API, which I am having a hard time figuring out. The test case I am trying to execute is following: // Sets up two KompactSystems with 2x actor Pingers and actor Pongers and QUIC as the network protocol. One Ponger is registered by UUID, // the other by a custom name. One Pinger communicates with the UUID-registered Ponger, // the other with the named Ponger. Both sets are expected to exchange PING_COUNT ping-pong // messages. This is the test, in mu case In my case I send 10 ping pongs between the actors messages.https://github.com/jodiserla/kompact/blob/5836a4697b04309ffc407c45ece8ebf5a9d959ff/core/tests/dispatch_integration_tests.rs#L339

    However, when I execute the test case, the actors send varying number of ping pongs between them and then the test starts to "hang" until the test times out by itself. It seems that QUIC stops on the handle_event() function and doesn't do any further than that - causing the test to hang and timeout. Here is the code for calling the API methods https://github.com/jodiserla/kompact/blob/5836a4697b04309ffc407c45ece8ebf5a9d959ff/core/src/net/quic_endpoint.rs#L142 I also noticed that the endpoint.poll_transmit() doesn't seem to get called either which confuses me as well - https://github.com/jodiserla/kompact/blob/5836a4697b04309ffc407c45ece8ebf5a9d959ff/core/src/net/quic_endpoint.rs#L128 Any feedback on this would be greatly appreciated!

    opened by jodiserla 8
  • help build err in openbsd (bug report)

    help build err in openbsd (bug report)

    log

    sur# cargo build
       Compiling quinn-udp v0.3.2 (/home/build/quinn-0.9.3/quinn-udp)
    error[E0425]: cannot find value `IP_RECVTOS` in crate `libc`
        --> quinn-udp/src/unix.rs:94:75
         |
    94   |         if let Err(err) = set_socket_option(&*io, libc::IPPROTO_IP, libc::IP_RECVTOS, OPTION_ON) {
         |                                                                           ^^^^^^^^^^ help: a constant with a similar name exists: `IP_RECVIF`
         |
        ::: /root/.cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.138/src/unix/bsd/netbsdlike/openbsd/mod.rs:1068:1
         |
    1068 | pub const IP_RECVIF: ::c_int = 30;
         | ---------------------------------- similarly named constant `IP_RECVIF` defined here
    
    error[E0412]: cannot find type `mmsghdr` in crate `libc`
       --> quinn-udp/src/unix.rs:166:26
        |
    166 |       let mut msgs: [libc::mmsghdr; BATCH_SIZE] = unsafe { mem::zeroed() };
        |                            ^^^^^^^ help: a struct with a similar name exists: `cmsghdr`
        |
       ::: /root/.cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.138/src/unix/bsd/mod.rs:10:1
        |
    10  | / s! {
    11  | |     pub struct sockaddr {
    12  | |         pub sa_len: u8,
    13  | |         pub sa_family: sa_family_t,
    ...   |
    124 | |     }
    125 | | }
        | |_- similarly named struct `cmsghdr` defined here
    
    error[E0425]: cannot find function `sendmmsg` in crate `libc`
       --> quinn-udp/src/unix.rs:197:32
        |
    197 |         let n = unsafe { libc::sendmmsg(io.as_raw_fd(), msgs.as_mut_ptr(), num_transmits as _, 0) };
        |                                ^^^^^^^^ help: a function with a similar name exists: `sendmsg`
        |
       ::: /root/.cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.138/src/unix/bsd/mod.rs:743:5
        |
    743 |     pub fn sendmsg(fd: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t;
        |     ------------------------------------------------------------------------------- similarly named function `sendmsg` defined here
    
    error[E0412]: cannot find type `mmsghdr` in crate `libc`
       --> quinn-udp/src/unix.rs:296:50
        |
    296 |       let mut hdrs = unsafe { mem::zeroed::<[libc::mmsghdr; BATCH_SIZE]>() };
        |                                                    ^^^^^^^ help: a struct with a similar name exists: `cmsghdr`
        |
       ::: /root/.cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.138/src/unix/bsd/mod.rs:10:1
        |
    10  | / s! {
    11  | |     pub struct sockaddr {
    12  | |         pub sa_len: u8,
    13  | |         pub sa_family: sa_family_t,
    ...   |
    124 | |     }
    125 | | }
        | |_- similarly named struct `cmsghdr` defined here
    
    error[E0425]: cannot find function `recvmmsg` in crate `libc`
       --> quinn-udp/src/unix.rs:308:19
        |
    308 |             libc::recvmmsg(
        |                   ^^^^^^^^ help: a function with a similar name exists: `recvmsg`
        |
       ::: /root/.cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.138/src/unix/bsd/mod.rs:748:5
        |
    748 |     pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t;
        |     ----------------------------------------------------------------------------- similarly named function `recvmsg` defined here
    
    error[E0531]: cannot find unit struct, unit variant or constant `IP_RECVTOS` in crate `libc`
        --> quinn-udp/src/unix.rs:472:73
         |
    472  |             (libc::IPPROTO_IP, libc::IP_TOS) | (libc::IPPROTO_IP, libc::IP_RECVTOS) => unsafe {
         |                                                                         ^^^^^^^^^^ help: a constant with a similar name exists: `IP_RECVIF`
         |
        ::: /root/.cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.138/src/unix/bsd/netbsdlike/openbsd/mod.rs:1068:1
         |
    1068 | pub const IP_RECVIF: ::c_int = 30;
         | ---------------------------------- similarly named constant `IP_RECVIF` defined here
    
    Some errors have detailed explanations: E0412, E0425, E0531.
    For more information about an error, try `rustc --explain E0412`.
    error: could not compile `quinn-udp` due to 6 previous errors
    
    opened by littlesum 5
  • Is it possible to run both the Quic client and server on the same UDP port?

    Is it possible to run both the Quic client and server on the same UDP port?

    In our application using UDP, the client is sending some UDP messages to the server and the server get the client address (ip:port) and send the responses back to the client where the client is running a packet receiver doing recvfrom as well on the same client address. We are planning to move it to using QUIC for better QOS control.

    Is it possible to do the same in the Quinn's quic implementation? i.e. using the same ip:port for the quic server and client on the same node? I am aware that one can use bi-directional streams to send messages in both directions, but that would require significant changes to our programming model. cc @djc

    opened by lijunwangs 2
  • Add support for IP_RECVORIGDSTADDR socket option.

    Add support for IP_RECVORIGDSTADDR socket option.

    When enabled on a socket with IP_TRANSPARENT, it populates metadata with the original destination (IP:port) for traffic redirected with TPROXY.

    Signed-off-by: Piotr Sikora [email protected]

    opened by PiotrSikora 2
  • Ensure quinn works well with jumbo frames

    Ensure quinn works well with jumbo frames

    I did some benchmarking with a quinn based RPC framework. https://github.com/n0-computer/quic-rpc .

    I found that unsurprisingly, the packet size has a huge influence on throughput. Here are benchmarks on a linux box with different values for initial_max_udp_payload_size:

    The default:

    $ ./target/release/bulk --initial-mtu 1200
    
    Client 0 stats:
    Overall download stats:
    
    Transferred 1073741824 bytes on 1 streams in 4.48s (228.59 MiB/s)
    
    Stream download metrics:
    
          β”‚  Throughput   β”‚ Duration 
    ──────┼───────────────┼──────────
     AVG  β”‚  228.69 MiB/s β”‚     4.48s
     P0   β”‚  228.62 MiB/s β”‚     4.48s
     P10  β”‚  228.75 MiB/s β”‚     4.48s
     P50  β”‚  228.75 MiB/s β”‚     4.48s
     P90  β”‚  228.75 MiB/s β”‚     4.48s
     P100 β”‚  228.75 MiB/s β”‚     4.48s
    

    Largest value that was working for me:

    $ ./target/release/bulk --initial-mtu 6000
    
    Client 0 stats:
    Overall download stats:
    
    Transferred 1073741824 bytes on 1 streams in 2.18s (468.73 MiB/s)
    
    Stream download metrics:
    
          β”‚  Throughput   β”‚ Duration 
    ──────┼───────────────┼──────────
     AVG  β”‚  468.88 MiB/s β”‚     2.18s
     P0   β”‚  468.75 MiB/s β”‚     2.18s
     P10  β”‚  469.00 MiB/s β”‚     2.18s
     P50  β”‚  469.00 MiB/s β”‚     2.18s
     P90  β”‚  469.00 MiB/s β”‚     2.18s
     P100 β”‚  469.00 MiB/s β”‚     2.18s
    

    I found that with a sufficiently large packet size quinn bulk can outperform TCP with default settings, but with the default quinn settings it is slower than TCP (about 2/3).

    So it would be nice to ensure that quinn works well in an environment that allows large frames, e.g. a LAN with jumbo frames enabled, or a loopback device with a large MTU.

    I think a good way to do this would be to implement a dummy in memory AbstractUdpSocket transport that has basically zero overhead, then make sure quinn works well with large values of initial-mtu up to 65536, or at least up to the 9000 bytes of jumbo frames.

    opened by rklaehn 2
  • quinn_proto example with io_uring

    quinn_proto example with io_uring

    Dear all,

    I'm writine some io_uring examples in rust, and I would like to add QUIC. The idea is to try and benchmark some advanced options like batching, zero copy, AF_XDP, eBPF, ....

    I guess my best option is to try quinn-proto, as it's advertised for custom event loops. Is there any example, maybe in the tests, maybe a simplified one? Do you think it's doable?

    Any advice is welcome, before I will try to dive in the codebase :)

    opened by espoal 4
Releases(0.9.3)
  • 0.9.0(Oct 31, 2022)

    We are happy to announce the release of 0.9.0 of Quinn, our pure-Rust implementation of QUIC. This release introduces extensible support for multiple async runtimes, improves Connection API ergonomics, and introduces a variety of new features, performance improvements, and bugfixes.

    Important changes

    • Abstract runtime support (#1364, thanks to @yu-re-ka)
    • Replace NewConnection struct with Connection methods (#1357)
    • Replace Incoming stream with Endpoint::accept async method (#1426)

    Functional improvements

    • Add additional metrics for lost packets and bytes (#1248, thanks to @Matthias247)
    • Implement draft-ietf-quic-bit-grease-02 (#1286)
    • Allow adjustment of per-connection concurrent stream limits (#1315)
    • Allow initial maximum UDP payload size to be configured (#1379)
    • Configure receive window per connection (#1386, thanks to @lijunwangs)
    • Define Connection::closed() helper to await connection termination (#1396)
    • Expose a getter for the close reason (#1424)
    • Accessor for free datagram send buffer space (#1423)

    Performance improvements

    • Enable UDP GRO (#1350, #1354; thanks to @alessandrod)
    • Only send ACKs when they've changed (#1245)
    • Other ACK improvements (#1415)

    Bug fixes

    • Tolerate wide IP_TOS cmsgs (#1274)
    • Identify zero-length connections by four-tuple (#1306)
    • Retry token fixes (#1332)
    • Fix Linux DF bit setting for IPv6-mapped IPv4 addresses (#1381)
    • Fix build errors so quinn-proto can be used under wasm32-unknown-unknown (#1387, thanks to @thombles)
    • Disable IP fragmentation on Windows (#1383)
    • Check QUIC bit in short headers (#1404, thanks to @thekuwayama)
    • Fix stopped streams not issuing ID credit when reset (#1422)

    Other improvements

    • Replace futures-util with optional futures-io dep (#1263)
    • Strip down futures-* dependencies (#1273)
    • Reexport UnknownStream (#1268)
    • Replace Broadcast helper with tokio::sync::Notify (#1264)
    • Rely on rustls to check for ALPN failure (#1258)
    • Use config to reject connections rather than extra state (#1247)
    • Adjust link to quinn crate entry point in docs (#1241, thanks to @themaxdavitt)
    • Expose RttEstimator interface publicly (#1243, thanks to @BiagioFesta)
    • Replace fxhash with rustc_hash (#1246)
    • Don't update remote client CIDs gratuitously (#1294)
    • Change overly verbose info span to debug (#1351, thanks @alessandrod)
    • Bump MSRV to 1.59 (#1403)

    On behalf of the Quinn team, @djc and @Ralith, thanks to all contributors!

    Source code(tar.gz)
    Source code(zip)
  • 0.8.0(Nov 14, 2021)

    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 implement Future (#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's ServerConfig (#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.

    Source code(tar.gz)
    Source code(zip)
  • 0.7.0(Mar 2, 2021)

    We are happy to announce the release of 0.7.0 of Quinn, our pure-Rust implementation of the QUIC protocol, the next generation TCP replacement protocol currently being standardized at the IETF.

    After 10 months of development since the release of 0.6.0, we finally have a new release which upgrades the protocol to drafts 29 through 32. It has additionally received many performance improvements (especially on Linux), is much more robust, provides a number of new APIs to inspect connection state, and traits that can be used to customize behavior. Our quinn crate has been updated to depend on tokio 1.

    The focus of our HTTP/3 implementation work has shifted to the h3 crate.

    Important changes:

    • Update to Tokio 1, rustls 0.19 and bytes 1 (#873, with fixes in #995 thanks to @geieredgar)
    • Update to draft 29 with support for draft 32 (#812, #879)
    • Adopted 1.45 as the minimum supported Rust version for now (#985, #988)
    • Substantial performance improvements (many contributed by @Matthias247)
    • Work towards support for Generic Send Offload on Linux (#960 and #1024, thanks to @Matthias247)

    Functional improvements:

    • Zero-copy read and write APIs (#1013, thanks to @Matthias247, and #952)
    • Pluggable congestion control and congestion controller bugfixes (#759)
    • Add support for exporting keying material (#850, thanks to @kwantam)
    • Support customized connection ID generation (#851 and #925, thanks to @liwenjieQu)
    • Implement packet pacing support (#852, thanks to @DemiMarie)
    • Proactive connection ID rotation (#860, thanks to @liwenjieQu)
    • Add connection-level statistics (#884, #957, #973, #974; thanks to @Matthias247)
    • Expose access to round-trip time estimate (#889, thanks to @jamadazi)
    • Improve fairness on stream transmissions (#949, thanks to @Matthias247)
    • Accept certificates in PEM format (#829, thanks to @SSebo)
    • Encrypt Retry tokens (#833, thanks to @kansi)
    • Use the incoming IP address for sending outgoing packets (#967, thanks to @Matthias247)
    • Update datagram extension to support one-way semantics (#757)
    • Reduce connection task wake-ups while reading (#992, thanks to @geieredgar)
    • Improve defragmentation algorithm to reduce overhead (#1000, thanks to @geieredgar)

    Bug fixes:

    • Remove unsound assumptions about IP address layout (#987, thanks to @est31)
    • Separate ECN counters per packet space (#798)
    • Reject connections on ALPN failure (#779)
    • Deduplicate buffers when switching to unordered mode (#1014, thanks to @geieredgar)
    • Return UnknownStream from Connection::reset for closed/reset streams (#778)
    • Proactively discard data on stopped streams (#777)
    • Fix socket options on iOS (#849, thanks to @SSebo)
    • Stop issuing redundant flow control credit (#758)
    • Don't block application writes on congestion (#710)

    Other improvements:

    • Initial implementation of fuzz testing (#831 and #855, thanks to @jafow)
    • Expose some quinn-proto APIs in quinn (#809, thanks to @SoftwareSheriff)
    • Reexport ReadUnordered (#837, thanks to @Imberflur)
    • Implement Debug for TlsSession and SessionKind (#843, thanks to @imp)
    • Don't try to run code coverage on PRs (#824, thanks to @DemiMarie)

    Documentation improvements:

    • Initial version of a Quinn book (#866 and many follow-ups, thanks to @TimonPost)
    • README improvements including a new logo (#866, thanks to @TimonPost)
    • Add more high-level docs for quinn-proto Connections (#926, thanks to @infinity0)
    • Add usage documentation for server example (#732, thanks to @jesselucas)
    • Fix up documentation links (#816, thanks to @alexander-jackson)
    • Add documentation links to improve navigation (#826, thanks to @alexander-jackson)
    • Fix typo in the documentation (#847 thanks to @DelusionalOptimist and #932 thanks to @lu-zero)

    Quinn has been proven to function well in real-world scenarios, so if you're interested in QUIC, now would be a good time to start testing. The QUIC v1 spec is stabilizing; we expect it will be published as an RFC within the next month.

    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 an active Gitter channel. Additionally @djc can now offer commercial support for Quinn, contact him for more details.

    Source code(tar.gz)
    Source code(zip)
  • 0.6.1(Apr 4, 2020)

    quinn 0.6.1 is a maintenance release with a number of significant bug fixes:

    • Fix initial data limit for remotely initiated bidirectional streams (fixes #694)
    • Fix bug that retired active CID on duplicate NEW_CONNECTION_ID (fixes #689)
    • Fix issuing of excess CIDs
    • Fix busy-hang when tokio and proto disagree on timer expiry

    Anyone using the 0.6.0 release is advised to upgrade to this release. Thanks to @DemiMarie-parity and @SriRamanujam for providing detailed bug reports and working with us on reproduction and testing!

    Source code(tar.gz)
    Source code(zip)
  • 0.6.0(Mar 12, 2020)

    We are happy to announce the release of 0.6.0 of Quinn, our pure-Rust implementation of the QUIC protocol, the next generation TCP replacement protocol currently being standardized at the IETF.

    After 4 months of development since the release of 0.5.0 (and several bugfix releases), we have a new release which upgrades the protocol to draft-27. It has additionally received many robustness improvements, smaller bug fixes, improved documentation and API refinements. Much of this work was triggered by the work at Parity to extend libp2p with QUIC support based on quinn-proto -- thanks to @DemiMarie-parity.

    While our quinn-h3 implementation of HTTP 3 has not yet been released to crates.io, it has also undergone significant improvements in this release cycle, focusing in particular on improving interoperability with other implementations.

    High level overview:

    • Improved API for inspecting crypto session (TLS) negotiated data (thanks to @kim)
    • Make rustls dependency optional at the quinn level
    • Refined APIs for datagrams (draft extension)
    • Cleaned up clippy warnings throughout all crates
    • Many bug fixes and improved robustness
    • Much improved documentation, particularly for the quinn-proto crate

    Thanks to @DemiMarie-parity, @alecmocatta and @lionel1704 for their contributions.

    Quinn has been proven to function well in real-world scenarios, so if you're interested in QUIC, now would be a good time to start testing. The QUIC v1 spec is stabilizing; we expect it will be published as an RFC in the next 6 months.

    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 an active Gitter channel.

    Source code(tar.gz)
    Source code(zip)
  • quinn-0.5.3(Feb 1, 2020)

  • quinn-0.5.1(Dec 9, 2019)

    quinn 0.5.1 is a quick maintenance release to solve a single bug:

    • Wake up the connection after a datagram send completes (#553, backported in #554)

    This is only relevant if you're using the datagram extension (new in 0.5).

    Source code(tar.gz)
    Source code(zip)
  • 0.5.0(Dec 3, 2019)

    We are happy to announce the release of 0.5.0 of Quinn, our pure-Rust implementation of the QUIC protocol, the next generation TCP replacement protocol currently being standardized at the IETF.

    After 3 months of development since the release of 0.4.0, Quinn has been upgraded to the latest draft (draft 24) protocols and has been migrated to std::future::Futures and tokio 0.2. Quinn 0.5.0 is a highly conformant implementation of the latest QUIC draft, according to the interoperability testing data maintained by implementers participating in the QUIC working group.

    • Implemented preliminary support for the (draft) datagram extension
    • Migrated from slog to tracing
    • Improved documentation
    • Many smaller bug fixes and refactoring to improve Quinn's internals

    Thanks to @jean-airoldie, @NULLx76, @TimonPost, @DemiMarie-parity and @daxpedda for their contributions.

    Quinn has been proven to function well in real-world scenarios, so if you're interested in QUIC, now would be a good time to start testing. The QUIC v1 spec is stabilizing and we expect it will be published as an RFC in the next 6 months.

    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 an active Gitter channel.

    Source code(tar.gz)
    Source code(zip)
  • 0.4.0(Sep 9, 2019)

    We are happy to announce the release of 0.4.0 of Quinn, our pure-Rust implementation of the QUIC protocol, the next generation TCP replacement protocol currently being standardized at the IETF.

    After 5 months of development since the release of 0.3.0, Quinn has been upgraded to the latest draft (draft 22) protocols. We have created a trait-based abstraction over our use of rustls and ring, so that it will be possible to use Quinn with any TLS implementation implementing these traits, or even alternative non-standard cryptographic protocols. Quinn 0.4.0 is a highly conformant implementation of the latest QUIC draft, according to the interoperability testing data maintained by implementers participating in the QUIC working group.

    • A number of improvements to the high-level API to improve usability
    • Make it possible to build lower-level quinn-proto crate without rustls/ring
    • Moved CI to Azure, which means we now test Windows in addition to Linux and macOS
    • Implement coalescing of outgoing packets, reducing handshake overhead
    • Allow connection migration to be disabled
    • Improved documentation
    • Many smaller bug fixes and refactoring to improve Quinn's internals

    Note that we plan to merge our branch using std::future::Future and async/await oriented interfaces soon after this release is published, since support for this syntax is stabilizing soon. Therefore, the next release will be designed for use with async and await; we will consider pushing out maintenance releases for 0.4 using "old" futures if there is demand.

    Quinn has been proven to function well in real-world scenarios, so if you're interested in QUIC, now would be a good time to start testing. The QUIC v1 spec is stabilizing and we expect it will be published as an RFC in the next 6 months.

    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 an active Gitter channel.

    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Apr 18, 2019)

    We are happy to announce the release of 0.3.0 of Quinn, our pure-Rust implementation of the QUIC protocol, the next generation TCP replacement protocol currently being standardized at the IETF.

    After 3 months of development since the release of 0.2.0, 0.3.0 is starting to see some real-world use. Quinn 0.3.0 is a highly conformant implementations of the latest QUIC draft (draft 19), according to the interoperability testing data maintained by implementers participating in the QUIC working group.

    • High-level API types are now Send and Sync for use on multi-threaded runtimes
    • Extensive refactoring to make the code more maintainable and approachable
    • Improved documentation for low-level quinn-proto crate
    • Updated protocol support to draft 19
    • 0-RTT data exchange is now supported
    • Fixed some QUIC-specific issues in rustls (thanks to @ctz for reviewing)
    • QPACK and partial HTTP 3 support has been implemented, but is unreleased for now
    • Work started to abstract the use of rustls to enable use of other TLS implementations
    • Initial benchmarks show 1+ Gbps, with lots of low-hanging optimization fruit still left
    • Example code for different use cases (thanks to @povilasb)
    • Worked around a networking regression (login only) in macOS 10.14

    At this point, we expect the high-level API to only change in minor ways and Quinn has been proven to function well in real-world scenarios (see below), so if you're interested in QUIC, now would be a good time to start testing. The QUIC v1 spec is scheduled to be published as an RFC some time this summer.

    We're grateful for the work @ustulation, @nbaksalyar and @povilasb from @MaidSafe have contributed to this release. @MaidSafe has replaced their internally developed UDP-based protocol with QUIC and Quinn, and in the process contributed a number of bugfixes, added examples and tests. Thanks also to @newpavlov for their contributions. We're happy that @stammw joined the Quinn team as main author of our unreleased quinn-h3 crate.

    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 an active Gitter channel.

    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Jan 21, 2019)

    We (@djc and @Ralith) are happy to announce the release of 0.2.0 of Quinn, our pure-Rust implementation of the QUIC protocol, the next generation TCP replacement protocol currently being standardized at the IETF.

    After 3 months of development since the release of 0.1.0, 0.2.0 is much more complete. First and foremost, Quinn 0.2.0 is among the most conformant implementations of the latest QUIC draft (draft 17), according to the interoperability testing data maintained by implementers participating in the QUIC working group. It now supports:

    • Stateless retries
    • Explicit congestion notification (only Linux support so far -- contributions welcome!)
    • Connection migration

    These features are currently being worked on:

    • 0-RTT data has largely been implemented but still needs tweaking of the API
    • HTTP 3 support has been started and is being worked on by our awesome contributor @stammw

    We've worked to make Quinn even more modular. It consists of the quinn-proto crate, which contains deterministic protocol logic without touching any I/O APIs, and a quinn crate which leverages tokio to deliver a high-level asynchronous API. (Additionally, we maintain an experimental branch with async/await support.)

    We're also grateful for the work @imp, @est31, @psiphi75, and @kryptan have contributed to this release. While we don't always have large amounts of pre-defined good first issues setup due to the fast moving development, we're always happy to mentor new contributors, independent of their prior level of Rust experience!

    Finally, we would like to thank the community for their support. To support this release, we've contributed work to libc, tokio, rustls and ring. We'd also like to call out @est31's new rcgen crate, which makes self-signed certificate support easier to use. Quinn would not be possible without the support of the Rust ecosystem.

    We're excited to see what's coming for QUIC and Quinn in 2019.

    Source code(tar.gz)
    Source code(zip)
Owner
null
QUIC proxy that allows to use QUIC to connect to an SSH server without needing to patch the client or the server.

quicssh-rs ?? quicssh-rs is a QUIC proxy that allows to use QUIC to connect to an SSH server without needing to patch the client or the server. quicss

Jun Ouyang 18 May 5, 2023
Futures implementation for JSON-RPC

futures-jsonrpc Futures + JSON-RPC A lightweight remote procedure call protocol. It is designed to be simple! And, with futures, even more flexible! T

Victor Lopes 12 May 19, 2022
Peer-to-peer communications library for Rust based on QUIC protocol

qp2p Crate Documentation MaidSafe website SAFE Dev Forum SAFE Network Forum Overview This library provides an API to simplify common tasks when creati

MaidSafe 337 Dec 14, 2022
neqo β€” an Implementation of QUIC written in Rust

Neqo, an Implementation of QUIC written in Rust To run test HTTP/3 programs (neqo-client and neqo-server): cargo build ./target/debug/neqo-server [::]

Mozilla 1.6k Jan 7, 2023
πŸ₯§ Savoury implementation of the QUIC transport protocol and HTTP/3

quiche is an implementation of the QUIC transport protocol and HTTP/3 as specified by the IETF. It provides a low level API for processing QUIC packet

Cloudflare 7.1k Jan 8, 2023
The gRPC library for Rust built on C Core library and futures

gRPC-rs gRPC-rs is a Rust wrapper of gRPC Core. gRPC is a high performance, open source universal RPC framework that puts mobile and HTTP/2 first. Sta

TiKV Project 1.6k Jan 7, 2023
Crate extending futures stream combinators, that is adding precise rate limiter

stream-rate-limiter Stream combinator .rate_limiter(opt: RateLimitOptions) Provides way to limit stream element rate with constant intervals. It adds

null 3 Jul 23, 2023
An experimental HTTP server in Rust that supports HTTP/1.1, HTTP/2, and HTTP/3 over QUIC.

?? H123 An experimental HTTP server in Rust that supports HTTP/1.1, HTTP/2, and HTTP/3 over QUIC. Warning This is an experimental project and not inte

Naoki Ikeguchi 7 Dec 15, 2022
TCP is so widely used, however QUIC may have a better performance.

TCP is so widely used, however QUIC may have a better performance. For softwares which use protocols built on TCP, this program helps them take FULL advantage of QUIC.

zephyr 15 Jun 10, 2022
MQTT over QUIC

MQuicTT ?? This is a pre-alpha project, tread carefully ?? A rustlang utility/library for MQTT over QUIC. QUIC allows us to send data over multiple co

null 29 Dec 16, 2022
A high-performance, lightweight, and cross-platform QUIC library

TQUIC English | δΈ­ζ–‡ TQUIC is a high-performance, lightweight, and cross-platform library for the IETF QUIC protocol. Advantages High performance: TQUIC

Tencent 11 Oct 27, 2023
A multiplayer web based roguelike built on Rust and WebRTC

Gorgon A multiplayer web-based roguelike build on Rust and WebRTC. License This project is licensed under either of Apache License, Version 2.0, (LICE

RICHΞ›RD Ξ›NΞ›YΞ› 2 Sep 19, 2022
Dropping GFW DNS contaminated packets based on Rust + eBPF

Dropping GFW DNS contaminated packets based on Rust + eBPF

ihcη«₯ιž‹@提不衷劲 1k Jan 3, 2023
A rust-based command line tool to serve as a gateway for a Internet Computer replica.

icx-proxy A command line tool to serve as a gateway for a Internet Computer replica. Contributing Please follow the guidelines in the CONTRIBUTING.md

DFINITY 25 Sep 6, 2022
A minimalistic encryption protocol for rust async streams/packets, based on noise protocol and snow.

Snowstorm A minimalistic encryption protocol for rust async streams / packets, based on noise protocol and snow. Quickstart Snowstorm allows you to se

Black Binary 19 Nov 22, 2022
A Rust based DNS client, server, and resolver

Trust-DNS A Rust based DNS client, server, and Resolver, built to be safe and secure from the ground up. This repo consists of multiple crates: Librar

Benjamin Fry 2.7k Dec 30, 2022
A minimalist socket-based client/server in Rust to illustrate a tutorial

The basics of unix sockets This repository serves as a reference for this tutorial blogpost How to run Install Rust and Cargo, and then do: cargo run

Emmanuel Bosquet 4 Dec 4, 2022
A generic Rust based Bigtable connection library implemented using gRPC

A generic Rust based Bigtable connection library refactored out the solana mono-repo so that can be shared for different applications.

Lijun Wang 3 Sep 25, 2022
Rust-based static analysis for TypeScript projects

Fast TypeScript Analyzer FTA (Fast TypeScript Analyzer) is a super-fast TypeScript static analysis tool written in Rust. It captures static informatio

Sam Brown 4 May 23, 2023