2009-06-24 13 views
1

Ich habe einige Nachforschungen über Nagles Algorithmus aus Leerlauf-Neugier durchgeführt. Ich verstehe das grundlegende Konzept dahinter (TCP-Pakete enthalten eine erhebliche Menge an Overhead, vor allem, wenn es um kleine Nutzlasten geht), aber ich bin mir nicht sicher, ob ich die Implementierung durchschaue.Unklar auf Nagles Algorithmus

Ich las this article auf Wikipedia, aber ich bin immer noch unklar, wie es funktioniert. Nehmen wir das Beispiel einer Telnet-Verbindung. Die Verbindung ist hergestellt und ich fange an zu tippen. Nehmen wir an, ich tippe drei Zeichen (zB cat) und drücke Return. Jetzt reden wir cat\r\n das ist immer noch nur 5 Bytes. Ich würde denken, das würde nicht gesendet werden, bis wir genug Bytes zum Senden anstehen - und doch wird es sofort gesendet (aus einer Benutzerperspektive), da cat sofort nach Rückkehr ausgeführt wird.

Ich denke, ich habe ein grundlegendes Missverständnis hier auf, wie der Algorithmus funktioniert, speziell in Bezug auf das Bit, wo "wenn unbestätigte Daten noch in der Pipe sind, Enqueue, sonst sofort senden."

+0

Der Artikel spricht von Telnet-Sitzungen, die jedoch ein Problem sind, also würde es sofort senden. – cloudhead

Antwort

5

Die Daten werden nur sofort gesendet, wenn der Server bereits auf vorherige Nachrichten von Ihnen geantwortet hat (oder dies ist Ihr erster Kontakt in dieser Sitzung). Wenn der Server jedoch belebter und langsamer reagiert, werden die Daten vor dem Senden in eine Warteschlange mit einer maximalen Paketgröße gestellt, um zu vermeiden, dass sie mit zu vielen Paketen überflutet wird.

Ob Daten sofort oder nicht sofort gesendet werden, kann im Kontext eventuell vorhandener Nachrichten ermittelt werden.

+0

Also ich denke, Nagles Algorithmus wird nicht auf SYN/ACK-Pakete anwenden, dann - d. H. Es sendet diese ohne Verzögerung? – FreeMemory

+0

Sie können den Nagle-Algorithmus mit der Option TCP_NODELAY im Aufruf von setsockopt deaktivieren. – bill

0

Lesen Sie this post, es ist ziemlich tief und verdeutlicht eine Menge Dinge für mich.