Skip to content
State machine (FSM) templates

State machine — HTTP/2 stream lifecycle (RFC 9113 §5.1)

The normative HTTP/2 stream state machine from RFC 9113 §5.1 — idle, reserved local/remote, open, half-closed local/remote and closed — with all twenty transitions labelled by the frame that causes them (HEADERS, PUSH_PROMISE, END_STREAM, RST_STREAM) and by whether it is sent or received.

Template previewState machine (FSM)
HTTP/2 stream states — RFC 9113 §5.17 states · 20 transitions · 8 eventssend HEADERSrecv HEADERSsend PUSH_PROMISErecv PUSH_PROMISEsend HEADERSsend RST_STREAMrecv RST_STREAMrecv HEADERSsend RST_STREAMrecv RST_STREAMsend END_STREAMrecv END_STREAMsend RST_STREAMrecv RST_STREAMrecv END_STREAMsend RST_STREAMrecv RST_STREAMsend END_STREAMsend RST_STREAMrecv RST_STREAMidlereserved localreserved remoteopenhalf-closed localhalf-closed remoteclosedAll 7 states are reachable and every transition names states that exist.OKAll 7 states are reachable from `Idle`.OKEvery run from `Idle` can reach the final state.OKAll 20 transitions name states that exist, so every arrow in the figure is drawn.

Make it your own.

title "HTTP/2 stream states — RFC 9113 §5.1"
state Idle label "idle"
state ReservedLocal label "reserved local"
state ReservedRemote label "reserved remote"
state Open label "open"
state HalfClosedLocal label "half-closed local"
state HalfClosedRemote label "half-closed remote"
state Closed label "closed" final
initial Idle

transition Idle -> Open on "send HEADERS"
transition Idle -> Open on "recv HEADERS"
transition Idle -> ReservedLocal on "send PUSH_PROMISE"
transition Idle -> ReservedRemote on "recv PUSH_PROMISE"

transition ReservedLocal -> HalfClosedRemote on "send HEADERS"
transition ReservedLocal -> Closed on "send RST_STREAM"
transition ReservedLocal -> Closed on "recv RST_STREAM"

transition ReservedRemote -> HalfClosedLocal on "recv HEADERS"
transition ReservedRemote -> Closed on "send RST_STREAM"
transition ReservedRemote -> Closed on "recv RST_STREAM"

transition Open -> HalfClosedLocal on "send END_STREAM"
transition Open -> HalfClosedRemote on "recv END_STREAM"
transition Open -> Closed on "send RST_STREAM"
transition Open -> Closed on "recv RST_STREAM"

transition HalfClosedLocal -> Closed on "recv END_STREAM"
transition HalfClosedLocal -> Closed on "send RST_STREAM"
transition HalfClosedLocal -> Closed on "recv RST_STREAM"

transition HalfClosedRemote -> Closed on "send END_STREAM"
transition HalfClosedRemote -> Closed on "send RST_STREAM"
transition HalfClosedRemote -> Closed on "recv RST_STREAM"