Je kunt een verbindingsloos protocol niet op dezelfde manier inherent betrouwbaar maken als een verbindingsgericht protocol als TCP. Verbindingsloze protocollen zoals UDP offeren betrouwbaarheid op voor snelheid en lage overhead. U kunt echter betrouwbaarheidsfuncties *toevoegen* bovenop een verbindingsloos protocol. Dit omvat het implementeren van mechanismen om gegevensverlies of -corruptie op te sporen en te herstellen. Dit bouwt in wezen een betrouwbaar transport op bovenop een onbetrouwbaar transport.
Zo kunt u betrouwbaarheid toevoegen aan een verbindingsloos protocol zoals UDP:
* Checksums/CRC: Deze worden al vaak gebruikt in UDP om gegevenscorruptie op te sporen. Als de controlesom niet overeenkomt, gooit de ontvanger het beschadigde pakket weg. Dit garandeert geen levering, maar garandeert wel de gegevensintegriteit.
* Volgnummers: Wijs aan elk pakket een uniek volgnummer toe. De ontvanger kan de pakketten dan correct bestellen, zelfs als ze in de verkeerde volgorde aankomen. Hiermee wordt het opnieuw ordenen afgehandeld, een veelvoorkomend probleem met UDP.
* Dankbetuigingen (ACK's): De ontvanger verzendt een bevestigingspakket (ACK) voor elk correct ontvangen en besteld pakket. Als de afzender binnen een time-outperiode geen ACK ontvangt, verzendt hij het pakket opnieuw. Dit is cruciaal voor een betrouwbare levering.
* Timers en hertransmissies: De afzender heeft timers nodig om de tijd bij te houden sinds een pakket is verzonden. Als de time-out verstrijkt zonder een ACK te ontvangen, verzendt de afzender het pakket opnieuw. De juiste time-outwaarden zijn essentieel om onnodige hertransmissie te voorkomen en toch een tijdige levering te garanderen.
* Vensters (optioneel maar efficiënt): Om de efficiëntie te verbeteren, kunt u een schuifraam implementeren. Hierdoor kan de afzender meerdere pakketten verzenden voordat hij op ACK's wacht, waardoor de doorvoer wordt verbeterd. Het beheren van de venstergrootte en het verwerken van bevestigingen wordt echter complexer.
* Selectieve erkenningen (SACKs) (optioneel, verbetert de efficiëntie): In plaats van alleen het laatste correct ontvangen pakket te bevestigen, specificeren SACKs het bereik van correct ontvangen pakketten. Dit maakt een efficiëntere hertransmissie van alleen verloren pakketten mogelijk, waardoor onnodige hertransmissie wordt vermeden.
Voorbeeldimplementatie (conceptueel):
Stel je een eenvoudige applicatie voor die bovenop UDP is gebouwd om bestanden betrouwbaar te verzenden.
1. Afzender: Verdeelt het bestand in pakketten, voegt volgnummers en controlesommen toe aan elk pakket. Het verzendt pakketten en start voor elk een timer. Na een time-out verzendt het het pakket opnieuw. Het wacht ook op ACK's.
2. Ontvanger: Ontvangt pakketten, controleert checksums. Als een pakket geldig is, wordt er een ACK verzonden. Als pakketten niet in orde zijn, worden deze in de buffer opgeslagen totdat de ontbrekende pakketten arriveren of opnieuw worden verzonden. Als een pakket beschadigd is, wordt het verwijderd en wordt er geen ACK voor dat volgnummer verzonden.
Beperkingen:
Zelfs met deze toevoegingen zal een "betrouwbare UDP"-implementatie niet volkomen betrouwbaar zijn in het licht van netwerkcongestie of volledige netwerkstoringen. De extra complexiteit introduceert ook overhead, waardoor het prestatievoordeel van het gebruik van UDP in de eerste plaats afneemt. TCP biedt deze functies al native en efficiënter.
Kortom, je kunt de betrouwbaarheid *simuleren* via UDP, maar je bouwt feitelijk een rudimentair TCP bovenop UDP. Het wordt over het algemeen niet aanbevolen, tenzij u zeer specifieke redenen heeft om TCP te vermijden, zoals een zeer lage latentie die ten koste gaat van enige betrouwbaarheid. |