OpenVPN over TCP: rto_min løyser ikkje blokkeringa ved byrjinga av køen
Ein ytre bytestraum leverer i rekkjefølgje, så eitt manglande segment kan stanse kvar indre flyt. Ein lengre indre timer endrar ei klokke, ikkje den avgrensinga.
Eit interaktivt skal over tunnelen frys i fleire sekund medan ein filkopi køyrer, og held så fram som om ingenting hadde hendt. Nedlastinga er det einaste med eit problem, likevel ventar skalet òg, og begge kjem seg i same augneblink. Det mønsteret er signaturen til éin påliteleg straum som ber mange samtalar, og det overlever nesten kvar justering folk prøver først.
Symptomet er verdt å lese nøye fordi det peikar på ein mekanisme og ikkje på ei innstilling: pausen er delt, så årsaka er delt, og det delte objektet er den ytre sambindinga. Alt anna i loggen ser normalt ut medan det skjer.
Symptomet: alt stansar på same tid
To indre sambindingar som stoppar saman, er leiartråden. Ei treg nedlasting og eit tregt skal er separate TCP-samtalar med separate sekvensnummer og separat overbelastningstilstand, så ein feil i den eine bør ikkje røre den andre. Når dei stoppar i takt, er det noko over dei som ordnar byta deira.
Det noko er transporten til tunnelen. I TCP-modus skriv OpenVPN dei innkapsla pakkane i éi TCP-sambinding til peeren, og kontrakten til TCP er levering i rekkjefølgje av éin einaste bytestraum. Seinare byt blir ikkje gitt til applikasjonen før dei manglande, uansett kva indre samtale dei høyrer til.
Legg merke til kva symptomet ikkje seier. Det seier ikkje at vegen er broten, at serveren er overbelasta, eller at chifferet er tregt. Dei gir andre former: jamt låg gjennomstrøyming, tidsavbrot eller feil som råkar éin retning. Ein delt pause som sluttar når eit tapt segment blir sendt på nytt, er nettopp ein ordningseffekt.
Éin ytre bytestraum, mange indre samtalar
Sjå føre deg tunnelen som ber ei nedlasting og eit skal samtidig. Eit segment av den ytre sambindinga går tapt. Dei følgjande segmenta kan nå den mottakande verten, og den mottakande TCP-stakken stadfester dei, men han kan ikkje levere dei oppover før holet er fylt. OpenVPN har derfor ingenting å lese for skalet, sjølv om byta til skalet sjølv kom for lenge sidan.
Dette er blokkering ved byrjinga av køen inne i éi sambinding, og det krev ikkje at dei to applikasjonane deler ei indre sambinding. Dei deler den ytre, og det er nok.
Andreordenseffekten gjer det verre. Ein indre avsendar som ikkje ser stadfestingar, kan sende på nytt data som det ytre laget alt prøver å levere. Den nye sendinga blir ekstra tunneltrafikk på ein veg som nettopp har prova at han kan miste segment, så attreisingsarbeidet konkurrerer med attreisinga som betyr noko.
Ingenting av dette garanterer eit samanbrot. På ein rein veg med korte rundturar og romslege køar kan ordninga vere heilt brukande i årevis. Feilen viser seg når tap, forseinking og kødjupn fell saman, og derfor klumpar rapportane seg rundt overbelasta uplinkar og mobile lenkjer i staden for rundt godt utstyrte kontor.
Kvifor ein lengre indre timer ikkje kan hjelpe
Å heve den minste gjensendingstidsgrensa på ein rute med rto_min utset timerbasert gjensending for lokalt generert TCP-trafikk som brukar ruta. Det er ein ekte knapp med ein ekte effekt, og han tar andreordensproblemet i staden for det første.
ip route show
ip route show cache 2>/dev/null | head
ss -tin dst 10.70.0.1
Det han ikkje kan, er å sleppe ytre byt ut av rekkjefølgje, attreise det manglande segmentet raskare eller få applikasjonsserveren i den andre enden til å bruke same timer. Den mottakande stakken leverer framleis i rekkjefølgje, og avsendaren i den andre enden brukar framleis sine eigne rundturmålingar.
Han slår heller ikkje av alle andre mekanismar for tapsoppretting. Der ekte tap krev timerbasert attreising, får eit større minimum applikasjonen til å vente lenger før han handlar, som er det motsette av kva ein latensfølsam sesjon treng.
Eit fast golv på tolv sekund dukkar opp i råd om emnet som om eksistensen til ein TCP-tunnel føresette det. Gjensendingstimeren som er skildra i RFC 6298, blir utleidd av målt rundtur med eksponentiell backoff, så eit konstant golv er eit policyval for ein bestemt veg og ikkje eit protokollkrav. Brukt breitt skjuler det symptomet samstundes som det endrar attreisinga for kvar flyt ruta dekkjer.
Kva tcp-nodelay gjer og ikkje gjer
Tunnelvalet som slår av Nagle-liknande bufring på transportsocketen, har eit snevert føremål: det hindrar små skrivingar i å vente på meir data før sending. Det hjelper interaktiv trafikk å unngå ei ekstra forseinking på ein elles frisk veg.
Det gjer ikkje transporten uordna, og det forkortar ikkje attreisinga etter eit tapt segment. Eit skal som stoppar for ei gjensendingstidsgrense, stoppar framleis med valet slått på, fordi valet aldri rørte ordensregelen.
Det er lett å forveksle dei to fordi begge blir skildra som latensrettingar. Den eine fjernar ei kunstig venting som bufringa innførte, den andre ville krevje å endre det transporten garanterer, og det gjer ingen socket-innstilling.
Slik samanliknar ein transportar rettferdig
Viss operatøren tillèt det og begge tenestene finst, samanlikn ein UDP-teneste og ein TCP-teneste med same arbeidsmengd over same tilgangsveg til same server. Å byte land, leverandør eller servergenerasjon mellom dei to testane fører inn ein variabel som vil dominere resultatet.
Sjå etter den delte pausen i staden for eit gjennomstrøymingstal. Fleire indre applikasjonar som stoppar saman under ytre tap, er observasjonen som identifiserer blokkering ved byrjinga av køen; eitt lågare hastigheitstal gjer det ikkje.
Autoriserte opptak på tunnelgrensesnittet og på det fysiske grensesnittet skil dei to laga reint, fordi indre og ytre gjensendingar høyrer til ulike sambindingar med ulike sekvensrom. Å sjå indre gjensendingar medan den ytre straumen viser eit hol, er det direkte beviset.
Å byte til UDP fjernar den ekstra pålitelege straumen og lèt indre TCP gjere si eiga attreising. Det lovar ikkje null tap eller låg latens, og ein metta uplink, overdimensjonerte køar eller eit MTU-problem må framleis rettast. Trafikk utanfor tunnelen blir aldri halden attende bak sekvensholet til tunnelen, sjølv om han framleis kan lide når begge vegane deler ei overbelasta lenkje, og den delte flaskehalsen fortener si eiga gransking i staden for å bli bretta inn i denne.