NACK vs. ACK? Wann eins über das andere verwenden?


19

Persönlich habe ich nicht einmal das Gefühl, dass ACK erforderlich ist. Es ist schneller, wenn wir nur NACK (n) für die verlorenen Pakete senden, anstatt für jedes empfangene Paket eine ACK zu senden. Wann / in welchen Situationen würde man ACK über NACK und umgekehrt einsetzen?


Könnten Sie uns etwas mehr Kontext für das geben, wovon Sie sprechen? Fragen Sie allgemein oder über TCP oder?
Mike Pennington

Eine allgemeine Netzwerkfrage, die sich nicht auf TCP, UDP oder einen anderen bestimmten Bereich bezieht.
nFu9DT

Antworten:


29

Der Grund für das ACK ist, dass ein NACK einfach nicht ausreicht. Angenommen, ich sende Ihnen einen Datenstrom von X-Segmenten (der Einfachheit halber sagen wir 10).

Sie haben eine schlechte Verbindung und empfangen nur die Segmente 1, 2, 4 und 5. Ihr Computer sendet den NACK für Segment 3, merkt jedoch nicht, dass es die Segmente 6 bis 10 geben sollte, und nackt diese nicht.

Also sende ich Segment 3 erneut, aber dann glaubt mein Computer fälschlicherweise, dass die Daten erfolgreich gesendet wurden.

ACKs bieten eine gewisse Sicherheit, dass das Segment am Ziel angekommen ist.

Wenn die Anwendung die Reihenfolge der Daten und der erneuten Übertragungen verarbeiten soll, können Sie einfach ein Protokoll wie UDP verwenden (z. B. TFTP).


Gute Antwort. Aber könnten wir nicht einfach das erste Paket als spezielles Paket kennzeichnen - es würde die Anzahl der Segmente enthalten, die es senden würde.
Hari

4
Dadurch bleibt das Problem bestehen, dass der Absender nicht weiß, ob die Daten empfangen wurden. Wenn der Absender dabei keine Bestätigung erhält, muss er nur davon ausgehen, dass alle Daten empfangen wurden, auch wenn der gesamte Datenfluss verloren gegangen ist. Die ACK versichert, dass die Daten empfangen wurden.
YLearn

4

Es läuft alles auf die Verlustwahrscheinlichkeitsverteilung und das Verkehrsmuster hinaus.

Nehmen wir zum Beispiel eine typische drahtlose Verbindung mit einer konstanten Verlustrate von 10-30%. Wenn Sie jeden empfangenen Frame bestätigen (z. B. 802.11abg), erkennen Sie schnell, wenn ein Frame verloren gegangen ist, sodass Sie keine Zeit verlieren, um auf eine Zeitüberschreitung zu warten.

Wenn Sie stattdessen in NAK waren, werden Sie vom Verkehrsmuster abhängig: - Wenn Sie ein einzelnes Anforderungspaket senden und eine Antwort erwarten und diese Anforderung verloren geht, muss eine Zeitüberschreitung auftreten, die abläuft, wenn Sie keine erhalten Antworten. - Wenn Sie nur einen Paketstrom an einen größtenteils stummen Empfänger senden, ist es akzeptabel, einen NAK nur zu empfangen, wenn der Empfänger das nächste Paket empfängt. Dies bedeutet jedoch, dass der Empfänger Pakete neu ordnen muss und der Absender einen großen Rückstand an gesendeten Nachrichten nachverfolgen muss.

(Ratet mal, welche Lösung 802.11n auswählt? Beide. Der Empfänger sendet eine Bitmap variabler Länge der empfangenen Frames.)

Nehmen wir nun ein typisches Internet-Netzwerk: Sie haben einen Paketverlust von nahezu 0%, bis etwas Schlimmes passiert, und Sie haben einen Paketverlust von nahezu 100% für eine bestimmte Zeit nach einem exponentiellen Verteilungsgesetz, von einer Unterbrechung von 200 ms bis zu einer Minute und einer Sekunde Hälfte.

In einem verlustfreien Netzwerk erscheint es sinnlos, jedes Paket zu bestätigen, bis Sie den Fall betrachten, in dem die Verbindung unterbrochen wurde: Sie erhalten möglicherweise längere Zeit keine ACK oder NACK, und der Empfänger sendet in der Regel nichts, bis die Verbindung getrennt ist ist restauriert.

Wenn Sie ACK verwenden, hört der Absender auf zu senden und behält seinen Rückstand bei, bis die Verbindung wiederhergestellt ist. Wenn Sie stattdessen NACK verwenden, werden Sie möglicherweise vom Empfänger darüber informiert, dass er das Paket, das vom Rückstand des Absenders abgefallen ist, seit langer Zeit nicht mehr empfangen hat und die Verbindung im Wesentlichen nicht wiederherstellbar ist.


1

ACKs sind in Gleitfensterprotokollen nützlich. Sie ermöglichen es Sender A, zu erkennen, dass gesendete Daten von Remote B empfangen wurden. Sender A kann dann mit dem Senden der nächsten Daten fortfahren - bis sein Sendefenster voll ist (mit Daten, die an Remote gesendet wurden, aber noch nicht anerkannt).

ACKs können als wesentlich wichtiger angesehen werden als NAKs. NAKs ermöglichen einfach eine schnellere Wiederherstellung , wenn ein von A gesendetes Paket / Block von B nicht empfangen wird und B auf irgendeine Weise erkennt, dass ein Paket / Block fehlt.

Es ist durchaus machbar, ein Protokoll zu entwerfen, das eine zuverlässige Übertragung und Flusskontrolle nur mit ACK ohne NAK unterstützt (mit erneuter Übertragung durch den Sender, falls der Sender keine ACK empfängt, ein in jedem Fall erforderlicher Mechanismus zur erneuten Übertragung).


0

Eine wichtige Sache, die ich hier hinzufügen möchte, in TCP, haben wir keine Bestätigung für jedes empfangene Paket gesendet.

Die ACKs werden jedoch nur für das zuletzt empfangene Paket gesendet.

Bitte korrigieren Sie mich, wenn ich falsch liege.


1
Dies gilt bis zu einem gewissen Punkt. Beispielsweise erfordern Segmente mit nur gesetztem ACK- oder RST-Flag kein ACK. Wenn außerdem verzögerte ACKs verwendet werden, gibt es möglicherweise nicht für jedes Segment eine ACK. Im Allgemeinen muss jedoch für jedes andere Segment eine ACK gesendet werden. Viele TCP-Verbindungen verwenden jedoch keine verzögerten ACKs und senden für jedes Segment, das Daten enthält, eine ACK.
YLearn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.