TcpAckFrequency unter Windows konfigurieren
TcpAckFrequency beeinflusst, nach wie vielen empfangenen TCP-Segmenten Windows eine Empfangsbestätigung sendet. Der Wert kann die Verzögerung kleiner, interaktiver TCP-Übertragungen reduzieren, erhöht dabei jedoch die Anzahl der übertragenen Bestätigungspakete.
Die Einstellung erhöht weder die verfügbare Bandbreite noch die Geschwindigkeit des Internetanschlusses. Eine Verbesserung ist nur bei bestimmten TCP-Anwendungen und Netzwerkbedingungen möglich.
Verzögerte TCP-Bestätigungen
TCP verwendet verzögerte Bestätigungen, um nicht für jedes empfangene Segment ein separates Bestätigungspaket senden zu müssen. Windows sendet üblicherweise eine Bestätigung, wenn:
- ein weiteres TCP-Segment empfangen wurde oder
- innerhalb von ungefähr 200 Millisekunden kein weiteres Segment eingetroffen ist.
Dieses Verhalten reduziert den Netzwerk- und Protokollaufwand. Bei Anwendungen, die viele kleine Datenpakete austauschen und auf eine Bestätigung warten, kann dadurch jedoch zusätzliche Latenz entstehen.
Registrierungspfad
Die Einstellung muss beim tatsächlich verwendeten Netzwerkadapter eingetragen werden:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Schnittstellen-GUID}
Unterhalb von Interfaces befinden sich mehrere Schlüssel mit GUID-Bezeichnungen. Der richtige Schlüssel lässt sich anhand der dort eingetragenen IP-Adresse, des DHCP-Servers oder des Standardgateways identifizieren. Die Änderung gilt nur für die ausgewählte Netzwerkschnittstelle.
TcpAckFrequency
Name:
TcpAckFrequency
Typ:
DWORD-Wert (32-Bit)
Dokumentierter Wertebereich:
0 bis 255
Standardwert:
2
Der Standardwert bedeutet, dass Windows normalerweise nach jeweils zwei empfangenen TCP-Segmenten eine Bestätigung sendet.
Wert 1
TcpAckFrequency = 1
Mit dem Wert 1 bestätigt Windows jedes empfangene TCP-Segment unmittelbar, ohne auf ein zweites Segment zu warten. Dies kann bei bestimmten interaktiven TCP-Anwendungen die Verzögerung reduzieren, beispielsweise bei:
- älteren Online-Spielen mit vielen kleinen TCP-Paketen
- Terminal- und Fernsteuerungsanwendungen
- bestimmten Datenbankverbindungen
- selbst entwickelten TCP-Protokollen mit ungünstigem Bestätigungsverhalten
Der Wert reduziert nicht grundsätzlich den gemessenen Ping zum Server. ICMP-Ping und TCP-Bestätigungsverhalten sind unterschiedliche Vorgänge.
Wert 2
TcpAckFrequency = 2
Dies entspricht dem dokumentierten Standardverhalten. Windows bestätigt normalerweise jedes zweite empfangene TCP-Segment oder sendet eine Bestätigung nach Ablauf des verzögerten ACK-Timers. Für normale Internet-, Dateiübertragungs-, Streaming- und Arbeitsplatzsysteme ist dies grundsätzlich die sinnvolle Einstellung.
Wert 0
TcpAckFrequency = 0
Der Wert 0 ist nicht gültig und wird von Windows wie der Standardwert 2 behandelt.
TcpAckFrequency auf 1 setzen
Unterhalb der GUID des verwendeten Netzwerkadapters wird ein neuer DWORD-Wert (32-Bit) mit dem Namen TcpAckFrequency angelegt. Als Wert wird eingetragen:
1
Da der Wert bei hexadezimaler und dezimaler Eingabe identisch ist, spielt die gewählte Basis hierbei keine Rolle.
Registrierungsdatei
Die GUID muss durch die Kennung des tatsächlich verwendeten Netzwerkadapters ersetzt werden:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Schnittstellen-GUID}]
"TcpAckFrequency"=dword:00000001
Einstellung über das Windows-Terminal
Das Windows-Terminal muss als Administrator geöffnet werden. Die Schnittstellen-GUID ist entsprechend anzupassen:
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Schnittstellen-GUID}" /v TcpAckFrequency /t REG_DWORD /d 1 /f
Anschließend sollte Windows neu gestartet werden.
Mögliche Vorteile
Eine Verringerung auf 1 kann sinnvoll sein, wenn eine konkrete Anwendung durch verzögerte TCP-Bestätigungen reproduzierbar ausgebremst wird. Mögliche Auswirkungen:
- geringere Verzögerung bei kleinen TCP-Nachrichten
- schnellere Bestätigung einzelner TCP-Segmente
- weniger Wechselwirkung zwischen verzögerten ACKs und dem Nagle-Algorithmus
- verbessertes Verhalten einzelner älterer Client-Server-Anwendungen
Eine Wirkung sollte immer mit der konkreten Anwendung geprüft werden.
Mögliche Nachteile
Durch die unmittelbare Bestätigung jedes Segments werden mehr ACK-Pakete erzeugt. Mögliche Folgen:
- höherer Protokollaufwand
- mehr kleine Netzwerkpakete
- geringfügig höhere CPU- und Netzwerklast
- unter bestimmten Bedingungen geringerer Datendurchsatz
- keine messbare Verbesserung bei Anwendungen, die UDP verwenden
- keine Wirkung bei Anwendungen mit eigener Socket- und Paketsteuerung
Viele moderne Spiele verwenden für zeitkritische Daten überwiegend UDP. In diesen Fällen hat TcpAckFrequency auf den eigentlichen Spieldatenverkehr keine Wirkung.
TcpNoDelay
Im Zusammenhang mit TcpAckFrequency wird häufig zusätzlich folgender Registry-Wert empfohlen:
TcpNoDelay = 1
TCP_NODELAY deaktiviert grundsätzlich den Nagle-Algorithmus. Dieser fasst kleine ausgehende Datenblöcke zusammen, um die Anzahl kleiner TCP-Pakete zu reduzieren. Auf modernen Windows-Systemen wird dieses Verhalten normalerweise von der jeweiligen Anwendung für jeden TCP-Socket eingestellt. Eine Anwendung kann die Socketoption TCP_NODELAY selbst aktivieren oder deaktivieren.
Ein pauschaler Registry-Eintrag unter der Netzwerkschnittstelle ist für aktuelle Windows-Versionen nicht eindeutig als allgemeine Systemeinstellung dokumentiert. TcpNoDelay sollte daher nicht automatisch zusammen mit TcpAckFrequency angelegt werden.
Das Deaktivieren des Nagle-Algorithmus kann zwar Verzögerungen kleiner Nachrichten reduzieren, erhöht jedoch den Protokollaufwand und kann schlecht programmierte Anwendungen lediglich kaschieren.
TcpDelAckTicks
Der ebenfalls häufig genannte Wert lautet:
TcpDelAckTicks
Dieser Wert wurde von Microsoft für ältere Windows-Versionen dokumentiert und beeinflusste den Timer für verzögerte TCP-Bestätigungen.
Beispiel:
TcpDelAckTicks = 0
Der Wert 0 wurde insbesondere als Lösung für ein spezielles Leistungsproblem unter Windows 2000 beschrieben. Für Windows XP und Windows Server 2003 empfahl Microsoft bei demselben Problem bereits stattdessen TcpAckFrequency = 1. Für aktuelle Windows-Versionen ist TcpDelAckTicks nicht als allgemeiner Netzwerk- oder Spiele-Tweak zu empfehlen.
Bewertung der verbreiteten Kombination
Häufig wird folgende Kombination verwendet:
TcpAckFrequency = 1 TcpNoDelay = 1 TcpDelAckTicks = 1
Diese Kombination sollte nicht pauschal übernommen werden:
- TcpAckFrequency = 1 ist technisch dokumentiert, sollte aber nur gezielt getestet werden.
- TcpNoDelay = 1 ist als pauschaler Registry-Eintrag für aktuelle Windows-Versionen nicht ausreichend dokumentiert.
- TcpDelAckTicks stammt aus älteren Windows-Implementierungen und speziellen Fehlerbehebungen.
- Die Kombination erhöht nicht automatisch die Internetgeschwindigkeit.
- Bei UDP-Anwendungen bleibt sie wirkungslos.
- Zusätzliche ACK- und TCP-Pakete können den Netzwerkaufwand erhöhen.
Wann ist TcpAckFrequency sinnvoll?
Ein Test mit dem Wert 1 kann sinnvoll sein, wenn:
- die betroffene Anwendung TCP verwendet
- viele kleine Datenpakete übertragen werden
- Verzögerungen reproduzierbar durch TCP-Bestätigungen entstehen
- ein Paketmitschnitt das verzögerte ACK-Verhalten bestätigt
- vor und nach der Änderung objektiv gemessen wird
Wann ist die Änderung nicht sinnvoll?
Die Einstellung ist keine geeignete Lösung für:
- hohen Ping durch eine weit entfernte Gegenstelle
- überlastete Router oder Internetverbindungen
- WLAN-Störungen
- Paketverluste
- schlechte Serveranbindung
- DNS-Verzögerungen
- UDP-basierten Datenverkehr
- langsame Downloads aufgrund begrenzter Bandbreite
Vorhandenen Schlüssel sichern
Die Schnittstellen-GUID muss entsprechend angepasst werden:
reg export "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Schnittstellen-GUID}" "%USERPROFILE%\Desktop\TCP-Schnittstelle.reg" /y
Rückgängig machen
Um wieder das Windows-Standardverhalten zu verwenden, wird der selbst angelegte Wert gelöscht:
reg delete "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Schnittstellen-GUID}" /v TcpAckFrequency /f
Alternativ kann der Wert auf 2 gesetzt werden:
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Schnittstellen-GUID}" /v TcpAckFrequency /t REG_DWORD /d 2 /f
Anschließend sollte Windows neu gestartet werden.
Fazit
TcpAckFrequency = 1 kann bei einzelnen TCP-Anwendungen die Verzögerung kleiner Datenübertragungen reduzieren. Eine allgemeine Verringerung des Internet-Pings oder eine höhere Netzwerkgeschwindigkeit ist dadurch nicht zu erwarten. TcpNoDelay sollte vorzugsweise von der jeweiligen Anwendung über die TCP-Socketoption gesteuert werden. TcpDelAckTicks ist hauptsächlich für ältere Windows-Versionen und spezielle Fehlerfälle dokumentiert.
Für normale Systeme sollte das Windows-Standardverhalten beibehalten werden, sofern kein konkretes und messbares TCP-Latenzproblem besteht.