Sie können kein verbindungsloses Protokoll von Natur aus zuverlässig machen, wie ein verbindungsorientiertes Protokoll wie TCP. Verbindungslose Protokolle wie UDP -Opferzuverlässigkeit für Geschwindigkeit und niedrige Overhead. Sie können jedoch * Zuverlässigkeitsfunktionen * oben * eines verbindungslosen Protokolls hinzufügen. Dies beinhaltet die Implementierung von Mechanismen zur Erkennung und Wiederherstellung von Datenverlust oder Korruption. Dies baut im Wesentlichen einen zuverlässigen Transport auf einem unzuverlässigen.
So können Sie einem verbindungslosen Protokoll wie UDP Zuverlässigkeit verleihen:
* Prüfsummen/CRC: Diese werden in UDP bereits häufig verwendet, um Datenbeschäftigung zu erkennen. Wenn die Prüfsumme nicht übereinstimmt, verwaltet der Empfänger das beschädigte Paket. Dies garantiert keine Lieferung, sorgt jedoch für die Datenintegrität.
* Sequenznummern: Weisen Sie jedem Paket eine eindeutige Sequenznummer zu. Der Empfänger kann dann die Pakete richtig bestellen, auch wenn er außerhalb der Reihenfolge ankommt. Dies behandelt das Neubestehen, ein häufiges Problem mit UDP.
* Danksagung (ACKs): Der Empfänger sendet für jedes empfangene und bestellte Paket ein ACK -Paket (Bestätigung). Wenn der Absender innerhalb eines Zeitüberschreitungszeitraums keinen ACK erhält, wird das Paket überholt. Dies ist entscheidend für die Gewährleistung einer zuverlässigen Lieferung.
* Timer und Wiederholungen: Der Absender benötigt Timer, um die Zeit zu verfolgen, seit ein Paket gesendet wurde. Wenn das Timeout abgibt, ohne einen ACK zu erhalten, entwickelt der Absender das Paket. Angemessene Zeitüberschreitungswerte sind wichtig, um unnötige Wiederholungen zu vermeiden und gleichzeitig die rechtzeitige Lieferung zu gewährleisten.
* Fenster (optional, aber effizient): Um die Effizienz zu verbessern, können Sie ein Gleitfenster implementieren. Auf diese Weise kann der Absender mehrere Pakete senden, bevor Sie auf ACKs warten und den Durchsatz verbessern. Die Verwaltung der Fenstergröße und der Umgangsbekämpfung wird jedoch komplexer.
* Selektive Anerkennung (Säcke) (optional verbessert die Effizienz): Anstatt das letzte korrekt empfangene Paket nur anzuerkennen, geben Säcke den Bereich der korrekt empfangenen Pakete an. Dies ermöglicht eine effizientere Übermittlung von nur verlorenen Paketen, wodurch unnötige Wiederholungen vermieden werden.
Beispielimplementierung (konzeptionell):
Stellen Sie sich eine einfache Anwendung vor, die auf UDP aufgebaut ist, um Dateien zuverlässig zu senden.
1. Absender: Zerlegt die Datei in Pakete, fügt Sequenznummern und Überprüfungen zu jedem Paket hinzu. Es sendet Pakete und startet jeweils einen Timer. Bei der Auszeit überträgt es das Paket. Es wartet auch auf ACKs.
2. Empfänger: Empfängt Pakete, Schecks. Wenn ein Paket gültig ist, sendet es einen ACK. Wenn die Pakete nicht in Ordnung sind, puffert es sie, bis die fehlenden Pakete eintreffen oder erneut übertragen werden. Wenn ein Paket korrupt ist, verengt es es und sendet keine ACK für diese Sequenznummer.
Einschränkungen:
Selbst mit diesen Ergänzungen ist eine "zuverlässige UDP" -Implementierung angesichts der Netzwerküberlastung oder vollständiger Netzwerkfehler nicht perfekt zuverlässig. Die zusätzliche Komplexität führt auch einen Overhead ein und verringert den Leistungsvorteil der Verwendung von UDP überhaupt. TCP liefert diese Funktionen bereits nativ und effizienter.
Kurz gesagt, Sie können die Zuverlässigkeit über UDP * simulieren, aber Sie bauen im Wesentlichen ein rudimentäres TCP auf UDP. Es wird im Allgemeinen nicht empfohlen, es sei denn, Sie haben sehr spezifische Gründe, TCP zu vermeiden, z.