Compare

Side-by-side on the decisions that recur: TCP vs UDP, HTTP/2 vs HTTP/3, flow vs congestion control, L4 vs L7, forward vs reverse proxy, IPv4 vs IPv6 — with when to choose each.

Flow controlCongestion control
ProtectsThe receiver — its socket buffer must not overflowThe network — routers’ queues must not overflow
SignalReceive window (rwnd) advertised in every ACKInferred from loss, duplicate ACKs, RTT growth, ECN marks
Who sets itThe receiver, explicitly, from buffer space leftThe sender, by algorithm (CUBIC, BBR, Reno)
Sender limitIn-flight bytes ≤ rwndIn-flight bytes ≤ cwnd
Typical symptom when it bitesZero window: transfer stalls while the app is not readingThroughput sawtooth; collapses under loss
Effective windowmin(rwnd, cwnd) — whichever is smaller winsmin(rwnd, cwnd) — whichever is smaller wins
Choose this whenDiagnose this when the receiver is a slow consumer: window is zero, ss -ti shows a tiny rwnd, backpressure in the app.Diagnose this when the link is lossy or shared: retransmits climb, cwnd resets, throughput halves under a few percent of loss.