Skip to content

v1.7.77

Choose a tag to compare

@github-actions github-actions released this 10 Jul 12:49

ACK Frequency extension (draft-ietf-quic-ack-frequency) — #187, PR #242

Peers (quinn / quiche / msquic all ship this) can now tune zquic's ACK cadence:

  • min_ack_delay transport parameter (0xff04de1b, microseconds) — advertised by default at 1000 µs (1 ms, the drive-tick ACK granularity). Disable with TransportParamsOpts.min_ack_delay_us = 0. Peer's value parsed + stored; a peer advertising min_ack_delay > max_ack_delay is defensively treated as not-advertised.
  • ACK_FREQUENCY frame (0xaf) — sequence-gated apply of ack-eliciting threshold, requested max ack delay, and reordering threshold. Stale/duplicate frames ignored per draft §4; malformed body → FRAME_ENCODING_ERROR; requested delay below our advertised min_ack_delay → PROTOCOL_VIOLATION.
  • IMMEDIATE_ACK frame (0x1f) — flushes the pending app-ACK immediately.
  • ACK cadence honor: zero default-path change — until a peer sends ACK_FREQUENCY, ACKs flush every drive tick exactly as before. Once armed, ACKs are held until the eliciting threshold trips, the requested delay expires, a reorder beyond the reordering threshold occurs, or IMMEDIATE_ACK arrives.
  • PTO probes (client + server) ride an IMMEDIATE_ACK alongside the PING when the peer advertised support, so probes are answered without waiting out the peer's delayed-ack timer.

New module: src/frames/ack_frequency.zig (codec + tests). Frame registry (frame.zig) gains immediate_ack / ack_frequency variants.

Not included (deliberate): the embedder-facing API for sending ACK_FREQUENCY to tune the peer's cadence — receive-side honor is the interop-relevant half.

CI: full green including the Interop Runner gate (same-impl + cross-impl vs quinn, with the new transport parameter active in every handshake). 296/297 unit tests (+9 new; 1 pre-existing skip).