3. Protocol Details (Protokolldetails)
Dieses Kapitel beschreibt die technischen Implementierungsdetails von TCP Fast Open im Einzelnen, einschließlich Optionsformat, Zustandsmaschinenübergänge und Datenverarbeitungsregeln.
3.1. TCP-Fast-Open-Cookie-Anfrage (Cookie Request)
TCP-Optionsformat
+-------------+-------------+
| Kind=34 | Length=2 |
+-------------+-------------+
Feldbeschreibung:
- Kind: 8 Bit, Wert 34 (experimentelle Optionsnummer für TCP Fast Open)
- Length: 8 Bit, Wert 2 (zeigt an, dass keine Cookie-Daten vorhanden sind – dies ist eine Anfrage)
Client-Verhaltensanforderungen
Der Client MUSS beim Anfordern eines Cookies folgendes einhalten:
-
Erstverbindung:
- Kind=34, Length=2 in den TCP-Optionen des SYN-Pakets einschließen
- Keine Anwendungsdaten übertragen
- Drei-Wege-Handshake normal abschließen
-
Optionsplatzierung:
- TFO-Option SOLLTE nach anderen TCP-Optionen platziert werden
- Sicherstellen, dass die maximale TCP-Optionslänge (40 Byte) nicht überschritten wird
-
Wiederübertragungsbehandlung:
- Wenn das SYN-Paket erneut übertragen werden muss, MUSS die TFO-Option beibehalten werden
- Wiederübertragungszähler SOLLTE mit Standard-TCP übereinstimmen
Server-Antwortanforderungen
Der Server SOLLTE beim Empfang einer Cookie-Anfrage:
-
Cookie-Generierung:
Eingabe: ClientIP, ServerSecret, Timestamp
Ausgabe: Cookie = Encrypt(ServerSecret, ClientIP || Timestamp) -
Antwortkonstruktion:
- TFO-Cookie-Option in SYN-ACK einschließen
- Cookie-Länge beträgt typischerweise 4 bis 16 Byte
- Standard-TCP-Handshake-Ablauf fortsetzen
-
Sicherheitsüberlegungen:
- ServerSecret regelmäßig rotieren (empfohlen: alle paar Stunden)
- Cookie-Ablaufmechanismus implementieren
- Anomale Anfragemuster überwachen
3.2. TCP-Fast-Open-Cookie-Gewährung (Cookie Grant)
TCP-Optionsformat
+-------------+-------------+-------------------+
| Kind=34 | Length | Cookie (4-16 B) |
+-------------+-------------+-------------------+
Feldbeschreibung:
- Kind: 8 Bit, Wert 34
- Length: 8 Bit, Wert 6 bis 18 (2 + Cookie-Länge)
- Cookie: 4 bis 16 Byte verschlüsseltes Token
Empfohlene Cookie-Struktur
Empfohlene interne Cookie-Struktur:
Cookie = AES-128(ServerSecret, ClientIP || Timestamp || Counter)
Bestandteile:
- ClientIP: Client-IP-Adresse (4 oder 16 Byte)
- Timestamp: Unix-Zeitstempel (4 Byte)
- Counter: Anti-Replay-Zähler (optional, 4 Byte)
Wichtige Punkte der Server-Implementierung
MUSS implementiert werden:
- Cookie MUSS an die Client-IP-Adresse gebunden sein
- Cookie MUSS verifizierbar sein (mit MAC oder Verschlüsselung)
- Cookie MUSS eine Ablaufzeit haben
SOLLTE implementiert werden:
- Algorithmus mit hoher Verschlüsselungsstärke verwenden (z. B. AES-128)
- Schlüsselrotationsmechanismus implementieren
- Cookie-Nutzungsstatistiken aufzeichnen
KANN implementiert werden:
- Cookie-Versionsnummer (zur Unterstützung von Algorithmus-Upgrades)
- Zusätzliche Client-Informationen (z. B. Portnummer)
- Ratenbegrenzungsinformationen
3.3. TCP-Fast-Open-Verbindung (Fast Open)
TCP-Optionsformat und Daten
SYN-Paketstruktur:
+-------------+-------------+-------------------+
| Kind=34 | Length | Cookie (4-16 B) |
+-------------+-------------+-------------------+
TCP-Segment:
+------------------------+
| TCP-Kopf |
+------------------------+
| TCP-Optionen | (enthält TFO-Cookie)
+------------------------+
| Anwendungsdaten | (optional, max. MSS)
+------------------------+
Client-Sendeanforderungen
Der Client MUSS bei Verwendung von Fast Open:
-
Cookie einschließen:
- Gecachtes Cookie in den TCP-Optionen des SYN-Pakets einschließen
- Cookie MUSS ein gültiges Cookie sein, das vom Zielserver empfangen wurde
-
Daten übertragen:
- KANN Anwendungsdaten im SYN-Paket übertragen
- Datenlänge DARF NICHT MSS überschreiten
- Daten MÜSSEN idempotent sein (können sicher erneut übertragen werden)
-
Sequenznummern:
- SYN-Daten verwenden ISN (Initial Sequence Number)
- Datensequenznummernbereich: [ISN+1, ISN+1+DataLen)
-
Wiederübertragungsstrategie:
Erstes SYN: Cookie + Daten einschließen
↓ (Timeout)
SYN erneut übertragen:
- Option 1: Cookie + Daten erneut übertragen (empfohlen)
- Option 2: Nur SYN ohne Daten übertragen (konservativ)
Server-Empfangsanforderungen
Verarbeitungsablauf, wenn der Server ein Fast-Open-SYN empfängt:
SYN + TFO-Cookie + Daten empfangen
↓
1. Cookie validieren
├─ Cookie-Formatprüfung
├─ IP-Adressabgleichprüfung
├─ Zeitstempelvalidierung (abgelaufen?)
└─ MAC/Signaturvalidierung
↓
2. Cookie-Validierungsergebnis
├─ Gültig → Schritt 3 fortsetzen
└─ Ungültig → Daten verwerfen, Standard-SYN-ACK senden (ohne Datenantwort)
↓
3. SYN-Daten akzeptieren
├─ TCB (Transmission Control Block) erstellen
├─ Zustand: SYN-RECEIVED
├─ Daten in Empfangspuffer legen
└─ Anwendungsschicht über verfügbare Daten benachrichtigen
↓
4. SYN-ACK senden
├─ SYN und Daten bestätigen (ACK = ISN + 1 + DataLen)
├─ Optional: Antwortdaten in SYN-ACK einschließen
└─ Optional: Cookie aktualisieren (neues Cookie zurückgeben)
↓
5. ACK empfangen
└─ Verbindung wechselt in ESTABLISHED-Zustand
Datenverarbeitungsregeln
Besonderheiten von SYN-Daten:
-
Idempotenzanforderung:
- Client MUSS sicherstellen, dass SYN-Daten sicher erneut übertragen werden können
- Geeignet: HTTP-GET-Anfragen
- Nicht geeignet: Operationen mit Nebeneffekten (z. B. POST, DELETE)
-
Anwendungsschicht-Zustellung:
- Server KANN Daten im SYN-RECEIVED-Zustand an die Anwendung zustellen
- Anwendung SOLLTE Daten vorsichtig behandeln, bevor die Verbindung vollständig hergestellt ist
- Server SOLLTE Ressourcenzuweisung im SYN-RECEIVED-Zustand begrenzen
-
Datenwiederübertragung:
Szenario: SYN-Paket verloren
Client:
SYN + Cookie + Daten (1. Versuch)
↓ (Timeout)
SYN + Cookie + Daten (2. Versuch)
Server: Kann doppelte Daten empfangen
→ MUSS Deduplizierungsmechanismus implementieren (über Sequenznummern)
3.4. Cookie-Verarbeitung (Cookie Handling)
Cookie-Lebenszyklusverwaltung
Serverseitig:
# Cookie-Generierungs-Pseudocode
def generate_cookie(client_ip, server_secret, timestamp):
data = client_ip + timestamp
cookie = aes_encrypt(server_secret, data)
return cookie
def validate_cookie(cookie, client_ip, server_secret, max_age):
try:
data = aes_decrypt(server_secret, cookie)
stored_ip, timestamp = parse(data)
# IP-Adresse prüfen
if stored_ip != client_ip:
return False
# Ablaufzeit prüfen
if current_time() - timestamp > max_age:
return False
return True
except:
return False
Clientseitig:
# Cookie-Cache-Pseudocode
class TFOCookieCache:
def __init__(self):
self.cookies = {} # {(server_ip, server_port): (cookie, timestamp)}
def store(self, server_ip, server_port, cookie):
key = (server_ip, server_port)
self.cookies[key] = (cookie, current_time())
def get(self, server_ip, server_port, max_age):
key = (server_ip, server_port)
if key in self.cookies:
cookie, timestamp = self.cookies[key]
if current_time() - timestamp < max_age:
return cookie
else:
del self.cookies[key] # Abgelaufen, löschen
return None
Cookie-Aktualisierungsstrategie
Aktive Aktualisierung:
- Server KANN in jedem SYN-ACK ein neues Cookie zurückgeben
- Client SOLLTE das zuletzt empfangene Cookie verwenden
Passive Aktualisierung:
- Nach Cookie-Ablauf fordert der Client ein neues an
- Nach Cookie-Validierungsfehler fällt der Client zurück und fordert ein neues Cookie an
Sicherheitsverstärkungsmaßnahmen
Schutz vor Replay-Angriffen:
Cookie enthält Zeitstempel
→ Server lehnt abgelaufene Cookies ab
→ Cookie-Gültigkeitsdauer begrenzen (z. B. 24 Stunden)
Schutz vor IP-Spoofing:
Cookie an Client-IP gebunden
→ Clients mit unterschiedlichen IPs können nicht dasselbe Cookie verwenden
→ IP-Drift in Mobilfunknetzszenarien muss berücksichtigt werden
Schlüsselverwaltung:
Server-Schlüsselrotation
├─ Mehrere Schlüssel aktiv halten (aktueller + vorheriger)
├─ Regelmäßig neue Schlüssel generieren (z. B. alle 8 Stunden)
└─ Alte Schlüssel nur zur Validierung verwenden, nicht zur Generierung
Fehlerbehandlung
Behandlung von Cookie-Validierungsfehlern:
-
Serververhalten:
- Standard-SYN-ACK senden (SYN-Daten nicht bestätigen)
- Optional: Neues Cookie für spätere Verwendung einschließen
- Standard-TCP-Handshake fortsetzen
-
Clientverhalten:
- Fast-Open-Fehler erkennen (Daten nicht bestätigt)
- Anwendungsdaten nach ACK erneut senden
- Ungültiges Cookie löschen
- Optional: Sofort neues Cookie anfordern
Störung durch Netzwerk-Middleboxen:
Einige Firewalls oder NATs können:
- Unbekannte TCP-Optionen entfernen
- SYN-Pakete mit Daten blockieren
- Sequenznummern ändern
Client-Gegenmaßnahmen:
- Rückfallmechanismus implementieren
- Fehlgeschlagene Server aufzeichnen (wiederholte Versuche vermeiden)
- Option zum Deaktivieren von TFO bereitstellen
3.5. Zustandsmaschinenerweiterungen (State Machine Extensions)
Client-Zustandsmaschine
CLOSED
↓ (Anwendung fordert Verbindung an + Cookie vorhanden)
SYN-SENT (SYN + Cookie + Daten senden)
↓ (SYN-ACK empfangen, ACK enthält Daten)
ESTABLISHED
↓
[Fast Open erfolgreich!]
ODER
CLOSED
↓ (Anwendung fordert Verbindung an + kein Cookie)
SYN-SENT (SYN senden, Cookie anfordern)
↓ (SYN-ACK + Cookie empfangen)
ESTABLISHED
↓ (Cookie cachen)
[Für nächste Verbindung vorbereitet]
Server-Zustandsmaschine
LISTEN
↓ (SYN + gültiges Cookie + Daten empfangen)
SYN-RECEIVED (Daten akzeptieren, Anwendung benachrichtigen)
↓ (SYN-ACK senden, Daten bestätigen)
↓ (ACK empfangen)
ESTABLISHED
↓
[Fast Open erfolgreich!]
ODER
LISTEN
↓ (SYN + ungültiges/kein Cookie empfangen)
SYN-RECEIVED
↓ (SYN-ACK senden, möglicherweise Cookie einschließen)
↓ (ACK empfangen)
ESTABLISHED
↓
[Standard-TCP-Handshake]
Wichtige Zustandsübergänge
Besondere Behandlung im SYN-RECEIVED-Zustand:
- Server KANN in diesem Zustand SYN-Daten an die Anwendungsschicht zustellen
- Anwendung SOLLTE sich bewusst sein, dass die Verbindung noch nicht vollständig hergestellt ist
- Server MUSS Ressourcennutzung in diesem Zustand begrenzen (DoS-Schutz)
Nächster Abschnitt: 4. Security Considerations (Sicherheitsüberlegungen) analysiert die Sicherheitsbedrohungen und Schutzmaßnahmen von TFO im Detail.