← Back to QuicFeed

SRT vs QuicFeed

Key protocol differences — based on draft-sharabayko-srt-01 and QuicFeed v2.1 test results

1. Head-of-Line Blocking

SRTQuicFeed
ArchitectureSingle ordered stream per connectionIndependent QUIC stream per file
HoL blockingYes, up to drop timeout — a lost packet stalls delivery within that SRT stream until retransmitted or the TLPKTDROP timeout expires (user-configurable: 20–8000ms), whichever comes first. A lost packet on one SRT stream doesn't stall other SRT streamsNo — a lost packet on one stream doesn't stall other streams
ImpactA dropped video init segment blocks all subsequent audio/video segments until retransmitted or timed out; the HOL block is bounded by the configured packet drop timeoutA dropped .m4s segment only delays that one file; other segments flow through

This is the most fundamental architectural difference. SRT's HOL blocking is bounded — TLPKTDROP releases the block once the packet drop timeout expires (configured via the latency setting), so the stall is not indefinite. However, even bounded HOL blocking means all data behind the lost packet is delayed by up to the timeout period, whereas QuicFeed's per-stream architecture means only the affected file is delayed. Test results validated this: zero file delivery errors even under 2% loss + 50ms jitter on both sides simultaneously.

2. Connection Identity

SRTQuicFeed
Binding4-tuple: source IP + port, dest IP + portQUIC Connection ID (independent of IP/port)
MigrationConnection dies if IP or port changesSupported — 60s idle timeout + 5s keep-alive; session survives network interface changes
Multipath"Reserved for future" in the specPhase 1 (hitless failover) supported; Phase 2 (active multipath) awaiting quinn RFC 9443

SRT's bonding/multipath is still a framework stub. QuicFeed configures connection migration with max_idle_timeout(60s) and keep_alive_interval(5s), enabling hitless failover when a TX changes network interfaces mid-stream.

3. Handshake & Setup

SRTQuicFeed
Initial connection2-phase handshake (Induction + Conclusion) over UDP, then key exchangeQUIC 1-RTT handshake (TLS 1.3 integrated)
ReconnectionFull handshake required again0-RTT resumption — first packet can carry both setup and data
Anti-DoSSYN cookie (MD5 of host+port+time)QUIC built-in retry tokens and address validation

SRT's handshake is at minimum 2 round trips before data flows. QuicFeed implements 0-RTT session resumption: TX caches up to 256 session tickets and attempts into_0rtt() on reconnect, falling back to 1-RTT if no ticket is available.

4. Encryption

SRTQuicFeed
MethodAES-CTR with app-level key wrappingTLS 1.3 built into QUIC — encrypts everything including most headers
Key exchangeCustom KM messages, AES Key WrapStandard TLS 1.3 key exchange (ECDHE)
What's encryptedPayload only — SRT headers are in the clearNearly everything — only connection ID and some flags are visible
Key rotationManual SEK refreshTLS 1.3 key update mechanism
AuthenticationPassword-based (derives KEK from passphrase)TLS certificate + worker auth (namespace+password)

SRT's encryption is bolted on top. QUIC's encryption is structural — an observer can't even see packet sequence numbers.

5. Loss Recovery

SRTQuicFeed
MechanismNAK-based — receiver lists lost sequence numbersACK-based — sender detects loss from ACK gaps and timers
GranularityPer-packet within a single streamPer-packet, per-stream — retransmission on stream X doesn't affect stream Y
Too-late dropTLPKTDROP: receiver drops packets past TSBPD deadlineTLPKTDROP implemented — RX drops files arriving past playout deadline
Absolute delay floorTLPKTDROP only (post-arrival)--max-transfer-time — kills slow QUIC streams via STOP_SENDING during transfer, enforcing an absolute delay floor before data even arrives

SRT's NAK-based approach means the receiver drives retransmission. QUIC's approach means the sender drives it. --max-transfer-time enforces an absolute delay floor by sending STOP_SENDING to abort streams mid-transfer — if a segment isn't fully received within the deadline, the stream is killed, saving bandwidth on doomed retransmissions. Combined with TLPKTDROP (--latency), this guarantees no segment stalls the pipeline beyond the configured deadline. SRT cannot replicate this per-stream kill with its single-stream architecture.

6. Congestion Control

SRTQuicFeed
Live modeLiveCC — rate-limited by configured max bandwidthLiveCC — media-aware controller with BDP floor and gentle backoff
Feedback signalReceiver reports available buffer size in ACK packetsACK-based + RX buffer feedback via QUIC datagrams (1/sec)
Jitter responseAbsorbs jitter in TSBPD bufferIgnores jitter — only reacts to actual packet loss with 0.85x decrease

QuicFeed's LiveCC replaces quinn's default Cubic with a custom controller:

7. Latency Management

SRTQuicFeed
ApproachTSBPD — configurable latency budget negotiated at handshakeTSBPD implemented--latency flag configures jitter buffer with playout scheduling
Clock syncDrift compensation via ACK/ACKACKConnection-relative timestamps; no clock drift compensation yet
Late arrivalsTLPKTDROP discards packets past deadlineTLPKTDROP — files past origin_time + latency are dropped

