# Nagle-Algorithmus

Der Nagle-Algorithmus (auch: Nagles Algorithmus) ist ein Algorithmus zur Verbesserung der Effizienz bei der Datenübertragung des Transmission Control Protocols (TCP). Dies wird erreicht, indem die Anzahl kleiner Datenpakete reduziert wird. Der Algorithmus ist nach John Nagle benannt, der ihn im Jahr 1984 im RFC 896 beschrieb. Mit wurde der Nagle-Algorithmus ein Internetstandard für den TCP/IP-Protokollstapel.

## Hintergrund und Motivation

In den Anfängen der Entwicklung von TCP/IP-Netzwerken waren die Datenübertragungsraten gering. John Nagle beschrieb ein potentielles Problem von TCP, das er Staukollaps nannte (englisch congestion collapse). In einem überlasteten Rechnernetz steigen die Paketumlaufzeiten, wodurch der Retransmission Timer von TCP ausgelöst werden kann, was zu einer Sendewiederholung von bereits gesendeten Paketen führt. Dadurch steigt die Last und die Paketumlaufzeit weiter, was zu weiteren Sendewiederholungen führt und den Zustand des Netzes verschlechtert.
Als einen der Problemfaktoren nannte Nagle zu viele kleine Datenpakete. Eine Anwendung, die ein Byte Nutzdaten über das Netz sendet, erzeugt durch den 40 Bytes langen Header von IPv4 und TCP einen Overhead von 4000 %. Überträgt die Anwendung viele kleine Datenpakete, wie es bei interaktiven Anwendungen üblich ist, führt dies zu einer ineffizienten Nutzung der verfügbaren Übertragungsrate.
Nagles Ziel war es, die Anzahl kleiner Datenpakete zu reduzieren, um die Übertragungseffizienz zu steigern. Sein Vorschlag war durch einen Ansatz im früheren TYMNET motiviert, bei dem der Sender die Anzahl Pakete pro Zeiteinheit limitierte, sodass mehrere kleine Pakete in einem größeren Paket konsolidiert werden konnten. Nagle schlug einen adaptiven Ansatz vor, bei dem sich die Senderate implizit aus der Paketumlaufzeit ergibt, ohne dass ein Zeitlimit implementiert werden muss.

## Funktionsweise

Der Nagle-Algorithmus fasst mehrere kleine Datenblöcke zusammen und überträgt diese konsolidiert in einem größeren Datenpaket. Dies wird erreicht, indem die zu sendenden Daten der Anwendung unter bestimmten Bedingungen in einem Puffer zwischengespeichert werden. Der Algorithmus behandelt zu sendende Daten wie folgt:
* Wenn sich aktuell kein Datenpaket in Übertragung zum Kommunikationspartner befindet, sende die Daten sofort.
* Andernfalls, puffere die Daten bis entweder:
   * ein ACK-Signal vom Kommunikationspartner empfangen wurde, das den Erhalt des zuletzt gesendeten Datenpakets bestätigt,
   * oder die Anzahl Bytes im Puffer der Maximum Segment Size entspricht, also die maximale mögliche Größe eines Datenpakets erreicht wurde.
Die Funktionsweise des Nagle-Algorithmus kann anhand eines Beispiels veranschaulicht werden: Angenommen, eine Anwendung sendet mehrere kleine Datenblöcke nacheinander an einen Empfänger. Ohne den Nagle-Algorithmus würde jeder Datenblock jeweils in einem einzelnen Datenpaket ohne Verzögerung übertragen. Mit dem Nagle-Algorithmus wird das erste Paket sofort gesendet, die nachfolgenden Datenblöcke werden hingegen im Puffer zwischengespeichert. Sobald eine Empfangsbestätigung des ersten Pakets eintrifft, werden die zu dem Zeitpunkt gesammelten Datenblöcke in einem größeren Datenpaket konsolidiert über das Netzwerk gesendet.

## Eigenschaften

Durch die Zusammenfassung von Datenpaketen reduziert der Nagle-Algorithmus den Gesamt-Overhead, der durch die Header jedes Pakets entsteht, und optimiert somit die Nutzung der verfügbaren Datenübertragungsrate im Rechnernetz. Durch die verzögerte Übertragung erhöht der Nagle-Algorithmus allerdings die Übertragungszeit. Der Nagle-Algorithmus erzwingt ein Stop-and-Wait-Verhalten und stellt einen Trade-Off zwischen Übertragungsrate und Übertragungszeit dar.
Für Anwendungen, die eine geringe Latenz voraussetzen, stellt der Nagle-Algorithmus einen Nachteil dar. Dazu zählen beispielsweise interaktive Onlinespiele, Videokonferenzen und andere Echtzeitkommunikation, die eine geringe Latenz für ein flüssiges und interaktives Nutzererlebnis benötigen. Ein anderes Beispiel ist Terminalemulation per Telnet oder Secure Shell, um die Reaktionszeit der Gegenseite auf Tastatureingaben oder bei Bildschirmausgaben zu verkürzen.
RFC 1122 fordert, dass eine Anwendung den Nagle-Algorithmus bei Bedarf deaktivieren kann. Betriebssysteme bieten daher die Möglichkeit, den Nagle-Algorithmus pro TCP-Verbindung oder systemweit zu deaktivieren. Bei Sockets unter POSIX-kompatiblen Betriebssystemen und bei Winsock unter Windows kann der Nagle-Algorithmus mit der setsockopt-Option TCP_NODELAY deaktiviert werden.