[][src]Crate quinn

QUIC transport protocol support for Tokio

QUIC is a modern transport protocol addressing shortcomings of TCP, such as head-of-line blocking, poor security, slow handshakes, and inefficient congestion control. This crate provides a portable userspace implementation. It builds on top of quinn-proto, which implements protocol logic independent of any particular runtime.

The entry point of this crate is the Endpoint.

let mut builder = quinn::Endpoint::builder();
// ... configure builder ...
// Ensure you're inside a tokio runtime context
let (endpoint, _) = builder.bind(&"[::]:0".parse().unwrap()).unwrap();
// ... use endpoint ...

About QUIC

A QUIC connection is an association between two endpoints. The endpoint which initiates the connection is termed the client, and the endpoint which accepts it is termed the server. A single endpoint may function as both client and server for different connections, for example in a peer-to-peer application. To communicate application data, each endpoint may open streams up to a limit dictated by its peer. Typically, that limit is increased as old streams are finished.

Streams may be unidirectional or bidirectional, and are cheap to create and disposable. For example, a traditionally datagram-oriented application could use a new stream for every message it wants to send, no longer needing to worry about MTUs. Bidirectional streams behave much like a traditional TCP connection, and are useful for sending messages that have an immediate response, such as an HTTP request. Stream data is delivered reliably, and there is no ordering enforced between data on different streams.

By avoiding head-of-line blocking and providing unified congestion control across all streams of a connection, QUIC is able to provide higher throughput and lower latency than one or multiple TCP connections between the same two hosts, while providing more useful behavior than raw UDP sockets.

Quinn also exposes unreliable datagrams, which are a low-level primitive preferred when automatic fragmentation and retransmission of certain data is not desired.

QUIC uses encryption and identity verification built directly on TLS 1.3. Just as with a TLS server, it is useful for a QUIC server to be identified by a certificate signed by a trusted authority. If this is infeasible--for example, if servers are short-lived or not associated with a domain name--then as with TLS, self-signed certificates can be used to provide encryption alone.

Modules

crypto

Traits and implementations for the QUIC cryptography protocol

generic

Types that are generic over the crypto protocol implementation

Structs

ApplicationClose

Reason given by an application for closing the connection

Certificate

A single TLS certificate

CertificateChain

A chain of signed TLS certificates ending the one to be used by a server

ConnectionClose

Reason given by the transport for closing the connection

ParseError

Errors encountered while parsing a TLS certificate or private key

PrivateKey

The private key of a TLS certificate to be used by a server

Transmit

An outgoing packet

TransportConfig

Parameters governing the core QUIC state machine

VarInt

An integer less than 2^62

ZeroRttAccepted

Future that completes when a connection is fully established

Enums

ConnectError

Errors in the parameters being used to create a new connection

ConnectionError

Reasons why a connection might be lost.

EndpointError

Errors that can occur during the construction of an Endpoint.

ReadError

Errors that arise from reading from a stream.

ReadExactError

Errors that arise from reading from a stream.

ReadToEndError

Error from the ReadToEnd future

SendDatagramError

Errors that can arise when sending a datagram

WriteError

Errors that arise from writing to a stream

Type Definitions

ClientConfig

A ClientConfig using rustls for the cryptography protocol

ClientConfigBuilder

A ClientConfigBuilder using rustls for the cryptography protocol

Connecting

A Connecting using rustls for the cryptography protocol

Connection

A Connection using rustls for the cryptography protocol

Datagrams

A Datagrams using rustls for the cryptography protocol

Endpoint

An Endpoint using rustls for the cryptography protocol

EndpointBuilder

An EndpointBuilder using rustls for the cryptography protocol

Incoming

An Incoming using rustls for the cryptography protocol

IncomingBiStreams

An IncomingBiStreams using rustls for the cryptography protocol

IncomingUniStreams

An IncomingUniStreams using rustls for the cryptography protocol

NewConnection

A NewConnection using rustls for the cryptography protocol

OpenBi

An OpenBi using rustls for the cryptography protocol

OpenUni

An OpenUni using rustls for the cryptography protocol

Read

A Read using rustls for the cryptography protocol

ReadExact

A ReadExact using rustls for the cryptography protocol

ReadToEnd

A ReadToEnd using rustls for the cryptography protocol

RecvStream

A RecvStream using rustls for the cryptography protocol

SendStream

A SendStream using rustls for the cryptography protocol

ServerConfig

A ServerConfig using rustls for the cryptography protocol

ServerConfigBuilder

A ServerConfigBuilder using rustls for the cryptography protocol