Nagle-Algorithmus

Der Nagle-Algorithmus sammelt kleine Datenmengen im TCP-Sendepuffer, statt jede einzeln zu verschicken. Er wurde 1984 eingeführt, um Netze vor einer Flut winziger Pakete zu schützen — und ist heute vor allem als Ursache unerklärlicher Verzögerungen bekannt.

Das Problem, für das er gebaut wurde

Eine Telnet-Sitzung überträgt jeden Tastendruck sofort: ein Byte Nutzdaten in einem Paket mit 40 Byte Header aus IP und TCP. Das Verhältnis ist 1 zu 40, und bei vielen gleichzeitigen Sitzungen bestand der Netzverkehr überwiegend aus Headern.

Die Regel, die Nagle dagegen formulierte, ist knapp:

Solange Daten unterwegs sind, für die noch kein ACK eingetroffen ist, werden neue kleine Datenmengen zurückgehalten. Gesendet wird erst, wenn entweder das ACK kommt oder genug Daten für ein vollständiges Segment beisammen sind.

Damit entsteht aus vielen Tastendrücken während einer Umlaufzeit ein Paket. Je höher die Latenz, desto stärker die Zusammenfassung — ein selbstregulierendes Verhalten, das in den Netzen der 1980er Jahre genau richtig war.

Die Wechselwirkung mit Delayed ACK

Hier entsteht die Latenzfalle, und sie ist der eigentliche Grund, aus dem der Algorithmus heute diskutiert wird.

Unabhängig von Nagle verzögern Empfänger ihre Bestätigungen: Delayed ACK wartet kurz ab, ob noch mehr Daten kommen oder eigene Daten mitzusenden sind, um ACK und Antwort in einem Paket zu bündeln. Die Wartezeit liegt je nach Implementierung zwischen 40 und 200 Millisekunden.

Treffen beide Verfahren aufeinander, warten sie wechselseitig:

Sender:    hält kleine Daten zurück, bis das ACK kommt
Empfänger: hält das ACK zurück, bis mehr Daten kommen

Aufgelöst wird das erst durch den Ablauf des Delayed-ACK-Timers. Das Ergebnis ist eine Verzögerung von bis zu 200 Millisekunden — bei jedem Austausch, obwohl Leitung und Gegenstelle nichts dafür können.

Besonders unangenehm ist das Muster bei Anwendungen, die ihre Nachricht in zwei Schreibvorgängen senden, etwa Header und Body getrennt. Der erste Teil geht raus, der zweite wird zurückgehalten, und der Empfänger kann nicht antworten, weil ihm die Nachricht unvollständig vorliegt.

TCP_NODELAY

Abschalten lässt sich Nagle je Socket über die Option TCP_NODELAY. Damit geht jede Schreiboperation unmittelbar auf die Leitung.

Für interaktive Anwendungen ist das der Normalfall geworden: Spiele, Fernzugriff, RPC-Verkehr, Datenbankprotokolle, Messaging — überall dort, wo die Antwortzeit zählt und die Datenmengen klein sind, setzen die Bibliotheken diese Option von sich aus.

Wer sie setzt, übernimmt allerdings die Verantwortung für das, was Nagle verhinderte: Eine Anwendung, die in einer Schleife einzelne Bytes schreibt, erzeugt dann tatsächlich ein Paket je Byte. Die saubere Lösung ist nicht die Option allein, sondern zusammenhängend schreiben — die Nachricht im Anwendungspuffer zusammensetzen und in einem Aufruf übergeben.

Was heute davon bleibt

Der ursprüngliche Zweck ist weitgehend entfallen. Headerkompression, größere Bandbreiten und Anwendungen, die ohnehin gebündelt schreiben, haben das Problem der Ein-Byte-Pakete erledigt.

Geblieben ist der Algorithmus als Voreinstellung in jedem TCP-Stack — und als Posten auf der Prüfliste, wenn eine Anwendung konstant um 40 oder 200 Millisekunden zu langsam antwortet, ohne dass Netz oder Server ausgelastet sind. Der Wert ist das Erkennungsmerkmal: Latenzen, die genau auf diesen Stufen liegen, deuten auf Timer, nicht auf Überlast.

Abgrenzung

Bufferbloat ist das Gegenstück im Netz: Dort entsteht die Verzögerung in den Puffern der Zwischenstellen, hier im Sendepuffer des Absenders. Beide erzeugen Latenz, und beide wirken unabhängig voneinander — eine Verbindung kann an beidem gleichzeitig leiden.

Delayed ACK ist der zweite Teil der Falle und sitzt beim Empfänger. Abschalten lässt es sich dort nur systemweit, nicht je Socket, weshalb in der Praxis die Senderseite angepasst wird.

Cork ist die bewusste Umkehrung: Daten werden absichtlich gesammelt, bis die Anwendung das Paket freigibt.

Silly Window Syndrome ist ein verwandtes Problem der Fenstersteuerung, gegen das eigene Gegenmaßnahmen existieren.

Erstellt: · Überarbeitet: