Du kan inte göra ett anslutningsfritt protokoll i sig pålitligt på samma sätt som ett anslutningsorienterat protokoll som TCP är. Anslutningsfria protokoll som UDP -offerförstörning för hastighet och låg överhead. Du kan dock * lägga till * tillförlitlighetsfunktioner * på toppen * i ett anslutningsfritt protokoll. Detta handlar om att implementera mekanismer för att upptäcka och återhämta sig från dataförlust eller korruption. Detta bygger i huvudsak en pålitlig transport ovanpå en opålitlig.
Så här kan du lägga till tillförlitlighet till ett anslutningsfritt protokoll som UDP:
* checksums/CRC: Dessa används redan ofta i UDP för att upptäcka datakorruption. Om kontrollsumman inte matchar, kasserar mottagaren det skadade paketet. Detta garanterar inte leverans, men det säkerställer dataintegritet.
* Sekvensnummer: Tilldela ett unikt sekvensnummer till varje paket. Mottagaren kan sedan beställa paket korrekt, även om de kommer ur ordning. Detta hanterar ombeställning, ett vanligt problem med UDP.
* Erkännanden (ACKS): Mottagaren skickar ett bekräftelsepaket (ENGINNING (ACK) för varje korrekt mottaget och beställt paket. Om avsändaren inte får en ACK inom en timeout -period återställer den paketet. Detta är avgörande för att säkerställa tillförlitlig leverans.
* timers och tillbakadragningar: Avsändaren behöver timers för att spåra tiden sedan ett paket skickades. Om timeouten löper ut utan att ta emot en ACK, återställer avsändaren paketet. Lämpliga timeout -värden är avgörande för att undvika onödiga överföringar samtidigt som du fortfarande säkerställer i rätt tid.
* fönster (valfritt men effektivt): För att förbättra effektiviteten kan du implementera ett skjutfönster. Detta gör att avsändaren kan skicka flera paket innan du väntar på ACK:er, förbättrar genomströmningen. Att hantera fönsterstorlek och hantering av erkännanden blir emellertid mer komplex.
* Selektiva bekräftelser (säckar) (valfritt, förbättrar effektiviteten): Istället för att bara erkänna det senaste korrekt mottagna paketet, anger säckar utbudet av korrekt mottagna paket. Detta möjliggör effektivare vidarebefordran av endast förlorade paket, vilket undviker onödiga vidarebefordringar.
Exempel Implementering (konceptuell):
Föreställ dig en enkel applikation byggd ovanpå UDP för att skicka filer pålitligt.
1. avsändare: Bryter filen i paket, lägger till sekvensnummer och kontroller till varje paket. Den skickar paket och startar en timer för varje. Vid timeout återställer det paketet. Det väntar också på ACKS.
2. mottagare: Tar emot paket, kontroller kontrollsummor. Om ett paket är giltigt skickar det en ACK. Om paket är i ordning, buffrar det dem tills de saknade paketen anländer eller skickas om. Om ett paket är korrupt, kastar det det och skickar inte en ACK för det sekvensnumret.
Begränsningar:
Även med dessa tillägg kommer en "tillförlitlig UDP" -implementering inte att vara perfekt tillförlitlig inför nätverksgranskning eller fullständiga nätverksfel. Den tillagda komplexiteten introducerar också omkostnader, vilket minskar prestationsfördelen med att använda UDP i första hand. TCP tillhandahåller redan dessa funktioner naturligt och mer effektivt.
Kort sagt kan du * simulera * tillförlitlighet över UDP, men du bygger i huvudsak en rudimentär TCP ovanpå UDP. Det rekommenderas i allmänhet inte om du inte har mycket specifika skäl att undvika TCP, till exempel att du behöver mycket låg latens till bekostnad av viss tillförlitlighet.