[45] GOAWAY
フレームは、
HTTP接続を閉じるものです。
[2] GOAWAY
フレーム (フレーム型 0x7
)
は、接続の終了をはじめたり、
誤り条件を通知したりするものです >>1。
[3] GOAWAY
を使って、エンドポイントは既存のストリームの処理は続けつつ、
新しいストリームの受付は中止し、華麗に停止することができます >>1。
[13] ストリーム識別子は 0x0
でなければなりません。
GOAWAY
フレームは接続全体に適用されます >>1。
[12] フラグはありません >>1。 0 でなければなりません >>39。 受信者は無視しなければなりません >>39。
[35] 既にアプリケーション層にデータがわたっていれば、そのストリームよりも大きなストリーム識別子を指定しなければなりません >>34。
[5] GOAWAY
フレームの送信と peer の新しいストリームの開始には競合条件がありますから、
GOAWAY
フレームには peer が開始した (上で送信者が処理した、またはしたかもしれない)
最後 (最大) のストリームのストリーム識別子を指定します。
送信者は、GOAWAY
フレームの送信以後、
そのストリーム識別子よりも大きなストリーム識別子のフレームを無視します。 >>1
[22] ただし送信者は、接続の状態を変えるフレームを完全に無視することはできません。
例えば HEADERS
、PUSH_PROMISE
、CONTINUATION
は、最低でもヘッダー圧縮のための状態の管理のための処理は行わなければなりません。
DATA
フレームは、接続フロー制御窓の加算は行わなければなりません。
>>1
[25] 送信者は追加デバッグデータがどう扱われるとも保証されませんから、 開発者モードのような特別な設定がある場合を除き、 本欄を使うべきではないでしょう。 fingerprinting vector ともなります。
[9] エンドポイントは、接続を閉じる前に GOAWAY
フレームを送信するべきです >>1, >>36。
[47] Chrome は正常終了時には GOAWAY
を送信せずに接続を閉じます
(ソースコードには、無線が寝ている場合に起こさないためとの注記があります)。
Firefox は誤り符号 NO_ERROR
の GOAWAY
を送信し、直ちに接続を閉じます。
[11] GOAWAY
フレームを既に受信している場合も、
当該接続をそれ以上使わなくなった時点で、
接続を閉じるより前に GOAWAY
フレームを送信するべきです。 >>1
[18] エンドポイントは、状況が変わったら、新たに GOAWAY
フレームを送信して構いません >>1。
ただし最終ストリーム識別子がより大きな値になってはなりません >>1。
[20] 華麗に終了したいサーバーは、まず最終ストリーム識別子が 231-1で
NO_ERROR
の GOAWAY
フレームを送信するべきです。
進行中のストリーム作成のための時間 (最低でも1RTT) が経過したら、
改めて新しい最終ストリーム識別子による GOAWAY
フレームを送信することができます。 >>1
[52] Firefox は正常終了時の GOAWAY
で最終ストリーム識別子を常に
0 とします。
[32] 誤り符号 NO_ERROR
(0x0
) は、
誤りではないことを表します。例えば、 GOAWAY
では接続の華麗な終了を表します。 >>30
[29] 接続エラーでは GOAWAY
フレームを送信するべきです
>>44。
その後TCP接続を閉じなければなりません >>44。
[43] サーバーは、ストリーム識別子が枯渇したら、
GOAWAY
フレームを送信してクライアントに新しい接続を開かせることができます >>42。
[51] Chrome も Firefox も、受信した GOAWAY
フレームに関する接続エラーでも
GOAWAY
フレームを送信します。
[14] 受信者は、ストリーム識別子が 0x0
以外なら、
接続エラー PROTOCOL_ERROR
としなければなりません >>1。
[40] 受信者は、payload が短すぎるか、設定 SETTINGS_MAX_FRAME_SIZE
より長いなら、接続エラー FRAME_SIZE_ERROR
としなければなりません
>>41。
[8] GOAWAY
フレームの受信者は、
示されたストリーム識別子より大きなストリーム識別子のストリームは最初から作られなかったものとして扱うことができます。 >>1
[6] GOAWAY
フレームの受信者は、新しいストリームを開いてはなりません。 >>1
[17] 接続が閉じられるより前に完全に閉じられていない、 最大ストリーム識別子以下のストリーム識別子のストリームでは、 冪等な動作を除き、何らの動作も再試行できません。 最大ストリーム識別子より大きなストリーム識別子のストリームでは、 新しい接続で安全に再試行できます。 >>1
[48] Chrome も Firefox も、 GOAWAY
を受信しても、
自身にとって特にエラーでなければ、エラー無しと扱うようです。
(接続を閉じる場合、受信した誤り符号に関わらず、 Firefox は NO_ERROR
の GOAWAY
を送信します。)
[49] Chrome も Firefox も、
NO_ERROR
なら、
最終ストリーム識別子より小さなストリーム識別子のストリームは、
引き続き処理を続行します。 (接続を閉じませんし、
GOAWAY
の次に更にフレームがあれば通常通り処理します。)
大きなストリーム識別子のストリームは、
ネットワークエラーとします。
その後 closed でないストリームがなくなった時点で、
(Firefox は NO_ERROR
の GOAWAY
を送信して)
接続を閉じます。