TCP-gentransmissionen betyder at gensende pakker over netværket, som enten er gået tabt eller beskadiget. Her er retransmission en mekanisme, der bruges af protokoller som f.eks TCP at levere pålidelig kommunikation. Her betyder pålidelig kommunikation, at protokollen garanterer pakkens levering, selvom datapakken er gået tabt eller beskadiget.
java nummer til streng
Netværkene er upålidelige og garanterer ikke forsinkelsen eller gentransmissionen af de tabte eller beskadigede pakker. Netværket, der bruger en kombination af bekræftelse og gentransmission af beskadigede eller tabte pakker, tilbyder pålidelighed.
Retransmissionsmekanisme
Her betyder retransmission, at datapakkerne er gået tabt, hvilket fører til manglende anerkendelse. Denne mangel på bekræftelse udløser en timer til timeout, hvilket fører til gentransmission af datapakker. Her betyder timeren, at hvis der ikke modtages nogen bekræftelse, før timeren udløber, bliver datapakken gentransmitteret.
Lad os overveje følgende scenarier for gentransmission.
Scenarie 1: Når datapakken går tabt eller er fejlbehæftet.
I dette scenarie sendes pakken til modtageren, men der modtages ingen bekræftelse inden for denne timeoutperiode. Når timeout-perioden udløber, sendes pakken igen. Når pakken gentransmitteres, modtages bekræftelsen. Når bekræftelsen er modtaget, vil gentransmission ikke finde sted igen.
Scenarie 2: Når pakken er modtaget, men bekræftelsen er tabt.
I dette scenarie modtages pakken på den anden side, men bekræftelsen går tabt, dvs. ACK'en modtages ikke på afsendersiden. Når timeoutperioden udløber, sendes pakken igen. Der er to kopier af pakkerne på den anden side; selvom pakken er modtaget korrekt, modtages bekræftelsen ikke, så afsenderen gensender pakken. I dette tilfælde kunne gentransmissionen have været undgået, men på grund af tabet af ACK'en bliver pakken gentransmitteret.
Scenarie 3: Når den tidlige timeout indtræffer.
I dette scenarie sendes pakken, men på grund af forsinkelsen i bekræftelse eller timeout er opstået før den faktiske timeout, bliver pakken gentransmitteret. I dette tilfælde er pakken blevet sendt igen unødigt på grund af forsinkelsen i kvitteringen, eller timeout er blevet sat tidligere end den faktiske timeout.
I ovenstående scenarier kan det første scenarie ikke undgås, men de to andre scenarier kan undgås. Lad os se, hvordan vi kan undgå disse situationer.
Hvor længe skal afsenderen vente?
Afsenderen indstiller timeout-perioden for en ACK. Timeoutperioden kan være af to typer:
For at overkomme de to ovennævnte situationer, TCP indstiller timeout som en funktion af RTT (tur-retur-tid), hvor tur-retur-tid er den tid, det tager for pakken at rejse fra kilden til destinationen og derefter komme tilbage igen.
Hvordan kan vi få RTT?
RTT'en kan variere afhængigt af netværkets karakteristika, dvs. hvis netværket er overbelastet, betyder det, at RTT'en er meget høj. Vi kan estimere RTT ved blot at se ACK'erne.
Lad os se, hvordan vi kan måle RTT.
Vi vil bruge original algoritme at måle RTT.
Trin 1: Først måler vi SampleRTT for hvert segment eller ACK-par. Når afsenderen sender pakken, kender vi timeren, hvor pakken sendes, og vi kender også timeren, hvor bekræftelsen modtages. Beregn tiden mellem disse to, og det bliver SampleRTT .
Trin 2: Vi tager ikke kun én prøve. Vi vil blive ved med at tage forskellige prøver og beregne det vægtede gennemsnit af disse prøver, og dette bliver EstRTT (Estimated RTT).
java flygtigt søgeord
hvor α+ β = 1
α ligger mellem 0,8 og 0,9
β ligger mellem 0,1 og 0,2
dhl betydning
Trin 3: Timeout er indstillet baseret på EstRTT.
timeout = 2 * EstRTT.
Timeout er indstillet til at være det dobbelte af den estimerede RTT. Sådan beregnes den faktiske timeout-faktor.
En fejl i denne tilgang
Der er en fejl i den originale algoritme. Lad os overveje to scenarier.
Scenario 1.
Ovenstående diagram viser, at afsenderen sender dataene, som siges at være en original transmission. Inden for timeout-perioden modtages ingen kvittering. Så afsenderen gentransmitterer dataene. Efter gentransmission af dataene modtages bekræftelsen. Lad os antage, at der modtages en bekræftelse for den oprindelige transmission, ikke for gentransmissionen. Siden vi får anerkendelsen af den originale transmission, så SampleRTT beregnes mellem tidspunktet for den oprindelige transmission og det tidspunkt, hvor bekræftelsen modtages. Men faktisk SampleRTT skulle have været mellem tidspunktet for gentransmissionen og tidspunktet for bekræftelsen.
Scenarie 2.
Ovenstående diagram viser, at afsenderen sender den originale datapakke, som vi også får bekræftelsen for. Men bekræftelsen modtages efter gentransmission af dataene. Hvis vi antager, at bekræftelsen hører til gentransmissionen, så SampleRTT beregnes mellem tidspunktet for gentransmissionen og tidspunktet for kvitteringen.
I begge ovenstående scenarier er der en tvetydighed om ikke at vide, om bekræftelsen er for den oprindelige transmission eller for gentransmissionen.
Konklusion af ovenstående algoritme.
jdbc jdbc
- Her betyder ACK ikke at bekræfte en transmission, men faktisk bekræfter det en modtagelse af dataene.
- Hvis vi betragter det første scenarie, udføres gentransmissionen for den tabte pakke. I dette tilfælde antager vi, at ACK hører til den originale transmission, på grund af hvilken SampleRTT kommer til at være meget stor.
- Hvis vi betragter det andet scenarie, sendes to samme pakker, så der opstår dobbelthed i dette tilfælde. I dette tilfælde antager vi, at ACK hører til gentransmissionen, på grund af hvilken SampleRTT bliver meget lille.
For at overvinde ovenstående problemer er en simpel løsning givet af Karn/Partridge-algoritmen. Denne algoritme gav en simpel løsning, der indsamler prøverne sendt på én gang og ikke tager prøverne på gentransmissionstidspunktet til beregning af den estimerede RTT.
Karn/Partridge Algoritme
I de to ovennævnte scenarier sker retransmission, og vi har overvejet prøven RTT. Men denne algoritme tager ikke prøve RTT i betragtning ved gentransmission. Siden retransmissionen er sket, hvilket betyder, at der sker noget i denne tur-retur-tid, eller der kan opstå en vis overbelastning i et netværk. For at overvinde dette problem fordobler denne algoritme timeout efter hver retransmission. Denne algoritme er implementeret i TCP-netværket.
Begrænsning
Den tager ikke hensyn til variansen i RTT.
For at overvinde ovenstående begrænsning blev Jacobson/Karels-algoritmen udviklet, der introducerer variansfaktoren i RTT.
Jacobson/Karels algoritme
Denne algoritme blev udviklet for at overvinde begrænsningen af Karn/agterhøne algoritme. Den beregner forskellen mellem SampleRTT og EstimatedRTT og forstærker RTT baseret på forskellen.
Beregninger for gennemsnitlig RTT
- Først beregner vi forskelsfaktoren.
Diff = SampleRTT - EstimatedRTT
- Nu beregner vi EstimatedRTT, som vil blive beregnet på samme måde som vi gjorde ovenfor.
EstRTT = EstRTT + (δ*Diff)
- Nu beregner vi gennemsnittet af forskelsfaktoren.
Dev = Dev + δ ( |Diff| - Dev)
Her er Dev en afvigelsesfaktor, og δ er en faktor mellem 0 og 1. Den Dev er et skøn over afvigelsen fra EstRTT .
- Vi vil overveje variansen, mens vi beregner timeoutværdien.
Hvor, µ =1 og ɸ =4
Hurtig gentransmission
Den timeout-baserede strategi for retransmission er ineffektiv. TCP er en protokol med glidende vinduer, så hver gang gentransmissionen finder sted, begynder den at sende den fra den tabte pakke og frem.
Antag, at jeg sender pakkerne 0, 1, 2 og 3. Da pakke 0 og pakke 1 modtages på den anden side, går pakke 2 tabt i et netværk. Jeg har modtaget bekræftelsen af pakke 0 og pakke 1, så jeg sender to pakker mere, dvs. pakke 4 og pakke 5. Når pakke 3, 4 og 5 er sendt, vil jeg få bekræftelsen af pakke 1 som TCP-bekræftelser er kumulative, så den kvitterer op til pakken, som den har modtaget i rækkefølge. Jeg har ikke modtaget bekræftelsen af pakke 2, 3, 4 og 5 inden for timeout-perioden, så jeg gensender pakker 2, 3, 4 og 5. Da pakke 2 er tabt, men andre pakker, dvs. 3, 4 ,5 modtages på den anden side, bliver de stadig gentransmitteret på grund af denne timeout-mekanisme.
Hvordan kan denne timeout-ineffektivitet fjernes?
Den bedre løsning under et skydevindue:
Antag, at n pakke er gået tabt, men alligevel er pakkerne n+1, n+2 og så videre blevet modtaget. Modtageren modtager kontinuerligt pakkerne og sender ACK-pakkerne og siger, at modtageren stadig afventer den n'te pakke. Modtageren sender gentagne eller duplikerede bekræftelser. I ovenstående tilfælde sendes ACK af pakke 1 tre gange, da pakke 2 er gået tabt. Denne dublerede ACK-pakke er en indikation af, at den n'te pakke mangler, men de senere pakker modtages.
Ovenstående situation kan løses på følgende måder:
diskret matematik negation
- Afsenderen kan tage 'duplikerede ACK'er' som et tidligt hint om, at den n'te pakke er gået tabt, så afsenderen kan foretage retransmissionen så tidligt som muligt, dvs. afsenderen bør ikke vente, indtil timeoutet indtræffer.
- Afsenderen kan implementere en hurtig transmissionsstrategi i TCP. I en hurtig transmissionsstrategi bør afsenderen betragte de tredobbelte duplikerede ACK'er som en trigger og gentransmittere den.
TCP bruger tre duplikerede ACK'er som en trigger og udfører derefter retransmission. I ovenstående tilfælde, når tre ACK'er af pakke 1 modtages, så skal afsenderen sende den tabte pakke, dvs. pakke 2, uden at vente på, at timeout-perioden indtræffer.