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

Game-Lag-Whitepaper › L8 Sockets und Protokolle

Keepalive-Standardwert von 2 Stunden TCP keepalive defaults

Ursachen-ID sk-keepalive · Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Client-Entwicklung (Entwicklungsteam), Server-Infrastruktur (Infrastrukturteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Verschwindet die Gegenseite ohne Abschlusssignal, bemerkt TCP das erst sehr spät. Keepalive (eine TCP-Funktion, die prüft, ob eine Idle-Verbindung noch lebt) ist standardmäßig aus und beginnt selbst eingeschaltet erst nach 2 Stunden Leerlauf mit der Prüfung.

Warum Client verschwindet ohne Abschlusssignal, weil der Strom ausfällt oder die Leitung abbricht → Folge Server hält die Verbindung für lebendig (Keepalive standardmäßig 7.200 s, waren noch Daten unterwegs, ca. 15 Minuten bis zur Aufgabe der Retransmission) → Auf dem Bildschirm Geistercharakter bleibt zurück, beim Reconnect Fehler „Bereits angemeldet“

Symptome
Kein Login / Endlos-Laden, Unsichtbar / Geisterobjekte
Faktoren
Paketverlust
Wer ist betroffen
Nur ich
Wann
Nach Inaktivität, Direkt nach Login oder Wartung
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Client-Entwicklung (Entwicklungsteam), Server-Infrastruktur (Infrastrukturteam)
Aufgaben Entwicklungsteam
Server: auf Heartbeats antworten und Verbindungen nach einer festen Zeit ohne Empfang selbst aufräumen (TCP_KEEPIDLE und TCP_USER_TIMEOUT anpassen), beim Reconnect die bestehende Session per Session-Token ersetzen und fortsetzen. Client: Heartbeats auf Spielebene alle paar Sekunden bis einige Dutzend Sekunden senden (höchstens halb so lang wie das kürzeste Idle-Timeout), nach einem Abbruch automatisch neu verbinden.
Aufgaben Infrastrukturteam
Für Sockets, bei denen der Code nichts festlegt, die Kernel-Standardwerte (tcp_keepalive_time u. a.) senken (gilt nur für Sockets mit aktiviertem SO_KEEPALIVE).
Größenordnungen
Unter Linux beginnt die Prüfung standardmäßig nach 7.200 s Leerlauf. Dann werden 9 Probes im Abstand von 75 s gesendet, und bleibt jede Antwort aus, wird die Verbindung getrennt. Insgesamt sind das etwa 2 Stunden 11 Minuten. Auch Windows beginnt standardmäßig erst nach 2 Stunden Leerlauf mit der Prüfung.
Im Graphen
Nur einzelne Ausreißer · Zeit seit dem letzten Empfang pro Verbindung
Wo nachsehen
Mit ss -tnoi pro Verbindung lastrcv (ms seit dem letzten Empfang) und den Keepalive-Timer (timer:(keepalive,…)) prüfen und mit den Ablehnungen „Bereits angemeldet“ des Spielservers abgleichen
Spricht dafür
Es bleiben ESTABLISHED-Verbindungen mit lastrcv von einigen Minuten bis einigen Stunden bestehen, und der Reconnect dieses Kontos wird mit „Bereits angemeldet“ abgelehnt
Spricht dagegen
Keine lange stillen Verbindungen, trotzdem „Bereits angemeldet“: Code zum Aufräumen von Sessions im Spielserver
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)

Quellen

  1. tcp(7) — Linux manual page Linux man-pages
    Nach 7.200 s Leerlauf 9 Probes im Abstand von 75 s (ca. 11 Minuten zusätzlich), nur für Sockets mit aktiviertem SO_KEEPALIVE, TCP_KEEPIDLE, TCP_USER_TIMEOUT
  2. RFC 9293: Transmission Control Protocol (TCP) IETF
    Keepalive muss standardmäßig aus sein, das Standard-Leerlaufintervall beträgt mindestens 2 Stunden
  3. SO_KEEPALIVE socket option Microsoft
    Standard-Timeout für TCP-Keepalive unter Windows: 2 Stunden
  4. ss(8) — Linux manual page iproute2
    lastrcv bei -i (ms seit dem letzten Empfang), timer:(keepalive,…) bei -o

Verwandte Ursachen

Gleiche Schicht: L8 Sockets und Protokolle

Ursachen aus anderen Schichten mit demselben Symptom (Kein Login / Endlos-Laden)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen