Verwechselt mit der Neuordnung von Paketen
Ich habe ein Lehrbuch gelesen, in dem es um das TCP-Protokoll "Selective Repeat" geht:
Wir haben angenommen, dass Pakete innerhalb des Kanals zwischen Sender und Empfänger nicht neu angeordnet werden können. Dies ist im Allgemeinen eine vernünftige Annahme, wenn Sender und Empfänger über eine einzige physische Leitung verbunden sind. Wenn der die beiden verbindende „Kanal“ jedoch ein Netzwerk ist, kann es zu einer Neuordnung der Pakete kommen. In der Praxis besteht der Ansatz darin, sicherzustellen, dass eine Sequenznummer nicht wiederverwendet wird, bis der Absender "sicher" ist, dass sich zuvor gesendete Pakete mit der Sequenznummer x nicht mehr im Netzwerk befinden. Dies erfolgt unter der Annahme, dass ein Paket nicht länger als eine festgelegte maximale Zeit im Netzwerk "leben" kann.
Ich bin verwirrt und unten sind meine zwei Fragen.
Q1-Was bedeutet "der Kanal kann als im Wesentlichen Pufferung von Paketen und spontane Aussendung dieser Pakete zu jedem Zeitpunkt in der Zukunft angesehen werden." bedeuten? Warum müssen wir ein altes Paket puffern? Ist es nicht besser, wenn der Empfänger es einfach ignoriert?
Q2-Nehmen wir an, die Fenstergröße ist 2 und die verfügbare Sequenznummer ist 0,1,2,3. Der Absender sendet zuerst Paket 0, Paket 1, während Paket 0 irgendwie getroffen wird und viel Zeit benötigt, um anzukommen. Daher tritt eine Zeitüberschreitung auf. Der Absender muss Paket 0 erneut senden, aber dieses Mal kommt Paket 0 (neu) pünktlich an. Dann sendet der Sender Paket 2, Paket 3, die alle vom Empfänger empfangen werden. Und dann ist der Absender dabei, Paket 0 (neu) und Paket 1 (neu) zu senden, aber das alte Paket 0 kommt jetzt beim Empfänger an, sodass der Empfang nicht wissen konnte, dass dieses Paket das alte oder das neue Paket ist. Wie kann dieses Problem behoben werden, wenn angenommen wird, dass ein Paket nicht länger als eine festgelegte maximale Zeit im Netzwerk "leben" kann? Bedeutet dies, dass der Paket-Header die Zeit enthält, zu der er gesendet wurde?
Antworten
Was bedeutet "der Kanal kann als im Wesentlichen Pufferung von Paketen und spontane Aussendung dieser Pakete zu jedem Zeitpunkt in der Zukunft angesehen werden." bedeuten? Warum müssen wir ein altes Paket puffern? ist es nicht besser, wenn der Empfänger es einfach ignoriert?
Dies ist die Art der Warteschlange und Pufferung, die ein wesentlicher Bestandteil der Paketvermittlung ist. Empfangene Pakete werden beim Eingang in die Warteschlange gestellt / gepuffert und nach ihrer Weiterleitung aus der Warteschlange gelöscht. Eine Pufferung ist erforderlich, da sonst die Ausgangsverbindung immer frei sein muss, wenn ein Paket empfangen wird - dies ist für paketvermittelte Netzwerke nicht möglich, nur für leitungsvermittelte.
Angenommen, die Fenstergröße ist 2 und die verfügbare Sequenznummer ist 0,1,2,3.
Das Fenster zählt keine Pakete / Datagramme, sondern Bytes . Außerdem wird die Sequenznummer nur wiederholt, wenn das 32-Bit-Feld überläuft - dies geschieht erst nach 4 GiB Daten. Diese Grenze bedeutet jedoch, dass es niemals mehr als 4 Gib Daten "im Flug" geben kann, um Mehrdeutigkeiten zu vermeiden. Da das größtmögliche Fenster (nahe) 1 GiB beträgt, ist dies kein Problem.
Beachten Sie, dass der Empfänger bei einfachen, kumulativen ACKs spätere Segmente nicht selektiv ACKEN kann, wenn ein vorheriges Segment noch fehlt. Ein ACK bedeutet, dass alle vorherigen Daten empfangen wurden.
Beispielsweise sendet der Absender bei einer Segmentgröße von 1.000 und einer Fenstergröße von 10.000 die Datagramme D00-D09 (Sequenz 0-9.999). D00 und D02-D09 werden empfangen, aber D01 geht verloren. Der Empfänger bestätigt immer noch 1.000 (die nächste erwartete Datensequenz), wodurch der Sender veranlasst wird, D0 aus dem Fenster zu verschieben, auf 1.000 bis 10.999 vorzurücken und D10 zu senden.
In der Zwischenzeit hat der Empfänger entschieden, dass ein Problem vorliegt, und bestätigt erneut 1.000 , um genau das zu signalisieren. Der Absender empfängt die doppelte Bestätigung und sendet erneut D01 (widerstrebender Modus) oder alle Daten ab D01 (aggressiver Modus). Der Empfänger hat bereits D10 (10.000-10.999), also ACKs 11.000, was wiederum das Fenster des Absenders auf 11.000-20.999 verschiebt (und die noch ausstehenden Neuübertragungen für den aggressiven Modus abbricht).
(Ich habe den Prozess etwas vereinfacht, in Wirklichkeit gibt es mehr parallele Überlappungen und natürlich eine Verzögerung zwischen Senden und Empfangen.)
EDIT: Wie Jeff richtig betont hat (thx!), Ist die Unterstützung für selektive Bestätigungen (SACK) heute fast eine Selbstverständlichkeit . Mit dieser Option könnte der Empfänger auch sofort 2.000-9.999 (von D02-D09) SACKEN, damit der Absender sie nicht erneut sendet. Es könnte auch früher mit der Übertragung von 11.000 bis 20.999 beginnen.