ホームページ > 記事 > ウェブフロントエンド > HTTPプロトコルのチャンク解析
google.com などの GZip 圧縮を使用する Web サイトや、GZip 圧縮を有効にするほとんどの PHP フォーラムを除いて、インターネット上でチャンク エンコードを使用している Web サイトはそれほど多くないようです。私の理解によれば、チャンクエンコーディングを使用する主な利点は、一部のプログラムの計算プロセス中にコンテンツを動的に出力できることです。
たとえば、1 時間の操作をバックグラウンドで処理したいが、ユーザーが結果を確認するまでに 1 時間も待たされることは望ましくありません。このとき、チャンクエンコーディングを利用してコンテンツをチャンクで出力することができ、ユーザーはいつでも最新の処理結果を受け取ることができます。ASP は、キャッシュされた出力モード (チャンク エンコーディング) をオフにします。 (Response.Buffer = false)
すべての Response.Write はチャンク化されているため、あまり頻繁に使用しないでください。そうしないと、チャンクが多すぎて余分なデータがスペースを無駄にします。
Chunked の特定のコーディング構造を理解したい場合は、ASP を使用してキャッシュ デバッグをオフにするのが非常に便利です。 :)
まず、RFC2616 の Chunked の定義を見てみましょう:
last-chunk
trailer
CRLF
chunk = chunk-size [ chunk-extension ] CRLF
チャンクサイズ = 1*HEX
last-chunk = 1*("0") [ チャンク拡張子 ] CRLF
チャンク拡張子 = *( ";" チャンク拡張子名 [ "=" チャンク拡張子- val ] )
chunk-ext-val = token | quote-string
chunk-data = chunk-size(OCTET)
trailer = *(entity-header CRLF)
データをシミュレートしましょう構造:
チャンクサイズに注意 で表されます86AE (実際の 16 進数は 38366165) などの 16 進 ASCII コードで、計算された長さは 34478 である必要があります。これは、キャリッジ リターンの後に連続 34478 バイトのデータがあることを示します。
以下はデコードプロセスの疑似コードです:
read chunk-size、chunk-extension (存在する場合)、および CRLF//The first readチャンク サイズ
while (chunk-size > 0) {//読み取りチャンク サイズが 0 になるまでループします
チャンク データと CRLF を読み取ります//チャンク データ本体を読み取り、キャリッジ リターンで終了します
エンティティにチャンク データを追加します-body//デコードされたエンティティ data にチャンク データ本体を追加します
length := length + chunk-size//デコードされたエンティティの長さを更新します
read chunk-size と CRLF//新しいチャンク サイズを読み取ります
}
readentity - header//次のコードは、すべてのヘッダー タグを読み取ります
while (entity-header not empty) {
entity-header を既存のヘッダー フィールドに追加します
readentity-header
}
Content-Length := length//in header tag コンテンツを追加しますlength
Transfer-Encoding から "chunked" を削除する//ヘッダー タグから Transfer-Encoding を削除する
チャンク化を使用すると、通常のデータ本体と比較して余分な消費が発生するため、当然ながらパフォーマンスがわずかに低下します。
上記は HTTP プロトコルのチャンク分析の内容です。その他の関連記事については、PHP 中国語 Web サイト (www. php.cn)!