コンテンツの長さ
ヘッダーは、要求/応答本文のContent-Lengthバイト長を決定します。ヘッダーの指定を怠るとContent-Length、HTTP サーバーは暗黙的にTransfer-Encoding: chunkedヘッダーを追加します。Content-LengthとTransfer-Encodingヘッダーを一緒に使用しないでください。受信者は、本体の長さがわからず、ダウンロードの完了時間を推定できません。ヘッダーを追加する場合はContent-Length、本文全体とバイト単位で一致していることを確認してください。正しくない場合、受信者の動作は未定義です。
ヘッダーはContent-Lengthストリーミングを許可しませんが、部分的なコンテンツ サービングをサポートする必要がある大きなバイナリ ファイルに役立ちます。これは基本的に、再開可能なダウンロード、一時停止されたダウンロード、部分的なダウンロード、およびマルチホーム ダウンロードを意味します。これには、 と呼ばれる追加のヘッダーを使用する必要がありますRange。この手法はバイト サービングと呼ばれます。
転送エンコーディング
を使用するTransfer-Encoding: chunkedことで、単一のリクエストまたはレスポンス内でのストリーミングが可能になります。これは、データがチャンク方式で送信され、コンテンツの表現に影響を与えないことを意味します。
公式には、HTTP クライアントはTE、クライアントが受け入れる転送エンコーディングの種類を指定するヘッダー フィールドを含むリクエストを送信することを意図しています。これは常に送信されるわけではありませんが、ほとんどのサーバーは、クライアントがchunkedエンコーディングを処理できると想定しています。
chunked転送エンコーディングは、HTTP 1.1 がデフォルトで true であると想定している永続的な TCP 接続をより有効に利用します 。
コンテンツ エンコーディング
チャンク化されたデータまたはチャンク化されていないデータを圧縮することもできます。これは実際にはContent-Encodingヘッダーを介して行われます。
Content-Lengthは、 の後の本体の長さに等しいことに注意してくださいContent-Encoding。これは、応答を gzip した場合、圧縮後に長さの計算が行われることを意味します。長さを計算する場合は、本体全体をメモリにロードできる必要があります (その情報が他にない場合)。
チャンク エンコーディングを使用してストリーミングする場合、圧縮アルゴリズムはオンライン処理もサポートする必要があります。ありがたいことに、gzip はストリーム圧縮をサポートしています。コンテンツは最初に圧縮されてから、チャンクに分割されると思います。このようにして、チャンクが受信され、解凍されて実際のコンテンツが取得されます。逆の場合は、圧縮されたストリームを取得し、解凍するとチャンクが得られます。これは意味がありません。
一般的な圧縮ストリーム応答には、次のヘッダーが含まれる場合があります。
Content-Type: text/html
Content-Encoding: gzip
Transfer-Encoding: chunked
意味的には、 の使用はContent-Encoding「エンド ツー エンド」エンコーディング スキームを示します。これは、最終クライアントまたは最終サーバーのみがコンテンツをデコードすることになっていることを意味します。中間のプロキシは、コンテンツをデコードすることを想定していません。
中間のプロキシがコンテンツをデコードできるようにする場合、使用する正しいヘッダーは実際にはTransfer-Encodingヘッダーです。HTTP リクエストがTE: gzip chunkedヘッダーを持っていた場合、 で応答することは正当Transfer-Encoding: gzip chunkedです。
ただし、これがサポートされることはほとんどありません。Content-Encodingしたがって、今は圧縮にのみ使用する必要があります。
チャンク vs ストア & フォワード