B2. Anti-Replay Window (Anti-Replay-Fenster)
Der Empfänger verwaltet ein Anti-Replay-Fenster der Größe W. Dieses Fenster begrenzt, wie weit außer der Reihenfolge ein Paket sein kann, relativ zu dem Paket mit der höchsten Sequenznummer, das bisher authentifiziert wurde. (Es wird keine Anforderung für minimale oder empfohlene Größen für dieses Fenster festgelegt, über die bereits für 32-Bit-Sequenznummernfenster festgelegten 32- und 64-Paket-Werte hinaus. Es wird jedoch vorgeschlagen, dass ein Implementierer diese Werte konsistent mit der von einer Implementierung unterstützten Schnittstellengeschwindigkeit skaliert, die die ESN-Option nutzt. Außerdem geht der unten beschriebene Algorithmus davon aus, dass das Fenster nicht größer als 2^31 Pakete breit ist.) Alle 2^32 Sequenznummern, die mit einem festen Wert für die höherwertigen 32 Bits (Seqh) verbunden sind, werden im Folgenden als Sequenznummern-Unterraum bezeichnet. Die folgende Tabelle listet relevante Variablen und ihre Definitionen auf.
| Var. Name | Size (bits) (Größe in Bits) | Meaning (Bedeutung) |
|---|---|---|
| W | 32 | Größe des Fensters |
| T | 64 | Höchste bisher authentifizierte Sequenznummer, obere Grenze des Fensters |
| Tl | 32 | Niederwertige 32 Bits von T |
| Th | 32 | Höherwertige 32 Bits von T |
| B | 64 | Untere Grenze des Fensters |
| Bl | 32 | Niederwertige 32 Bits von B |
| Bh | 32 | Höherwertige 32 Bits von B |
| Seq | 64 | Sequenznummer des empfangenen Pakets |
| Seql | 32 | Niederwertige 32 Bits von Seq |
| Seqh | 32 | Höherwertige 32 Bits von Seq |
Bei der Durchführung der Anti-Replay-Überprüfung oder bei der Bestimmung, welche höherwertigen Bits zur Authentifizierung eines eingehenden Pakets verwendet werden sollen, gibt es zwei Fälle:
- Fall A: Tl >= (W - 1). In diesem Fall befindet sich das Fenster innerhalb eines Sequenznummern-Unterraums. (Siehe Abbildung 1)
- Fall B: Tl < (W - 1). In diesem Fall erstreckt sich das Fenster über zwei Sequenznummern-Unterräume. (Siehe Abbildung 2)
In den Abbildungen unten zeigt die untere Linie ("----") zwei aufeinanderfolgende Sequenznummern-Unterräume, wobei Nullen den Beginn jedes Unterraums anzeigen. Die beiden kürzeren Linien darüber zeigen die geltenden höherwertigen Bits. Das "====" repräsentiert das Fenster. Das "****" repräsentiert zukünftige Sequenznummern, d.h. diejenigen jenseits der aktuellen höchsten authentifizierten Sequenznummer (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. Verwaltung und Verwendung des Anti-Replay-Fensters
Das Anti-Replay-Fenster kann als eine Zeichenkette von Bits betrachtet werden, wobei 'W' die Länge der Zeichenkette definiert. W = T - B + 1 und kann den Wert 2^32 - 1 nicht überschreiten. Das unterste Bit entspricht B und das oberste Bit entspricht T, und jede Sequenznummer von Bl bis Tl wird durch ein entsprechendes Bit dargestellt. Der Wert des Bits zeigt an, ob ein Paket mit dieser Sequenznummer empfangen und authentifiziert wurde, sodass Wiederholungen erkannt und abgelehnt werden können.
Wenn ein Paket mit einer 64-Bit-Sequenznummer (Seq) größer als T empfangen und validiert wird,
- wird B um (Seq - T) erhöht
- werden (Seq - T) Bits vom unteren Ende des Fensters entfernt
- werden (Seq - T) Bits zum oberen Ende des Fensters hinzugefügt
- wird das oberste Bit gesetzt, um anzuzeigen, dass ein Paket mit dieser Sequenznummer empfangen und authentifiziert wurde
- werden die neuen Bits zwischen T und dem obersten Bit gesetzt, um anzuzeigen, dass noch keine Pakete mit diesen Sequenznummern empfangen wurden
- wird T auf die neue Sequenznummer gesetzt
Bei der Überprüfung auf wiederholte Pakete,
-
Unter Fall A: Wenn Seql >= Bl (wobei Bl = Tl - W + 1) UND Seql <= Tl, dann überprüfen Sie das entsprechende Bit im Fenster, um zu sehen, ob dieses Seql bereits gesehen wurde. Wenn ja, lehnen Sie das Paket ab. Wenn nein, führen Sie die Integritätsprüfung durch (siehe Anhang B2.2 unten für die Bestimmung von SeqH).
-
Unter Fall B: Wenn Seql >= Bl (wobei Bl = Tl - W + 1) ODER Seql <= Tl, dann überprüfen Sie das entsprechende Bit im Fenster, um zu sehen, ob dieses Seql bereits gesehen wurde. Wenn ja, lehnen Sie das Paket ab. Wenn nein, führen Sie die Integritätsprüfung durch (siehe Anhang B2.2 unten für die Bestimmung von Seqh).
B2.2. Bestimmung der höherwertigen Bits (Seqh) der Sequenznummer
Da nur 'Seql' mit dem Paket übertragen wird, muss der Empfänger den Sequenznummern-Unterraum deduzieren und verfolgen, in den jedes Paket fällt, d.h. den Wert von Seqh bestimmen. Die folgenden Gleichungen definieren, wie Seqh unter "normalen" Bedingungen ausgewählt wird; siehe Anhang B3 für eine Diskussion darüber, wie man sich von extremem Paketverlust erholen kann.
Unter Fall A (Abbildung 1):
- Wenn Seql >= Bl (wobei Bl = Tl - W + 1), dann Seqh = Th
- Wenn Seql < Bl (wobei Bl = Tl - W + 1), dann Seqh = Th + 1
Unter Fall B (Abbildung 2):
- Wenn Seql >= Bl (wobei Bl = Tl - W + 1), dann Seqh = Th - 1
- Wenn Seql < Bl (wobei Bl = Tl - W + 1), dann Seqh = Th
B2.3. Pseudo-Code-Beispiel
Der folgende Pseudo-Code veranschaulicht die oben genannten Algorithmen für Anti-Replay- und Integritätsprüfungen. Die Werte für 'Seql', 'Tl', 'Th' und 'W' sind 32-Bit-Ganzzahlen ohne Vorzeichen. Arithmetik ist 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