3. 圧縮方法 (Compression method)
3. 圧縮方法 (Compression method)
ヘッダー情報の大部分はパケットストリームの生存期間中変化しません。非 TCP パケットストリームでは、ほぼすべてのヘッダーフィールドが定数です。TCP では多くのフィールドが定数であり、他のフィールドは小さく予測可能な値で変化します。
パケットストリームのヘッダー圧縮を開始するために、コンテキスト識別子 CID を運ぶ完全ヘッダーがリンクを通じて転送されます。圧縮器と解凍器はこの完全ヘッダーのほとんどのフィールドをコンテキストとして保存します。コンテキストは、値が定数であるためリンクを通じて送信する必要がないか、または連続するヘッダー間の変化が小さく絶対値を送信するよりも前の値との差を送信する方がビット数が少ないヘッダーフィールドで構成されます。
定数であると予想されるフィールドの変化は、圧縮器が解凍器のコンテキストを更新するために完全ヘッダーを再送信することになります。圧縮器と解凍器のコンテキストが同じである限り、ヘッダーは圧縮前と全く同じに解凍できます。しかし、転送中に完全ヘッダーまたは圧縮ヘッダーが失われた場合、解凍器のコンテキストが正しく更新されなかったため古くなる可能性があります。その場合、圧縮ヘッダーは不正に解凍されます。
IPv6 は大量の破損パケットを IPv6 モジュールに配送できるリンクでの使用を意図していません。これはリンクが非常に低いビットエラー率を持つか、またはリンク層フレームが強力なチェックサム、前方誤り訂正、または同様の性質によって保護されなければならないことを意味します。強力なリンク層チェックサムのない IPv4 ではヘッダー圧縮を使用すべきではありません。破損したフレームはリンク層によって廃棄されます。ヘッダー圧縮モジュールが処理・防止すべきリンクエラーの種類はパケット損失です。
したがって、ヘッダー圧縮方式は解凍器のコンテキストを更新し、不正な解凍を検出または回避するメカニズムを必要とします。これらのメカニズムは TCP と非 TCP フローで大きく異なり、第 3.2 節と第 3.3 節で説明します。
3.1 パケットタイプ (Packet types)
この圧縮方法は IPv4 および IPv6 パケットタイプに加えて 4 種類のパケットタイプを使用します。リンク層パケットタイプとパケットの最初の 4 ビットの値の組み合わせがパケットタイプを一意に決定します。
FULL_HEADER — CID を含む非圧縮ヘッダーを持つパケット(TCP パケットでない場合は世代も含む)を表します。CID で識別されるパケットストリームのコンテキストを確立またはリフレッシュします。
COMPRESSED_NON_TCP — 圧縮ヘッダーを持つ非 TCP パケットを表します。圧縮ヘッダーは、解凍に使用するコンテキストを識別する CID、コンテキストの不一致を検出するための世代、およびヘッダーのランダムに変化するフィールドで構成されます。
COMPRESSED_TCP — 圧縮 TCP ヘッダーを持つパケットを表します。CID、変化したフィールドを識別するフラグオクテット、および前の値との差として符号化された変化したフィールドを含みます。
COMPRESSED_TCP_NODELTA — 通常は前の値との差として送信されるすべてのフィールドがそのまま送信される圧縮 TCP ヘッダーを持つパケットを表します。このパケットタイプは解凍器からのヘッダー要求への応答としてのみ送信されます。
これらの圧縮用パケットタイプに加えて、圧縮器がパケットを圧縮しないと決定した場合は通常の IPv4 および IPv6 パケットが使用されます。
CONTEXT_STATE — 同期が失われた(TCP)CID のリストを伝えるために解凍器から圧縮器に送信される特別なパケットを表します。このパケットは単一リンクのみを通じて送信されるため、IP ヘッダーは不要です。
3.2 TCP パケットストリームでの損失パケット (Lost packets in TCP packet streams)
TCP ヘッダーは前の TCP ヘッダーとの差を使用して圧縮されるため、圧縮または完全ヘッダーを持つパケットの損失は、コンテキストが正しくインクリメントされなかったため後続の圧縮ヘッダーが不正に解凍されることになります。
圧縮された TCP ヘッダーの損失は、その後解凍された TCP ヘッダーの TCP シーケンス番号が k だけずれることになります(k は失われたセグメントのサイズ)。この不正に解凍された TCP ヘッダーは TCP 受信者によって廃棄されます。TCP チェックサムが合理的な k に対してシーケンス番号の「k だけずれ」エラーを確実に捕捉するためです。
TCP の修復メカニズムは最終的に廃棄されたセグメントを再送信し、圧縮器は TCP ヘッダーを覗き見て TCP がいつ再送信するかを検出します。これが発生すると、圧縮器は解凍器での圧縮状態の不一致を想定して完全ヘッダーを送信します。
3.3 UDP およびその他の非 TCP パケットストリームでの損失パケット (Lost packets in UDP and other non-TCP packet streams)
不正に解凍された UDP パケットヘッダーおよびその他の非 TCP パケットヘッダーは、TCP パケットほどチェックサムによって保護されていません。
非 TCP ヘッダーの不正な解凍を安全に回避するために、非 TCP パケットストリームのコンテキストの各バージョンは世代によって識別されます。世代は、コンテキストを確立およびリフレッシュする完全ヘッダーによって運ばれる小さな数値です。圧縮ヘッダーは圧縮に使用されたコンテキストの世代値を運びます。解凍器が圧縮ヘッダーの世代値がそのパケットストリームのコンテキストの世代と異なることを確認した場合、コンテキストは最新ではなく、完全ヘッダーが正しいコンテキストを確立するまでパケットを廃棄または保存しなければなりません。
差分符号化は非 TCP フローには使用されないため、圧縮された非 TCP ヘッダーはコンテキストを変更しません。したがって、圧縮ヘッダーの損失は圧縮ヘッダーを持つ後続パケットを無効にしません。
3.3.1 圧縮スロースタート (Compression Slow-Start)
コンテキストを変更する完全ヘッダーの損失から解凍器が迅速に回復できるようにするために、コンテキスト変更後に指数的に増加する間隔で定期的に完全ヘッダーが送信されます。
|.|..|....|........|................|..............................
^
変更 送信パケット: | 完全ヘッダー付き、. 圧縮ヘッダー付き
圧縮器は各非 TCP パケットストリームに対して変数 F_PERIOD を保持し、完全ヘッダー間に送信できる圧縮ヘッダーの数を追跡します。非 TCP パケットストリームのヘッダーがコンテキストを変更するほど変化した場合、完全ヘッダーが送信され F_PERIOD が 1 に設定されます。F_PERIOD 個の圧縮ヘッダーを送信した後、完全ヘッダーが送信されます。圧縮スロースタート中に完全ヘッダーが送信されるたびに F_PERIOD が 2 倍になります。
3.3.2 定期的なヘッダーリフレッシュ (Periodic Header Refreshes)
受信器がコンテキストを失った場合に失われるパケット数を少なくするために、ヘッダーリフレッシュ間に送信できる圧縮ヘッダーを持つ非 TCP パケット数に上限 F_MAX_PERIOD があります。
低データレートパケットストリームの長時間の切断を避けるために、非 TCP パケットストリームの完全ヘッダー間の時間にも上限 F_MAX_TIME があります。
3.3.3 完全ヘッダー送信のルール (Rules for sending Full Headers)
圧縮器は以下の疑似コードを使用して非 TCP パケットストリームの完全ヘッダーをいつ送信するかを決定できます。
if ( <このヘッダーがコンテキストを変更する> )
C_NUM := 0;
F_LAST := current_time();
F_PERIOD := 1;
increment_generation_value();
send_full_header();
elseif ( C_NUM >= F_PERIOD )
C_NUM := 0;
F_LAST := current_time();
F_PERIOD := min(2 * F_PERIOD, F_MAX_PERIOD);
send_full_header();
elseif ( current_time() > F_LAST + F_MAX_TIME )
C_NUM := 0;
F_LAST := current_time();
send_full_header();
else
C_NUM := C_NUM + 1
send_compressed_header();
endif
3.3.4 ヘッダーリフレッシュ送信のコスト (Cost of sending Header Refreshes)
f 番目ごとのパケットが完全ヘッダーを運ぶ場合、H が完全ヘッダーのサイズ、C が圧縮ヘッダーのサイズとすると、平均ヘッダーサイズは以下になります。
(H-C)/f + C
デフォルトの F_MAX_PERIOD 値 256(第 14 節)は完全ヘッダー頻度を変曲点の右側に配置し、完全ヘッダーが通常平均ヘッダーサイズに大幅に 1 オクテット未満しか寄与しないことを意味します。