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

Game-Lag-Whitepaper › L8 Sockets und Protokolle

TCP-RTO und exponentielles Backoff RTO and exponential backoff

Ursachen-ID sk-rto · Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Client-Entwicklung (Entwicklungsteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Mit jeder weiteren gescheiterten Retransmission verdoppelt sich die Wartezeit, und aus einer kurzen Leitungsunterbrechung wird ein langer Stillstand.

Warum Leitung kurz unterbrochen, auch die Retransmissions scheitern nacheinander → Folge Wartezeit bis zum nächsten Versuch verdoppelt sich jeweils, etwa 0,3 → 0,6 → 1,2 → 2,4 s (bei 100 ms Ping) → Auf dem Bildschirm Leitung 1 s unterbrochen, Spiel steht über 2 s still. Bei längerer Unterbrechung am Ende Verbindungsabbruch

Symptome
Freeze, Verbindungsabbruch
Faktoren
Paketverlust, Stillstand
Wer ist betroffen
Nur ich
Wann
Gelegentlich, zufällig, Beim Bewegen oder Zonenwechsel
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Client-Entwicklung (Entwicklungsteam)
Aufgaben Entwicklungsteam
Server: auf Heartbeats antworten und Verbindungen nach einer festen Zeit ohne Empfang selbst aufräumen (Aufgabezeitpunkt per TCP_USER_TIMEOUT verkürzen), Session per Session-Token fortsetzen, zuverlässiges UDP. Client: Heartbeats in kurzen Abständen senden und bei ausbleibender Antwort schnell neu verbinden, ohne auf die TCP-Retransmission zu warten.
Größenordnungen
Das RTO (Wartezeit bis zur Retransmission) beträgt unter Linux mindestens „Ping + 200 ms“, beim Verbindungsaufbau beginnt es bei 1 s. Mit der Standardeinstellung (tcp_retries2=15) gibt Linux die Verbindung selbst bei dauerhaft scheiternden Retransmissions erst nach etwa 15 Minuten auf.
Im Graphen
Lücke, dann alles auf einmal · RTO und Backoff pro Verbindung, abgelaufene RTOs
Wo nachsehen
Hängende Verbindung mit ss -ti auf rto (Wartezeit bis zur Retransmission in ms) und backoff (Zahl aufeinanderfolgender Abläufe) prüfen, für den ganzen Server den Zuwachs von TcpExtTCPTimeouts (abgelaufene Retransmission-Timer) in nstat -az ansehen
Spricht dafür
backoff der hängenden Verbindung ist mindestens 1, rto liegt im Sekundenbereich, und zur selben Zeit steigt TCPTimeouts
Spricht dagegen
Retransmissions enden per Fast Retransmit, kein RTO-Ablauf: Stillstand nur kurz. Dann eher „TCP-Head-of-Line-Blocking“
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)

Quellen

  1. RFC 6298: Computing TCP's Retransmission Timer IETF
    Erstes RTO 1 s, bei jedem Ablauf des Timers wird das RTO verdoppelt (exponentielles Backoff)
  2. net/ipv4/tcp_input.c (Linux v6.12) Linux kernel
    Linux-RTO = geglättete RTT + RTT-Schwankung, die Untergrenze der Schwankung ist tcp_rto_min (200 ms), daher ist das RTO mindestens RTT + 200 ms
  3. IP Sysctl Linux kernel
    tcp_rto_min_us standardmäßig 200 ms, erstes RTO einer Verbindungsanfrage 1 s, mit tcp_retries2=15 dauert es bis zur Aufgabe mindestens 924,6 s (ca. 15 Minuten)
  4. ss(8) — Linux manual page iproute2
    rto (Retransmission-Timer, ms) und backoff (Zahl der exponentiellen Backoffs) bei -i
  5. net/ipv4/proc.c (Linux v6.12) Linux kernel
    Von nstat angezeigte Zählernamen: TCPTimeouts der Gruppe TcpExt
  6. net/ipv4/tcp_timer.c (Linux v6.12) Linux kernel
    Bei jedem Ablauf des Retransmission-Timers steigt TCPTimeouts, backoff wird um eins erhöht und das RTO verdoppelt (bis zum Maximum)

Verwandte Ursachen

Gleiche Schicht: L8 Sockets und Protokolle

Ursachen aus anderen Schichten mit demselben Symptom (Freeze)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen