Head-of-line blocking depends on which ordering contract applies
Trace blocking through TCP bytes, HTTP multiplexing, QUIC streams, compression dependencies, and application scheduling before choosing a transport architecture.
On this page
The question for today
What you’ll understand
- Locate the ordering boundary that prevents later useful work from progressing.
- Explain the difference between TCP cross-stream blocking and QUIC within-stream blocking.
- Compare connection isolation against shared-resource and application-dependency costs.
A later result can be fully available yet unusable because an earlier piece is missing. That is the central shape of head-of-line blocking, but the relevant line might be a byte stream, a protocol dependency, a work queue, or an application workflow. Saying a new transport removes head-of-line blocking without naming that boundary hides the design decision. Follow one delayed byte through the stack and ask who actually needs to wait for it.
Multiplexing above one TCP stream retains one byte-order boundary
TCP presents one ordered byte stream in each direction. An application protocol can place frames for many logical requests into that stream, as HTTP/2 does, but the transport still cannot deliver later stream bytes before an earlier gap. A lost TCP segment can therefore delay parsing bytes associated with otherwise unrelated requests whose frames follow that gap. Multiplexing avoids some application-level request serialization and supports concurrent progress when bytes arrive, yet it cannot remove the underlying transport's in-order delivery contract. Distinguish those two improvements when explaining why HTTP/2 is useful despite this limitation.
The effect depends on where loss occurs and what bytes have already been delivered. A frame completely parsed before the gap is not retrospectively blocked merely because another request later stalls. Nor does every lost packet delay every request for an identical duration; request dependencies, framing, buffering, and scheduling matter. A packet capture that only records aggregate completion times cannot identify the exact blocked boundary. Map the lost interval to the receiver's next expected byte and the application frames behind it, then connect that timeline to the useful work the user was awaiting.
QUIC changes the ordering scope, not every dependency
QUIC orders bytes within each stream rather than imposing one cross-stream byte sequence. If stream A has a missing range, complete bytes for independent stream B can be delivered without waiting for A's repair. Within A, later bytes still wait behind A's gap. If one lost packet carries frames for A and B, both can lose useful content together. All streams may also experience reduced sending opportunity when shared congestion control reacts. The improvement is a precise change to delivery ordering, not a guarantee that packet loss has no cross-stream performance effect.
Application protocols can introduce dependencies above the transport. HTTP/3 uses QPACK with rules designed to control header-compression blocking, but a header block referencing unavailable dynamic-table state can still wait for that state within the permitted limits. A page's script can depend on a stylesheet or an API response even when its stream is deliverable. Prioritization, CPU scheduling, storage access, and connection-level flow control can also couple requests. Place each dependency in its own layer so a transport migration is evaluated against the actual critical path instead of credited with removing delays it cannot affect.
Choose isolation with its costs visible
Opening separate connections can isolate some transport ordering, but each connection brings state, handshakes, congestion behavior, and resource consumption. Multiple competing controllers may change fairness and aggregate pressure rather than create new capacity. Keeping one connection can improve reuse while retaining shared fate. Neither architecture is universally best. Evaluate short urgent requests alongside large transfers under representative RTT, loss, CPU load, and dependency patterns. Compare useful completion distributions and resource costs, and state whether a benefit comes from independent ordering, a different scheduler, extra parallelism, or simply a different initial sending budget.
Use independent queue runs to examine the shared service that remains after stream ordering is separated. Reset, explicitly set both λ=2.5 and μ=3, predict backlog four draining from t=0 to zero at t=8 seconds, then Play or Step. Reset again and re-set BOTH λ=1 and μ=3; predict zero at t=2 seconds before playback. Control edits retain t and recompute from four instead of continuing the prior backlog. Neither run contains stream order or QUIC. Use the worked timeline to compare a gap's repair with each stream's arrival, rather than treating these fluid curves as packet-level head-of-line evidence.
Work it through
A later response behind one missing range
Ignore parsing and CPU time. Response A's earlier bytes have a gap repaired at 80 ms. Response B's complete bytes arrive at 30 ms. In one TCP stream B lies after A's gap; alternatively B uses an independent QUIC stream with no shared application dependency.
For the TCP arrangement, B's later bytes cannot pass the unresolved earlier stream gap. Its earliest usable time in this model is max(30,80)=80 ms.
For independent QUIC streams, B's own bytes are contiguous at 30 ms. A's missing range does not impose a cross-stream ordering wait, so B can become usable at 30 ms under the stated assumptions.
The isolated ordering benefit is 80−30=50 ms for B. Do not extend this result to a case where B's packet is also lost, B depends on A, or shared congestion postpones B's arrival.
The example attributes a 50-ms improvement to one removed ordering dependency while keeping shared-resource and application effects outside its assumptions.
The living notebook
Explore the model
Interactive lab · queue
The shared bottleneck remains
Before EACH comparison Reset, explicitly re-set BOTH rates, predict, then Play or Step. Compare (λ,μ)=(2.5,3) with (1,3): each starts at backlog four and t=0, reaching zero at eight and two seconds respectively. Editing rates retains t and recomputes from four, not from the last backlog. This shared-capacity illustration has no stream ordering, packet loss, compression state, or HTTP prioritization.
- Fluid backlog
- 4
- Net rate · λ − μ
- −1 /s
- M/M/1 mean residence
- 1 s
Fluid backlog starts at 4 and follows max(0, 4 + (λ − μ)t). The separate M/M/1 residence-time formula assumes Poisson arrivals, exponential service and λ < μ. Parameter changes pause playback and recompute the model at the current elapsed time. Reset restores both parameters and returns time to zero. Playback starts paused. Adjust either parameter, then choose Play or Step.
Look forRemoving cross-stream byte blocking does not remove congestion, shared service, or higher-level dependencies.
Pause & reason
Check your understanding
Your turn
Try it yourself
A's gap repairs at 120 ms, B's bytes arrive at 40 ms, and B's application additionally requires a result from A available at 150 ms. Compare B's earliest usable result over the TCP arrangement and independent QUIC streams.
Take a moment to make a prediction or work it out on paper. Open a hint when you need one.
Give me a hint
Apply the application dependency after considering byte delivery. The critical path is the latest required event.
Compare with the solution
TCP can make B's bytes deliverable no earlier than 120 ms, while independent QUIC can deliver them at 40 ms. Yet both must wait until A's required result at 150 ms before B's useful result can proceed. Transport delivery improves without changing this example's final application critical path.
Keep the idea
Take it with you
- Head-of-line blocking names an ordering dependency at a particular layer.
- QUIC removes cross-stream byte ordering while preserving within-stream reliability.
- Connection isolation must be evaluated with shared capacity and application critical paths.
Read further
Original sources and deeper explanations to follow at your own pace.
Optional progress, saved in this browser when available. Revisit any lesson at any time.
Lesson not marked complete.