RST_STREAM

RST_STREAM フレーム (HTTP)

[25] HTTPRST_STREAM フレームは、 ストリームエラーその他の理由でストリームを終了させることを表します。

仕様書

意味

[2] RST_STREAM フレーム (フレーム型 0x3) は、ストリームを直ちに終わらせるものです >>1

[35] END_STREAM フラグとは違って、異常終了を表します。 おおよそいつでも送信できます。

構文

[8] ストリーム識別子を指定しなければなりません >>10x0 は指定できません。

[30] 接続を閉じるときは GOAWAY フレームを使います。

[6] フラグはありません >>1。 0 でなければなりません >>18受信者は無視しなければなりません >>18

width
8
  1. 1 0
  2. 1 0
  3. 1 0
  4. 1 0
  5. 1 0
  6. 1 0
  7. 1 0
  8. 1 0

[4] payload は、次の欄を含みます。

[5] 誤り符号 (Error Code)
符号無し32ビット整数 (ネットワークバイト順 >>17) で誤り符号を表します >>1誤り符号は、ストリームを終わらせる理由を表します >>1

width
32
  1. 32 誤り符号

文脈

[3] RST_STREAM フレームは、ストリームエラーの際に送信されます >>13

[10] idle 状態のストリームに送信してはなりません >>1, >>19。 その他の状態のストリームで送信できます。ほとんどいつでも送信できますが、 (他のストリームも含めて) CONTINUATION フレームが送られるべき位置で送ることはできません。

[14] 受信した RST_STREAM フレームに対して RST_STREAM フレームを送信してはなりません >>13

[20] reserved (local) 状態のストリームについて、 予約解除のために使うことができます >>19

[15] フロー制御の都合で送信されることがります。

[16] クライアントからの要求の送信途中でサーバーがもう要求の続きは不要であることを示すために RST_STREAM を送信することができます。

HTTP応答を参照。

[26] サーバープッシュが不要と示すために、 RST_STREAM を送信することができます。

[22] RST_STREAM フレームを送信した直後は、通常の closed 状態とは異なり、一部のフレームを部分的にのみ処理したり、無視したりします >>19。 いずれにせよ、受信する準備をしておかなければなりません >>13

[24] RST_STREAM フレームを複数回送信するべきではありません。 ただし closed になった後 1RTT を経過してもフレームを受信し続ける場合を除きます。 >>13

ストリームの状態遷移の項を参照。

[28] CONNECT では、TCP RST などのエラーに相当します。

CONNECT 参照。

[37] 303 を除く HTTPリダイレクトの受領直後にクライアントRST_STREAM を送信することが推奨 (encourage) されています >>36

処理

[9] 受信者は、ストリーム識別子0x0 なら、 接続エラー PROTOCOL_ERROR としなければなりません >>1

[34] ストリームの状態遷移の項も参照。

[11] 受信者は、ストリームidle 状態なら、 接続エラー PROTOCOL_ERROR としなければなりません >>1

[33] ChromeFirefox も、未使用 (idle) のストリームRST_STREAM を受信しても、エラーとはしません。

[31] FirefoxHEADERS より前に RST_STREAM を受信したら接続エラー PROTOCOL_ERROR とするようです。 (Chrome は何も送信しません。) 自身が HEADERS を送信したら open 状態になっているはずなので、接続エラーとするのは不審です。

[12] 受信者は、payload の長さが 4 以外なら、 接続エラー FRAME_SIZE_ERROR としなければなりません >>1

[7] 指定されたストリームclosed 状態へと移行させます >>19受信者は、以後 PRIORITY 以外のフレームを送信してはなりません >>1。しかし送信者はなおも受信する準備をしなければなりません >>1

[32] END_HEADERS より後で END_STREAM より前に RST_STREAM を受信すると、FirefoxChromeネットワークエラーとします。その RST_STREAM やそれ以後の同じストリームフレームは無視するようです。

[23] closed 状態で受信した RST_STREAM は、 状況によって無視したり、エラーとしたりします >>19

DoS 攻撃

[48] 令和5年10月に大規模 DoS攻撃があり、 HTTP/2 プロトコル実装上の脆弱性と報告されました。

[44] CVE Record | CVE, , https://www.cve.org/CVERecord?id=CVE-2023-44487

[42] HTTP/2 Rapid Reset: deconstructing the record-breaking attack, https://blog.cloudflare.com/technical-breakdown-http2-rapid-reset-ddos-attack/

[43] HTTP/2 Zero-Day Vulnerability Results in Record-Breaking DDoS Attacks, https://blog.cloudflare.com/zero-day-rapid-reset-http2-record-breaking-ddos-attack/

[45] How AWS protects customers from DDoS events | AWS Security Blog, , https://aws.amazon.com/jp/blogs/security/how-aws-protects-customers-from-ddos-events/

[46] Google Cloud mitigated largest DDoS attack, peaking above 398 million rps | Google Cloud Blog, https://cloud.google.com/blog/products/identity-security/google-cloud-mitigated-largest-ddos-attack-peaking-above-398-million-rps?hl=en

[47] How it works: The novel HTTP/2 ‘Rapid Reset’ DDoS attack | Google Cloud Blog, https://cloud.google.com/blog/products/identity-security/how-it-works-the-novel-http2-rapid-reset-ddos-attack?hl=en

[49] >>47 GOAWAY による対処についても言及あり、

関連

[29] TCPRSTTLSerror alert と役割が似ています。

歴史

[41] HTTP/2 で導入されました。

[21] Allow user agents to transmit RST_STREAM upon seeing a redirect · whatwg/fetch@af0dc92 ( 版) https://github.com/whatwg/fetch/commit/af0dc923f7636751996a9762309904511725a1a7

[38] Abortable fetch (jakearchibald著, ) https://github.com/whatwg/fetch/commit/0bcd5dfc71ef44319873887f4b83119bd6d0b71d

[39] More eargerly send RST_STREAM on redirects (annevk著, ) https://github.com/whatwg/fetch/commit/fd286755e9664d570260c16f7c1933f424d2f39a

[40] More eargerly send RST_STREAM on redirects by annevk · Pull Request #638 · whatwg/fetch () https://github.com/whatwg/fetch/pull/638