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

Game-Lag-Whitepaper › L8 Sockets und Protokolle

Nagle-Algorithmus + Delayed ACK Nagle + delayed ACK (TCP_NODELAY off)

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

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Der Nagle-Algorithmus sammelt kleine Pakete, Delayed ACK schickt die Bestätigung verzögert. Zusammen verzögern beide jede in Teilen geschriebene Nachricht um 40–200 ms.

Warum Kleine Nachrichten werden in Teilen geschrieben, ohne dass TCP_NODELAY aktiviert ist → Folge Sender wartet auf das ACK, Empfänger schickt das ACK verzögert → Auf dem Bildschirm Niedriger Ping, aber jede Aktion gleichmäßig träge: Input-Lag

Symptome
Input-Lag
Faktoren
Latenz
Wer ist betroffen
Ganzer Server, Nur ich
Wann
Immer, Bei bestimmten Aktionen
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Client-Entwicklung (Entwicklungsteam)
Aufgaben Entwicklungsteam
Server: TCP_NODELAY aktivieren, Nachrichten eines Ticks sammeln und in einem Schreibvorgang senden, sich nicht darauf verlassen, Delayed ACK beim Empfänger abzuschalten (TCP_QUICKACK unter Linux wirkt nur kurz, unter Windows ist ein Registry-Eingriff auf jedem PC nötig), denn das Spiel hat das nicht sicher unter Kontrolle. Client: TCP_NODELAY aktivieren, Nachrichten eines Frames sammeln und in einem Schreibvorgang senden.
Größenordnungen
Delayed ACK dauert unter Linux meist 40 ms (je nach Situation bis zu 200 ms). Bei Windows waren es in älteren Versionen 200 ms, in aktuellen sind es 40 ms (Standardvorlage von Windows Server 2019: 40 ms). Über Delayed ACK entscheidet das Betriebssystem des Empfängers. Sendet der Server Nachrichten bei aktivem Nagle in Teilen, kann es deshalb je nach empfangendem PC zu 40–200 ms Verzögerung kommen.
Im Graphen
Von Anfang an dauerhaft hoch · Antwortzeit auf Aktionen (RTT im Spiel)
Wo nachsehen
Im Paketmitschnitt auf dem Server (tcpdump, Wireshark) die Abstände zwischen Anfrage und Antwort prüfen, kontrollieren, ob Server- und Client-Code TCP_NODELAY aktivieren
Spricht dafür
Niedriger Ping, aber zwischen kleinen Paketen wiederholen sich Lücken von rund 40 ms (bei älteren Windows-Versionen 200 ms), die direkt nach dem Eintreffen des ACK der Gegenseite enden. Mit TCP_NODELAY verschwinden sie
Spricht dagegen
Antwortabstände ähnlich dem Ping: diese Ursache scheidet aus. Erzeugt der Spielserver seine Antworten selbst verspätet: Serververarbeitung („Rückstau in der Message-Queue“)
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)

Quellen

  1. RFC 9293: Transmission Control Protocol (TCP) IETF
    Nagle hält kleine Daten zurück, solange unbestätigte Daten unterwegs sind, muss pro Verbindung abschaltbar sein, Delayed ACK unter 0,5 s, Problem des Zusammenspiels beider
  2. include/net/tcp.h (Linux v6.12) Linux kernel
    Linux-Delayed-ACK mindestens TCP_DELACK_MIN (HZ/25 = 40 ms), höchstens TCP_DELACK_MAX (HZ/5 = 200 ms)
  3. TCP improvements in the Windows network stack (IETF 98 TCPM) Microsoft
    Standard-Timeout für Delayed ACK unter Windows auf 40 ms geändert (Ankündigung 2017)
  4. TCP Templates for Windows Server 2019 – How to tune your Windows Server Transports (Advanced users only 😉) Microsoft
    Vorlage für Server 2019: DelayedAckTimeout 40 ms, MaxSynRetransmissions 2, InitialRto 3000 ms
  5. Design issues - Sending small data segments over TCP with Winsock Microsoft
    Ältere Windows-TCP-Versionen starten beim Datenempfang einen Delayed-ACK-Timer von 200 ms, Nagle ist standardmäßig aktiv, sodass kleine Pakete auf das ACK warten, Abhilfe mit TCP_NODELAY

Verwandte Ursachen

Gleiche Schicht: L8 Sockets und Protokolle

Ursachen aus anderen Schichten mit demselben Symptom (Input-Lag)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen