END_STREAMフラグを受信した後も、ストリームがデータフレームを受信し続けることができるのはなぜですか(HTTP / 2ストリームのステータス変更の詳細な説明)

最初に、答えを添付します。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フレームの受信にのみ使用できますが、任意のタイプのフレームの送信に使用できます。

おすすめ

転載: blog.csdn.net/weixin_45022086/article/details/108750765