コンテンツの長さ
ヘッダーは、要求/応答本文の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 ストア & フォワード