Data

DATA フレーム (HTTP)

[32] HTTP/2 DATA フレームは、 HTTPメッセージpayload body を転送するためのフレームです。 payload body は、1個以上DATA フレームによって表します。

仕様書

意味

[2] DATA フレーム (フレーム型 0x0) は、 ストリームに関連付けられた任意の可変長のバイト列を伝送するものです >>1

[14] DATA フレームは、フロー制御の対象となります >>1, >>31, >>19

[15] DATA フレームは、ストリームの状態が openhalf-closed (remote) の場合のみ送信できます >>1

構文

[12] DATA フレームは、ストリームと関連付けなければなりません >>1ストリーム識別子0x0 であってはなりません。

[8] DATA フレームは、次のフラグを持ちます。

[9] END_STREAM (0x1 = 第0ビット)
設定されていれば当該ストリームの当該送信者からの最後のフレームであることを表します。 >>1 ストリームの状態遷移の項も参照。
[10] PADDED (0x8 = 第3ビット)
設定されていれば詰め長と詰めの欄が含まれることを表します。 >>1

[22] その他のフラグは、 0 に設定しなければなりません受信者は無視しなければなりません>>21

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

[5] DATA フレームpayload は、次の欄で構成されます。

[6] 詰め長 (Pad Length)
詰めの長さをバイト単位で8ビットで表したものです。 PADDED フラグが設定されている場合のみ存在します。 >>1 値は0でも構いません。値が実際の詰めの長さを超えることは禁止されていませんが、
[7] データ (Data)
応用データです。 データは、フレームpayload から詰め長と詰めを除去したものです。 >>1 当然正しく処理できませんし、payload の長さを超えるなら接続エラーとなります。
[4] 詰め (Padding)
メッセージの長さを隠すためのセキュリティー機能です。 送信者は、すべて 0 のオクテットにしなければなりません>>1 詰め長の長さより、詰めの最大長は、255バイトです。

width
32
  1. 8 詰め長
  2. 88... データ
  3. 32... 詰め
[16] フロー制御の対象となるのは payload 全体であり、詰めも含まれます >>1

文脈

[3] HTTP要求HTTP応答payload の転送に、1つ以上DATA フレームを使うことができます >>1

[25] END_STREAM フラグが設定されている DATA フレームopen 状態のストリームで送信すると、 half-closed (local) 状態に遷移します >>26

[29] END_STREAM フラグが設定されている DATA フレームhalf-closed (remote) 状態のストリームで送信すると、 closed 状態に遷移します >>26

処理

[36] フレームの処理の項も参照。

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

[20] Chrome はこの検査をしていないようです。 Firefox は仕様通りエラーとします。

[23] 受信者は、payload が短すぎるか、設定 SETTINGS_MAX_FRAME_SIZE より長いなら、エラー FRAME_SIZE_ERROR としなければなりません >>24 (おそらくストリームエラー)。

[35] PADDED フラグが設定されているのに payload の長さが0の時、 Chrome はデータの長さが0として扱います。 Firefox は続きを待ち続けるように見えます。

[17] 受信者は、ストリームの状態が openhalf-closed (local) でなければ、ストリームエラー STREAM_CLOSED としなければなりません >>1。 ただし場合によっては closed で受信しても無視します >>26

[30] closed で無視する場合でも、状況によってはフロー制御窓の計算には算入します >>26

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

[27] END_STREAM フラグが設定されている DATA フレームopen 状態のストリームで受信すると、 half-closed (remote) 状態に遷移します >>26

[28] END_STREAM フラグが設定されている DATA フレームhalf-closed (remote) 状態のストリームで受信すると、 closed 状態に遷移します >>26

[11] 受信者は、詰めに 0 以外があれば接続エラー PROTOCOL_ERROR としても構いません。 >>1

[33] ChromeFirefox もこの検査をしないようです。

[18] 受信者は、詰め長が payload の長さ以上なら、 接続エラー PROTOCOL_ERROR としなければなりません >>1

[34] Chrome はこれを検査しますが、 Firefox はしないようです (データが長さ0になります)。