QUIC DATAGRAM
Unreliable Sequenced
Deliver only messages newer than the last accepted sequence. Intended for positions, aim and rapidly changing state.
Game communication for .NET
A game-focused protocol and library built directly on QUIC. Match each message to the transport behavior it needs without maintaining separate networking stacks.
Development status: under construction
6 modesLossy, reliable and bulk delivery
1–6 byte headerCompact application framing
1 UDP portDatagrams and streams together
.NET 10 + 11Windows, Linux and macOS targets
Delivery vocabulary
Positions should not queue behind stale positions. Chat must arrive in order. Large world data needs progress and resume. QUICLY expresses each case as a channel mode.
QUIC DATAGRAM
Deliver only messages newer than the last accepted sequence. Intended for positions, aim and rapidly changing state.
QUIC DATAGRAM
Send independent lossy events without ordering overhead: bullets, effects and disposable signals.
PERSISTENT STREAM
Preserve every message in sequence for RPC, chat, inventory and matchmaking.
GROUP STREAMS
Deliver every message while independent flush groups avoid application-level head-of-line blocking.
DATAGRAM + RETRY
Keep the newest value per key and retry until that version arrives. Obsolete versions disappear from the queue.
DEDICATED STREAM
Move files, assets and snapshots of any size. Split into ranges, each checksummed and re-sent on its own, with progress, cancellation and resume.
Hot-path architecture
The session layer is designed for explicit ownership, predictable polling and caller-controlled memory. MsQuic supplies encrypted transport; QUICLY supplies game-oriented semantics.
Declarative channels
Both peers use the same immutable channel table. IDs, names, modes and options are validated before a session starts.
var channels = ChannelTable.Create()
.Add(2, "state", ChannelMode.UnreliableSequenced)
.Add(3, "events", ChannelMode.ReliableUnordered)
.Add(4, "world", ChannelMode.Bulk)
.Build();
Motivation
QUICLY began as a replacement for a stack that had served well for years. The goal was a standardised, encrypted protocol that still speaks the game loop's language.
For years I have been using the lidgren-network-gen3 library, which I truly love. A great piece of software. But partially due to less updates lately, and partially that I wanted a standardized protocol with encryption, I developed a new version under QUIC with aim for HTTP/3 and WebAssembly standards. With benchmarks on my game engine, Tedd.Quicly shows promising results.
12.8× – 122×More payload delivered per second across four workloads
≈ 99.9%Fewer managed bytes allocated per delivered MiB
TLS 1.3Encrypted throughout, while Lidgren ran unencrypted
MiB per second — higher is better
060120180240
Median of three fresh-process runs, with the observed min–max beneath each value. Loopback, one sender and one receiver in one process.
.NET bytes allocated per delivered MiB — lower is better
01 MB2 MB3 MB4 MB
Not native allocation, retained memory, peak memory, or proof of end-to-end zero-copy transfers.
Milliseconds of process CPU per delivered MiB, both endpoints — lower is better
0481216
QUICLY spends more CPU per second while delivering far more data per second. No profile here separates encryption cost from packet processing, copies or scheduling.
Measured 20 September 2026 against QUICLY 7b2688c, on a game engine using both libraries in turn. Full method, raw samples and reproduction notes live with the benchmark harness.
Project status
Core, transport, HTTP/3, the WebTransport carrier, testing, ACME, server, client, HTTP and replication modules are present. Real-MsQuic session end-to-end work, serving raw QUIC and HTTP/3 on one port, and browser support remain on the roadmap.
MERGEDCore + channel engines
MERGEDMsQuic transport
MERGEDClient + server hosts
MERGEDHTTP, HTTP/3 + ACME
MERGEDWebTransport over HTTP/3
NEXTReal-session end-to-end suite
LATEROne port for QUIC + HTTP/3, browser transport