Each segment is its own QUIC stream, and QUIC delivers bytes reliably and in order within each stream. With LL-HLS or L3D-DASH enabled, the RX parses ~33ms CMAF fragments as they arrive within the stream and writes them as part files immediately — no waiting for the full segment. This enables sub-second glass-to-glass latency, comparable to SRT's TSBPD-buffered delivery but with per-stream independence.

RX sends buffer feedback to TX every second via QUIC datagrams: buffer depth, buffer bytes, drops, timeouts, and average TX time.

8. Multiplexing & Stream Types

SRTQuicFeed
Stream independenceEach SRT socket is an independent connectionMultiple independent streams within one QUIC connection
Stream typingNo built-in differentiationWire format v2: StreamType (Video, Audio, Metadata) auto-classified
OverheadEach stream = separate handshake + congestion stateOne handshake, shared congestion state, independent delivery
v1: [u16 name_len][name][u64 data_len][data]
v2: [u8 version=0x02][u8 stream_type][u16 name_len][name][u64 timestamp_us][u64 data_len][data]

9. Feature Parity Scorecard

SRT FeatureQuicFeed StatusNotes
Packet loss recovery (ARQ)MatchedQUIC ACK-based retransmission, per-stream
Jitter buffer (TSBPD)Matched--latency flag, BinaryHeap playout scheduling
Too-late packet dropMatchedFiles past playout deadline dropped and counted
Per-stream transfer timeoutExceeded--max-transfer-time kills slow streams; SRT can't do per-stream kill
Congestion control (LiveCC)MatchedBDP floor + 0.85x backoff; outperforms Cubic under jitter
EncryptionExceededTLS 1.3 built-in; encrypts headers, not just payload
Latency managementMatchedConnection-relative timestamps + jitter buffer
Connection migrationExceededQUIC CIDs survive IP/port changes; SRT connections die
0-RTT reconnectionExceededNear-instant session resumption; SRT requires full re-handshake
Multi-stream media mappingExceededWire format v2 stream types; SRT has no stream-level multiplexing
HoL blocking eliminationExceededOne stream per file; SRT has bounded HOL blocking (up to drop timeout) on a single ordered stream
Clock drift compensationGapSRT syncs via ACK/ACKACK; QuicFeed uses connection-relative only
Receiver buffer feedbackMatchedRX sends buffer report to TX every second via QUIC datagrams
Multipath bondingPartialPhase 1 hitless failover works; active-active blocked on quinn RFC 9443

12 of 14 features matched or exceeded. 1 minor gap remains. 1 partially implemented.

10. Test Results

v1 Results (Cubic congestion control)

PhaseImpairmentRTTCWNDFiles/60sThroughput
BaselineNone28ms444KB~4.4 Mbps
12% loss27msStable349~4.5 Mbps
22% bursty loss26msStable350~4.4 Mbps
350ms delay126msStable347~4.1 Mbps
450ms + 20ms jitter122ms7KB117~1.3 Mbps
510 Mbit cap73msStable341~4.4 Mbps
6Combined107msLow126~1.5 Mbps

v2 Results (LiveCC congestion control)

PhaseImpairmentRTTCWNDFiles/60sThroughput
BaselineNone27ms1,071KB~4.9 Mbps
12% loss24ms122KB350~5.1 Mbps
22% bursty loss27ms363KB345~5.0 Mbps
350ms delay128ms642KB353~5.1 Mbps
450ms + 20ms jitter82ms424KB353~5.2 Mbps
510 Mbit cap100ms512KB351~4.9 Mbps
6Combined97ms453KB352~5.3 Mbps

Zero file delivery errors across all phases.

Key Findings

Phase 4 (jitter) — the critical fix: v1 CWND collapsed from 444KB to 7KB, throughput dropped 75% to 1.3 Mbps. v2 CWND held at 424KB, throughput steady at 5.2 Mbps — 4x improvement. LiveCC's BDP floor prevented the collapse entirely.

Phase 6 (combined) — real-world conditions: v1 delivered 126 files at 1.5 Mbps. v2 delivered 352 files at 5.3 Mbps — 3.5x throughput improvement.

11. What SRT Has That QuicFeed Doesn't (Yet)

  1. Clock drift compensation — SRT syncs sender/receiver clocks via ACK/ACKACK timestamp exchange. Low priority for contribution feeds where connections are stable and short-lived.

12. What QuicFeed Has That SRT Doesn't

  1. Per-file stream independence — true HoL blocking elimination (SRT's is bounded by the drop timeout, but still stalls all data behind the lost packet for up to that duration)
  2. Built-in TLS 1.3 — full header encryption, standard key exchange
  3. 0-RTT reconnection — near-instant session resumption
  4. Connection migration — session survives IP/port changes
  5. Path MTU discovery — QUIC probes MTU automatically
  6. Multi-stream media mapping — wire format v2 stream type headers
  7. Per-stream transfer timeout--max-transfer-time kills slow streams via STOP_SENDING
  8. Receiver buffer feedback via QUIC datagrams — real-time receiver health visibility

← Back to QuicFeed