メインコンテンツまでスキップ

B2. Anti-Replay Window (アンチリプレイウィンドウ)

受信者は, サイズWのアンチリプレイウィンドウを維持します。このウィンドウは, これまでに認証された最高のシーケンス番号を持つパケットに対して, パケットがどの程度順序が狂っている可能性があるかを制限します。(このウィンドウの最小サイズまたは推奨サイズに関する要件は, 32ビットシーケンス番号ウィンドウに対して既に確立されている32パケットおよび64パケットの値を超えて確立されていません。ただし, 実装者がESNオプションを使用する実装によってサポートされるインターフェース速度と一致するようにこれらの値をスケーリングすることが推奨されます。また, 以下で説明するアルゴリズムは, ウィンドウが幅2^31パケット以下であることを前提としています。) 上位32ビット (Seqh) の固定値に関連付けられたすべての2^32シーケンス番号は, 以下ではシーケンス番号サブスペースと呼ばれます。次の表は, 関連する変数とその定義を示しています。

Var. NameSize (bits)Meaning
W32ウィンドウのサイズ
T64これまでに認証された最高のシーケンス番号, ウィンドウの上限
Tl32Tの下位32ビット
Th32Tの上位32ビット
B64ウィンドウの下限
Bl32Bの下位32ビット
Bh32Bの上位32ビット
Seq64受信パケットのシーケンス番号
Seql32Seqの下位32ビット
Seqh32Seqの上位32ビット

アンチリプレイチェックを実行するとき, または着信パケットを認証するために使用する上位ビットを決定するときには, 2つのケースがあります:

  • ケースA: Tl >= (W - 1)。この場合, ウィンドウは1つのシーケンス番号サブスペース内にあります。(図1を参照してください)
  • ケースB: Tl < (W - 1)。この場合, ウィンドウは2つのシーケンス番号サブスペースにまたがっています。(図2を参照してください)

以下の図では, 下線 (「----」) は2つの連続したシーケンス番号サブスペースを示し, ゼロは各サブスペースの開始を示します。その上の2つの短い線は, 適用される上位ビットを示します。「====」はウィンドウを表します。「****」は将来のシーケンス番号, つまり現在認証された最高のシーケンス番号 (ThTl) を超えるものを表します。

    Th+1                         *********

Th =======*****

--0--------+-----+-----0--------+-----------0--
Bl Tl Bl
(Bl+2^32) mod 2^32

Figure 1 -- Case A


Th ====**************

Th-1 ===

--0-----------------+--0--+--------------+--0--
Bl Tl Bl
(Bl+2^32) mod 2^32

Figure 2 -- Case B

B2.1. Managing and Using the Anti-Replay Window (アンチリプレイウィンドウの管理と使用)

アンチリプレイウィンドウは, 「W」が文字列の長さを定義するビット文字列と考えることができます。W = T - B + 1であり, 値として2^32 - 1を超えることはできません。最下位ビットはBに対応し, 最上位ビットはTに対応し, BlからTlまでの各シーケンス番号は対応するビットで表されます。ビットの値は, そのシーケンス番号を持つパケットが受信および認証されたかどうかを示すため, リプレイを検出して拒否できます。

Tより大きい64ビットシーケンス番号 (Seq) を持つパケットが受信および検証されると,

  • Bは (Seq - T) だけ増加します
  • (Seq - T) ビットがウィンドウの下端から削除されます
  • (Seq - T) ビットがウィンドウの上端に追加されます
  • 最上位ビットは, そのシーケンス番号を持つパケットが受信および認証されたことを示すために設定されます
  • Tと最上位ビットの間の新しいビットは, それらのシーケンス番号を持つパケットがまだ受信されていないことを示すために設定されます。
  • Tは新しいシーケンス番号に設定されます

リプレイされたパケットをチェックする際,

  • ケースAの場合: Seql >= Bl (Bl = Tl - W + 1の場合) かつ Seql <= Tlの場合, ウィンドウ内の対応するビットをチェックして, このSeqlが既に表示されているかどうかを確認します。yesの場合, パケットを拒否します。noの場合, 完全性チェックを実行します (Seqhの決定については, 以下の付録B2.2を参照してください)。

  • ケースBの場合: Seql >= Bl (Bl = Tl - W + 1の場合) または Seql <= Tlの場合, ウィンドウ内の対応するビットをチェックして, このSeqlが既に表示されているかどうかを確認します。yesの場合, パケットを拒否します。noの場合, 完全性チェックを実行します (Seqhの決定については, 以下の付録B2.2を参照してください)。

B2.2. Determining the Higher-Order Bits (Seqh) of the Sequence Number (シーケンス番号の上位ビット (Seqh) の決定)

パケットで送信されるのは「Seql」のみであるため, 受信者は各パケットが属するシーケンス番号サブスペースを推定および追跡する必要があります。つまり, Seqhの値を決定します。次の方程式は, 「通常」の条件下でSeqhを選択する方法を定義します。極端なパケット損失から回復する方法については, 付録B3を参照してください。

ケースAの場合 (図1):

  • Seql >= Bl (Bl = Tl - W + 1の場合), Seqh = Th
  • Seql < Bl (Bl = Tl - W + 1の場合), Seqh = Th + 1

ケースBの場合 (図2):

  • Seql >= Bl (Bl = Tl - W + 1の場合), Seqh = Th - 1
  • Seql < Bl (Bl = Tl - W + 1の場合), Seqh = Th

B2.3. Pseudo-Code Example (疑似コード例)

次の疑似コードは, アンチリプレイおよび完全性チェックの上記のアルゴリズムを示しています。「Seql」, 「Tl」, 「Th」, および「W」の値は32ビット符号なし整数です。算術は mod 2^32です。

If (Tl >= W - 1)                            Case A
If (Seql >= Tl - W + 1)
Seqh = Th
If (Seql <= Tl)
If (pass replay check)
If (pass integrity check)
Set bit corresponding to Seql
Pass the packet on
Else reject packet
Else reject packet
Else
If (pass integrity check)
Tl = Seql (shift bits)
Set bit corresponding to Seql
Pass the packet on
Else reject packet
Else
Seqh = Th + 1
If (pass integrity check)
Tl = Seql (shift bits)
Th = Th + 1
Set bit corresponding to Seql
Pass the packet on
Else reject packet
Else Case B
If (Seql >= Tl - W + 1)
Seqh = Th - 1
If (pass replay check)
If (pass integrity check)
Set the bit corresponding to Seql
Pass packet on
Else reject packet
Else reject packet
Else
Seqh = Th
If (Seql <= Tl)
If (pass replay check)
If (pass integrity check)
Set the bit corresponding to Seql
Pass packet on
Else reject packet
Else reject packet
Else
If (pass integrity check)
Tl = Seql (shift bits)
Set the bit corresponding to Seql
Pass packet on
Else reject packet