HTTP/3 and QUIC Error Codes

QUIC transport and HTTP/3 application error codes with description and RFC source.

Reference for QUIC transport error codes (RFC 9000) and HTTP/3 application error codes (RFC 9114) with hex value, name, meaning and the connection-close layer each belongs to.

What is the difference between QUIC and HTTP/3 error codes?

QUIC transport error codes (RFC 9000) describe failures in the transport layer — handshake, flow control, framing. HTTP/3 application error codes (RFC 9114) describe failures specific to the HTTP semantics running over QUIC. A CONNECTION_CLOSE frame carries one or the other depending on which layer detected the problem.

What these codes are

QUIC and HTTP/3 carry two families of numeric error codes. QUIC transport errors (RFC 9000) report failures of the transport itself — the handshake, flow control and framing. HTTP/3 application errors (RFC 9114) report failures of the HTTP layer running on top of QUIC. Both are delivered in QUIC’s CONNECTION_CLOSE, RESET_STREAM or STOP_SENDING frames. This reference lists the common codes with their hex value, meaning and source RFC.

How it works

When a peer detects a fatal problem it closes the connection with a frame carrying the error code and an optional reason phrase:

CONNECTION_CLOSE
  Error Code: 0x3   (FLOW_CONTROL_ERROR)
  Frame Type: 0x... (offending frame, transport-layer closes only)
  Reason:     "received more than MAX_STREAM_DATA"

The same numeric space is shared: codes in the transport range come from RFC 9000, while HTTP/3 application codes begin at 0x100 (H3_NO_ERROR) per RFC 9114. A single stream can be reset with RESET_STREAM carrying just the code, without tearing down the whole connection.

Tips and notes

  • A transport-layer CONNECTION_CLOSE includes the frame type that triggered the error; an application-layer close does not.
  • H3_NO_ERROR and NO_ERROR are clean shutdowns, not bugs.
  • H3_EXCESSIVE_LOAD lets a server shed an abusive client without a hard crash.
  • Persistent CRYPTO_ERROR codes map to TLS alerts (CRYPTO_ERROR base is 0x1000x1ff in the transport space) and point at certificate or handshake faults.