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“
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
tcp(7) — Linux manual pageLinux 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