Ich habe verstanden, dass beide Nagles Algorithmus deaktivieren.
Wann sollte / sollte ich nicht jeden von ihnen verwenden?
Erstens deaktivieren nicht beide den Nagle-Algorithmus.
Der Nagle-Algorithmus dient dazu, mehr kleine Netzwerkpakete im Kabel zu reduzieren. Der Algorithmus lautet: Wenn die Daten kleiner als ein Grenzwert sind (normalerweise MSS), warten Sie, bis ACK für zuvor gesendete Pakete empfangen wurde, und sammeln Sie in der Zwischenzeit Daten vom Benutzer. Senden Sie dann die gesammelten Daten.
if [ data > MSS ]
send(data)
else
wait until ACK for previously sent data and accumulate data in send buffer (data)
And after receiving the ACK send(data)
Dies hilft in Anwendungen wie Telnet. Das Warten auf die ACK kann jedoch die Latenz beim Senden von Streaming-Daten erhöhen. Wenn der Empfänger die "verzögerte ACK-Richtlinie" implementiert, führt dies zu einer vorübergehenden Deadlock-Situation. In solchen Fällen ist das Deaktivieren des Nagle-Algorithmus eine bessere Option.
Daher wird TCP_NODELAY zum Deaktivieren des Nagle-Algorithmus verwendet.
TCP_CORK sammelt aggressiv Daten. Wenn TCP_CORK in einem Socket aktiviert ist, werden keine Daten gesendet, bis der Puffer bis zu einem festen Grenzwert gefüllt ist. Ähnlich wie beim Nagle-Algorithmus werden auch Daten vom Benutzer akkumuliert, jedoch bis der Puffer bis zum Empfang von ACK bis zu einem festen Grenzwert gefüllt ist. Dies ist nützlich, wenn Sie mehrere Datenblöcke senden. Bei der Verwendung von TCP_CORK müssen Sie jedoch vorsichtiger sein.
Bis zum 2.6-Kernel schließen sich beide Optionen gegenseitig aus. Aber im späteren Kernel können beide zusammen existieren. In diesem Fall wird TCP_CORK stärker bevorzugt.
Ref:
TCP_NODELAY
Wird verwendet, um den Nagle-Algorithmus zu deaktivieren, um TCP / IP-Netzwerke zu verbessern und die Anzahl der Pakete zu verringern, indem gewartet wird, bis eine Bestätigung der zuvor gesendeten Daten empfangen wird, um die akkumulierten Pakete zu senden.
// Aus dem tcp (7) Handbuch:
TCP_CORK
(oderTCP_NOPUSH
in FreeBSD)Wenn festgelegt, senden Sie keine Teilframes aus. Alle Teilframes in der Warteschlange werden gesendet, wenn die Option erneut deaktiviert wird. Dies ist nützlich, um Headern vor dem Aufruf voranzustellen
sendfile(2)
oder um den Durchsatz zu optimieren. Wie derzeit implementiert, gibt es eine ** Obergrenze von 200 Millisekunden ** für die Zeit, für die die Ausgabe verkorkt wirdTCP_CORK
. Wenn diese Obergrenze erreicht ist, werden Daten in der Warteschlange automatisch übertragen . Diese Option kannTCP_NODELAY
nur seit Linux 2.5.71 kombiniert werden . Diese Option sollte nicht in Code verwendet werden, der portabel sein soll.quelle
Es ist eine Optimierung, also wie jede Optimierung:
Grundsätzlich besteht das Ziel darin, zu vermeiden, dass mit sendfile () und seinen Freunden mehrere Frames gesendet werden müssen, in denen ein einzelner Frame verwendet werden kann.
So senden Sie beispielsweise auf einem Webserver die Header gefolgt vom Dateiinhalt, die Header werden im Speicher zusammengestellt und die Datei wird dann direkt vom Kernel gesendet. Mit TCP_CORK können Sie die Header und den Anfang der Datei in einem einzigen Frame senden, auch mit TCP_NODELAY, da sonst der erste Block sofort gesendet wird.
quelle
TCP_CORK ist das Gegenteil von TCP_NODELAY. Ersteres erzwingt eine Verzögerung der Paketakkumulation; Letzteres deaktiviert es.
quelle
TCP_CORK
ist nicht das Gegenteil vonTCP_NODELAY
. Der Nagle-Algorithmus aggregiert Daten, während er auf eine Rückgabe-ACK wartet, die durch die letztere Option deaktiviert wird. Ersteres aggregiert Daten stattdessen basierend auf dem Pufferdruck.