ホームページ  >  記事  >  ウェブフロントエンド  >  HTTPプロトコルのチャンク解析

HTTPプロトコルのチャンク解析

黄舟
黄舟オリジナル
2016-12-16 10:06:513386ブラウズ

google.com などの GZip 圧縮を使用する Web サイトや、GZip 圧縮を有効にするほとんどの PHP フォーラムを除いて、インターネット上でチャンク エンコードを使用している Web サイトはそれほど多くないようです。私の理解によれば、チャンクエンコーディングを使用する主な利点は、一部のプログラムの計算プロセス中にコンテンツを動的に出力できることです。

たとえば、1 時間の操作をバックグラウンドで処理したいが、ユーザーが結果を確認するまでに 1 時間も待たされることは望ましくありません。このとき、チャンクエンコーディングを利用してコンテンツをチャンクで出力することができ、ユーザーはいつでも最新の処理結果を受け取ることができます。

ASP は、キャッシュされた出力モード (チャンク エンコーディング) をオフにします。 (Response.Buffer = false)
すべての Response.Write はチャンク化されているため、あまり頻繁に使用しないでください。そうしないと、チャンクが多すぎて余分なデータがスペースを無駄にします。
Chunked の特定のコーディング構造を理解したい場合は、ASP を使用してキャッシュ デバッグをオフにするのが非常に便利です。 :)

まず、RFC2616 の Chunked の定義を見てみましょう:

Chunked-Body = *chunk

last-chunk
trailer
CRLF

chunk = chunk-size [ chunk-extension ] CRLF

chunk-data CRLF

チャンクサイズ = 1*HEX
last-chunk = 1*("0") [ チャンク拡張子 ] CRLF

チャンク拡張子 = *( ";" チャンク拡張子名 [ "=" チャンク拡張子- val ] )

chunk-ext-name = token

chunk-ext-val = token | quote-string
chunk-data = chunk-size(OCTET)
trailer = *(entity-header CRLF)

データをシミュレートしましょう構造:

[チャンクサイズ] [Enter] [チャンクデータ量] [Enter] [チャンクサイズ] [Enter] [チャンクデータ量] [Enter] [0] [Enter]


チャンクサイズに注意 で表されます86AE (実際の 16 進数は 38366165) などの 16 進 ASCII コードで、計算された長さは 34478 である必要があります。これは、キャリッジ リターンの後に連続 34478 バイトのデータがあることを示します。

www.yahoo.com の戻りデータを追跡したところ、チャンクサイズにさらにいくつかのスペースがあることがわかりました。固定長が7バイト未満の場合はスペースで埋められる場合があります。


以下はデコードプロセスの疑似コードです:

length := 0//デコードされたデータ本体の長さを記録するために使用されます

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 を削除する

時間があるときに、GZip+Chunked がどのようにエンコードされるかを調べてください。各チャンク ブロックは GZip によって個別に圧縮されると推定されます。


チャンク化を使用すると、通常のデータ本体と比較して余分な消費が発生するため、当然ながらパフォーマンスがわずかに低下します。

ただし、場合によっては、最後の手段としてチャンク出力を使用する必要があります。


上記は HTTP プロトコルのチャンク分析の内容です。その他の関連記事については、PHP 中国語 Web サイト (www. php.cn)!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。