reliable-udp transport · c++20 · zero-dependency core · loading engine…

taut.

Small urgent messages, delivered exactly once and on time, over links that drop packets. The kernel's retransmit timer refuses to fire before 200 milliseconds; taut's floor is 25. On a bad link, that one constant is the whole story. The protocol below is the real library, compiled to WebAssembly, running over its own deterministic network simulator.

lower worst-case RTT at 5% packet loss, vs kernel TCP
12×lower at 20% loss
27×bulk throughput, where kernel TCP wins; the tradeoff is the point

measured on real hardware with netem · seeds fixed · raw CSVs and scripts in the repo

01

Feel it

your cursor is the message stream; two receivers chase it through identically seeded links, one knob apart
25ms floor   behind · 0 repairs 200ms floor behind · 0 repairs
loading engine…

Fig. 1. Every cursor sample is a real message through the library's sliding-window ARQ. The filled mark receives with a 25ms retransmit floor, the open mark with the kernel's 200ms, over links seeded identically. Delivery is in-order, so one unrepaired loss stalls everything behind it: the open mark freezes, then jumps. SACK and fast retransmit repair most holes at either floor; when the loss takes the feedback with it, the floor is all that's left, and that is what you feel.

02

Measure it

same protocol, same seed; 500 messages race once per floor, deterministically

Fig. 2. Messages delivered over virtual time. Every plateau in the dashed run is a stalled retransmit timer the kernel default spends waiting out; the solid run crosses the same link with the 25ms floor. The simulator is deterministic: every number on this page reproduces from the seed.

Table 1. One race, both floors, virtual ms.
25ms200ms×

running…

03

What you just saw

every behavior above is a specific piece of the library
THE FREEZE
The open mark stalling, then snapping forward in a burst.
A retransmit timeout expiring. In-order delivery means one lost packet blocks everything behind it until the repair lands; a 200ms floor holds that hole open for at least 200ms. The estimator and its floor: src/rto.cc
THE RECOVERY
The filled mark taking the same weather as small hiccups.
The same repair bounded by a 25ms floor, plus SACK and fast retransmit catching most holes before any timeout fires: the send ring, ack processing, and both recovery paths live in src/session.cc
THE WEATHER
Loss, delay, and jitter that reproduce exactly from a seed.
The library's own deterministic network simulator: the demo and the test suite exercise identical code paths, and any failure replays from its seed: src/sim_net.cc
THE CONTRACT
Every message arriving exactly once, in order, despite the chaos.
Sequencing, acknowledgment, and dedup in the wire format, every datagram CRC-framed: src/codec.cc, src/crc32c.cc. A run that violates this is a protocol bug, and the page says so.