最初に、答えを添付します。wireshark
がパケットをキャプチャしたときに、データフレームにEND_STREAMフラグが含まれていることがわかりましたが、ストリームはまだ終わっておらず、データフレームはまだ送信されていました。これは、ストリームの状態がopenからhalf_closed(local)に変更されたためです。この状態では、ストリームはWindow_Updata、Priority、およびRST_Streamフレームのみを送信でき、任意のフレームを受信できます。
フレーム内のフレームのフラグ(フラグ)
フレームは、HTTP / 2通信における最小のデータ伝送単位であり、フレームの定義は次のとおりです。
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+-+-------------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+
Flagsはフレームのフラグビットです。たとえば、END_HEADERSは0x04(ヘッダーデータの終わりを示す)、END_STREAMは0x01(ストリームの終わりを示す)です。
ストリームの簡単な遷移プロセスを
添付するストリームの状態遷移
+--------+
send PP | | recv PP
,--------| idle |--------.
/ | | \
v +--------+ v
+----------+ | +----------+
| | | send H / | |
,------| reserved | | recv H | reserved |------.
| | (local) | | | (remote) | |
| +----------+ v +----------+ |
| | +--------+ | |
| | recv ES | | send ES | |
| send H | ,-------| open |-------. | recv H |
| | / | | \ | |
| v v +--------+ v v |
| +----------+ | +----------+ |
| | half | | | half | |
| | closed | | send R / | closed | |
| | (remote) | | recv R | (local) | |
| +----------+ | +----------+ |
| | | | |
| | send ES / | recv ES / | |
| | send R / v send R / | |
| | recv R +--------+ recv R | |
| send R / `----------->| |<-----------' send R / |
| recv R | closed | recv R |
`----------------------->| |<----------------------'
+--------+
send: endpoint sends this frame
recv: endpoint receives this frame
H: HEADERS frame (with implied CONTINUATIONs)
PP: PUSH_PROMISE frame (with implied CONTINUATIONs)
ES: END_STREAM flag
R: RST_STREAM frame
ハーフクローズ(ローカル/リモート)
ハーフクローズ(ローカル/リモート)
ステータスでのローカルとリモートの違いハーフクローズ(ローカル)とハーフクローズ(リモート)は、完全に両端の視点に基づいています。同じストリームの両端で、一方の端がストリームのステータスを半分閉じた(ローカル)と見なす場合、もう一方の端はストリームのステータスを半分閉じた(リモート)と見なすことができます。
ハーフクローズ(ローカル)状態のストリームは、WINDOW_UPDATE、PRIORITY、RST_STREAMフレームの送信にのみ使用できますが、任意のタイプのフレームの受信に使用できます。同様に、ハーフクローズ(リモート)状態のストリームは、WINDOW_UPDATE、PRIORITY、およびRST_STREAMフレームの受信にのみ使用できますが、任意のタイプのフレームの送信に使用できます。