한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Game-Lag-Whitepaper › Grundursachen von TCP-Retransmissions

Zwischengeräte entfernen TCP-Optionen Middlebox strips TCP options

Ursachen-ID rt-sack-stripped · Hauptzuständig Netzwerk-Infrastruktur (Infrastrukturteam) · Beteiligt Server-Infrastruktur (Infrastrukturteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Entfernen oder verändern manche Firewalls und WAN-Beschleuniger TCP-Optionen, wird bei mehreren Verlusten nur ein Paket pro Round Trip wiederhergestellt, oder das Window (die Menge, die auf einmal gesendet werden darf) schrumpft, und alles wird langsamer.

Warum „TCP-Normalisierung“ in der Firewall oder alte WAN-Beschleuniger entfernen die Optionen SACK, Timestamps und Window Scaling → Folge Bei mehreren verlorenen Paketen wird pro Round Trip nur eines wiederhergestellt, das Window ist auf 64 KB begrenzt → Auf dem Bildschirm Jeder Verlust führt zu einem deutlich längeren Freeze (ohne SACK funktioniert auch RACK-TLP nicht), danach Zeitraffer. Auch große Übertragungen wie Patches sind langsam

Symptome
Freeze, Zeitraffer
Faktoren
Stillstand, Latenz
Wer ist betroffen
Bestimmte Region oder Provider, Ganzer Server
Wann
Immer
Zuständigkeit
Hauptzuständig Netzwerk-Infrastruktur (Infrastrukturteam) · Beteiligt Server-Infrastruktur (Infrastrukturteam)
Aufgaben Infrastrukturteam
Netzwerk: TCP-Normalisierung im betroffenen Gerät abschalten, auch die Sequenznummer-Randomisierung der Firewall prüfen, die Optionen im SYN per Paketmitschnitt an beiden Enden vergleichen. Server/OS: in ss -ti prüfen, ob sich Verbindungen ohne sack- und wscale-Angabe auf bestimmten Routen häufen (ts lassen Windows-PCs je nach Einstellung weg, fehlt nur ts, kann das normal sein), prüfen, ob net.ipv4.tcp_sack auf dem Server 1 ist.
Im Graphen
Von Anfang an dauerhaft hoch · Wiederherstellungen ohne SACK (TcpExtTCPRenoRecovery)
Wo nachsehen
In ss -ti pro Verbindung prüfen, ob sack und wscale angezeigt werden, in nstat das Verhältnis von TcpExtTCPRenoRecovery (Wiederherstellung ohne SACK) zu TcpExtTCPSackRecovery sowie TcpExtTCPSACKDiscard (wegen Widersprüchen verworfene SACK-Blöcke) ansehen. Auf verdächtigen Routen den SYN an beiden Enden mitschneiden und die Optionen vergleichen (in Wireshark z. B. tcp.options.sack_perm)
Spricht dafür
Nur Verbindungen über eine bestimmte Route oder ein bestimmtes Gerät haben kein sack und wscale, hoher Anteil von TcpExtTCPRenoRecovery. Die SACK-Permitted-Option aus dem SYN des Senders fehlt im SYN, der beim Empfänger ankommt. Ist die Sequenznummer-Randomisierung die Ursache, sind die Optionen vorhanden, aber TcpExtTCPSACKDiscard steigt
Spricht dagegen
sack fehlt bei allen Verbindungen: zuerst net.ipv4.tcp_sack auf dem Server prüfen. Optionen intakt und TcpExtTCPSACKDiscard unverändert: Die langsame Wiederherstellung hat einen anderen Grund („Langsame Wiederherstellung bei Thin Streams“)
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Auch wenn die Optionen erhalten bleiben, kann SACK kaputtgehen. Ändert die Sequenznummer-Randomisierung (sequence randomization) einer Firewall nur die Sequenznummern im Header und lässt die Nummern im SACK unverändert, verwirft der Sender die widersprüchlichen SACKs. Dasselbe Ergebnis hat ein tcp_sack=0, das wegen der SACK-Sicherheitslücke von 2019 auf dem Server gesetzt und dann vergessen wurde.

Quellen

  1. RFC 2018: TCP Selective Acknowledgment Options IETF
    Ohne SACK lässt sich mit kumulativen ACKs pro Round Trip nur ein verlorenes Paket erkennen
  2. RFC 7323: TCP Extensions for High Performance IETF
    Ohne Window-Scaling-Option beträgt das Window höchstens 2^16 = 64 KiB
  3. RFC 8985: The RACK-TLP Loss Detection Algorithm for TCP IETF
    RACK-TLP setzt SACK voraus
  4. net/ipv4/tcp_output.c Linux kernel
    Linux plant TLP nur bei Verbindungen mit SACK ein
  5. IP Sysctl Linux kernel
    tcp_sack standardmäßig 1 (aktiv)
  6. misc/ss.c iproute2
    ss -ti zeigt je nach genutzten Optionen ts, sack und wscale:Senden,Empfangen
  7. tcp: limit payload size of sacked skbs Linux kernel
    Commit zur Behebung der Schwachstelle in der SACK-Verarbeitung von 2019 (CVE-2019-11477)
  8. Linux and FreeBSD Kernel: Multiple TCP-based remote denial of service vulnerabilities (NFLX-2019-001) Netflix
    Als vorläufige Gegenmaßnahme wurde damals tcp_sack=0 (SACK-Verarbeitung abschalten) empfohlen
  9. SNMP counter Linux kernel
    TcpExtTCPRenoRecovery (Wiederherstellung ohne SACK begonnen) und TcpExtTCPSackRecovery (Wiederherstellung mit SACK begonnen), TcpExtTCPSACKDiscard (Zahl ungültiger SACK-Blöcke)
  10. Display Filter Reference: Transmission Control Protocol Wireshark
    Anzeigefilter tcp.options.sack_perm (SACK-Permitted-Option im SYN)

Verwandte Ursachen

Gleiche Schicht: Grundursachen von TCP-Retransmissions

Ursachen aus anderen Schichten mit demselben Symptom (Freeze)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen