Summary

  • QUIC stream limits authorize a cumulative number of openings by stream type over a connection lifetime.
  • Closed streams remain in that count; MAX_STREAMS is not a reusable pool of live work slots.
  • Transport evidence must be recorded separately from application concurrency, workers, throughput, and business capacity.

A familiar operations mistake begins with a plausible label. A panel receives an initial_max_streams_bidi value or a later MAX_STREAMS frame, subtracts streams that have closed, and presents the remainder as current concurrency. That calculation changes the meaning of the protocol. QUIC is not reporting how many streams are alive. It is authorizing how many streams of one type the peer may open cumulatively during the connection.

The distinction starts with stream identity. QUIC stream IDs encode both initiator and directionality. Bidirectional and unidirectional streams occupy separate number spaces, and their limits are separate. A limit for incoming bidirectional streams cannot be silently treated as a limit for unidirectional streams, nor can authority for one initiator be transferred to the other. The ledger therefore needs at least the stream type and initiator before a number can be interpreted.

An endpoint communicates initial authority with initial_max_streams_bidi and initial_max_streams_uni. A missing or zero value means that the peer cannot open that type until a later MAX_STREAMS frame grants authority. The transport parameter has the same cumulative meaning as a MAX_STREAMS frame with that value. Later frames can increase the matching limit, but cannot lower it. A non-increasing MAX_STREAMS has no effect and is ignored.

The authorized number is cumulative. It concerns the highest opening ordinal permitted over the connection lifetime, not the number concurrently open at an observation point. The count includes streams that are still open and streams that have already closed. Closing a stream changes live stream state, but it does not return an opening to the authorization ledger. No closed stream number can be recycled as new authority.

This makes several fields essential and independent: cumulative authorized openings; highest opened ordinal; open, closed, and terminal stream state; application-request concurrency; queued work; worker availability; memory and CPU capacity; downstream capacity; throughput, latency, completion, and business outcome. A dashboard that compresses these fields into “available streams” invites an operational fiction. A transport number can bound endpoint state exposure without measuring useful work.

The boundary is also a safety boundary. Opening more than the authorized cumulative count produces STREAM_LIMIT_ERROR. Values above 2^60 cannot be represented consistently with stream-ID encoding and are connection errors. These are protocol validity rules, not estimates of deployable capacity. Conversely, a restrictive limit can impair an application that expects many streams, while a permissive limit exposes an endpoint to more peer-created state. The trade-off is resource control.

STREAMS_BLOCKED supplies a narrower kind of evidence. It says that the sender wanted to create a new stream but the current transport limit prevented creation. It neither grants authority nor proves application demand in a broad sense. It does not establish queued workload, worker availability, throughput, successful completion, or business capacity. It is evidence of blocked demand at the transport boundary only.

The five-dimensional separation must remain explicit. TR-046 concerns byte flow-control permission, not stream-opening authorization. TR-057 concerns final-size accounting for a stream direction, not whether another stream may be opened. TR-054 concerns STOP_SENDING cancellation of one direction, not the connection-lifetime opening ledger. TR-053 concerns connection closure, while this ledger applies while the connection remains active. TR-040 concerns connection-ID routing and migration, not stream openings. None of those signals can substitute for the ledger fields above.