チャンク転送エンコーディングは、 RFC 9112 §7.1で定義されている、ハイパーテキスト転送プロトコル(HTTP)バージョン1.1で利用可能なストリーミングデータ転送メカニズムです。チャンク転送エンコーディングでは、データストリームは重複しない一連の「チャンク」に分割されます。これらのチャンクは互いに独立して送受信されます。送信側も受信側も、現在処理中のチャンク以外のデータストリームに関する情報は一切必要ありません。
各チャンクの前にはバイト単位のサイズが付加され、長さゼロのチャンクを受信すると送信が終了します。Transfer -Encodingヘッダーのchunkedキーワードは、チャンク転送を示すために使用されます。
HTTP/2ではチャンク転送エンコーディングはサポートされておらず、データストリーミングのための独自のメカニズムが提供されています。[ 1 ]
チャンクエンコーディングの導入により、以下のような様々な利点がもたらされました。
HTTP プロトコルのバージョン 1.1 では、チャンク転送メカニズムは、 Transfer-Encoding (TE) リクエスト ヘッダー フィールドにリストされていなくても、常に、いかなる場合でも許容されるものとみなされます。また、他の転送メカニズムと併用する場合は、転送されたデータに常に最後に適用され、複数回適用されることはありません。この転送エンコーディング方式では、クライアントが TE リクエスト フィールドの引数として「trailers」パラメータを指定した場合、最後のチャンクの後にエンティティ ヘッダー フィールドを追加で送信することもできます。レスポンスの発信元サーバーは、クライアントが「trailers」パラメータを指定しなかった場合でも、メタデータがオプションである場合 (つまり、クライアントが受信したエンティティをそれらなしで使用できる場合) に限り、追加のエンティティ トレーラーを送信することを決定できます。トレーラーが使用される場合は、サーバーは Trailer ヘッダー フィールドにその名前をリストする必要があります。Content -Length、Trailer、Transfer-Encoding の3 つのヘッダー フィールド タイプは、トレーラー フィールドとして表示することが特に禁止されています。
HTTP メッセージ (クライアントから送信されたリクエストまたはサーバーからのレスポンス) で、値が " chunked " のTransfer-Encodingフィールドが指定されている場合、メッセージの本文は 1 つ以上のチャンクと、最後の ␍␊ シーケンス (つまり、キャリッジ リターンに続いてライン フィード) の前にオプションのトレーラーが付いた 1 つの終了チャンクで構成されます。
各チャンクは、埋め込まれるデータのオクテット数をASCIIの16進数で表したもので始まり、オプションのパラメータ(チャンク拡張)と終端の␍␊シーケンスが続き、その後にチャンクデータが続きます。チャンクは␍␊で終了します。
チャンク拡張が指定されている場合、チャンクサイズはセミコロンで終了し、その後にパラメータが続きます。各パラメータもセミコロンで区切られます。各パラメータは、拡張名にオプションの等号と値が続く形式でエンコードされます。これらのパラメータは、例えば、実行中のメッセージダイジェストやデジタル署名、または転送の進捗状況の推定値を示すために使用できます。
終端チャンクは、長さがゼロの特殊なチャンクです。終端チャンクには、エンティティヘッダーフィールドのシーケンス(空の場合もある)からなるトレーラーが含まれる場合があります。通常、このようなヘッダーフィールドはメッセージのヘッダーで送信されますが、メッセージエンティティ全体を処理した後に決定する方が効率的な場合もあります。その場合は、これらのヘッダーをトレーラーで送信すると便利です。
トレーラーの使用を規定するヘッダーフィールドは、リクエストで使用される「trailers」パラメータ付きのTransfer-Encodingと、レスポンスで使用されるTrailerです。
HTTPサーバーは、送信を最適化するために、Content-Encoding: gzipやContent-Encoding: deflateなどの圧縮をよく使用します。圧縮とチャンクエンコーディングの両方が有効になっている場合、コンテンツストリームは最初に圧縮され、次にチャンク化されます。つまり、チャンクエンコーディング自体は圧縮されず、各チャンク内のデータは全体として(つまり、コンテンツ全体に基づいて)圧縮されます。リモートエンドポイントは、チャンクを連結して結果を解凍することでストリームをデコードします。
以下の例には、サイズが4、7、11(16進数「B」)オクテットの3つのデータチャンクが含まれています。
4␍␊Wiki␍␊7␍␊pedia i␍␊B␍␊n ␍␊chunks.␍␊0␍␊␍␊
以下は、エンコードされたデータの注釈付きバージョンです。
4␍␊ (チャンクサイズは4オクテット) Wiki (4オクテットのデータ) ␍␊ (チャンクの終わり) 7␍␊ (チャンクサイズは7オクテット) pedia i (7オクテットのデータ) ␍␊ (チャンクの終わり) B␍␊ (チャンクサイズは11オクテット) n␍␊チャンク。 (11オクテットのデータ) ␍␊ (チャンクの終わり) 0␍␊ (チャンクサイズはゼロオクテット、これ以上チャンクはありません) ␍␊ (データオクテットがゼロの最終チャンクの終わり)
注: 各チャンクのサイズには、各チャンクのデータを終了させる 2 バイトの ␍␊ は含まれません。
上記の例をデコードすると、次のオクテットが得られます。
Wikipediaを␍␊チャンクに分割。
上記のバイト列は通常次のように表示されます。
ウィキペディア チャンク。