TCP:n salainen ase: verkkovirtauksen hallinta ja verkon ruuhkautumisen hallinta

TCP:n luotettavuussiirto
Tunnemme TCP-protokollan luotettavana siirtoprotokollana, mutta miten se varmistaa siirron luotettavuuden?

Luotettavan tiedonsiirron saavuttamiseksi on otettava huomioon useita tekijöitä, kuten tietojen korruptoituminen, katoaminen, päällekkäisyys ja väärässä järjestyksessä olevat sirpaleet. Jos näitä ongelmia ei voida ratkaista, luotettavaa tiedonsiirtoa ei voida saavuttaa.

Siksi TCP käyttää mekanismeja, kuten järjestysnumerointia, kuittausvastausta, uudelleenlähetyksen hallintaa, yhteydenhallintaa ja ikkunanhallintaa luotettavan tiedonsiirron saavuttamiseksi.

Tässä artikkelissa keskitymme TCP:n liukuvaan ikkunaan, vuonhallintaan ja ruuhkanhallintaan. Uudelleenlähetysmekanismia käsitellään erikseen seuraavassa osiossa.

Verkkovirtauksen hallinta
Verkkovuonhallinta eli verkkoliikenteen hallinta on itse asiassa tuottajien ja kuluttajien välisen hienovaraisen suhteen ilmentymä. Olet luultavasti törmännyt tähän skenaarioon paljon työssä tai työhaastatteluissa. Jos tuottajan tuotantokapasiteetti ylittää huomattavasti kuluttajan kulutuskapasiteetin, se aiheuttaa jonon kasvun loputtomiin. Vakavammassa tapauksessa saatat tietää, että kun RabbitMQ-viestit kasaantuvat liikaa, se voi aiheuttaa koko MQ-palvelimen suorituskyvyn heikkenemistä. Sama pätee TCP:hen; jos sitä ei valvota, verkkoon laitetaan liikaa viestejä ja kuluttajat ovat ylittäneet kapasiteettinsa, kun taas tuottajat jatkavat kaksoisviestien lähettämistä, mikä vaikuttaa merkittävästi verkon suorituskykyyn.

Tämän ilmiön ratkaisemiseksi TCP tarjoaa lähettäjälle mekanismin, jolla se voi hallita lähetettävän datan määrää vastaanottajan todellisen vastaanottokapasiteetin perusteella. Tätä kutsutaan vuonohjaukseksi. Vastaanottaja ylläpitää vastaanottoikkunaa, kun taas lähettäjä ylläpitää lähetysikkunaa. On huomattava, että nämä ikkunat ovat vain yhdelle TCP-yhteydelle, eivätkä kaikki yhteydet jaa samaa ikkunaa.

TCP tarjoaa vuonhallintaa käyttämällä vastaanottoikkunan muuttujaa. Vastaanottoikkuna antaa lähettäjälle tiedon siitä, kuinka paljon välimuistitilaa on vielä käytettävissä. Lähettäjä hallitsee lähetettävän datan määrää vastaanottajan todellisen vastaanottokapasiteetin mukaan.

Vastaanottava isäntä ilmoittaa lähettäjälle vastaanotettavan datan koon, ja lähettäjä lähettää dataa tähän rajaan asti. Tämä raja on ikkunan koko, muistatko TCP-otsikon? Vastaanottoikkuna-kenttä osoittaa, kuinka monta tavua vastaanottaa.

Lähettävä isäntä lähettää säännöllisesti ikkunakoetinpaketin, jota käytetään sen havaitsemiseen, pystyykö vastaanottava isäntä vielä vastaanottamaan dataa. Kun vastaanottavan isäntäkoneen puskuri on vaarassa täyttyä, ikkunan kokoa asetetaan pienemmäksi, jotta lähettäjä voi hallita lähetettävän datan määrää.

Tässä on verkon virtauksenohjauskaavio:

Liikenteenohjaus

Verkon ruuhkautumisen hallinta
Ennen ruuhkahallinnan esittelyä on ymmärrettävä, että vastaanotto- ja lähetysikkunan lisäksi on olemassa myös ruuhkaikkuna, jota käytetään pääasiassa ratkaisemaan ongelmaa siitä, millä nopeudella lähettäjä alkaa lähettää dataa vastaanottoikkunaan. Siksi ruuhkaikkunaa ylläpitää myös TCP-lähettäjä. Tarvitsemme algoritmin, joka päättää, kuinka paljon dataa on sopivaa lähettää, koska liian pienen tai liian suuren datamäärän lähettäminen ei ole ihanteellista, mistä johtuu ruuhkaikkunan käsite.

Edellisessä verkkovuonohjauksessa vältimme lähettäjän täyttävän vastaanottajan välimuistia tiedolla, mutta emme tienneet, mitä verkossa tapahtui. Tietokoneverkot ovat tyypillisesti jaetussa ympäristössä. Tämän seurauksena verkossa voi olla ruuhkaa muiden isäntien välisen viestinnän vuoksi.

Kun verkko on ruuhkainen ja suuri määrä paketteja lähetetään jatkuvasti, se voi aiheuttaa ongelmia, kuten viiveitä ja pakettien katoamista. Tässä vaiheessa TCP lähettää tiedot uudelleen, mutta uudelleenlähetys lisää verkon kuormitusta, mikä johtaa suurempiin viiveisiin ja useampiin pakettien katoamiseen. Tämä voi johtaa noidankehään, joka vain kasvaa.

Näin ollen TCP ei voi jättää huomiotta verkossa tapahtuvaa. Kun verkko on ruuhkainen, TCP uhraa itsensä vähentämällä lähettämänsä datan määrää.

Siksi ehdotetaan ruuhkanhallintaa, jonka tarkoituksena on välttää koko verkon täyttymistä lähettäjän datalla. Lähettäjän lähettämän datan määrän säätelemiseksi TCP määrittelee käsitteen nimeltä ruuhkaikkuna. Ruuhkanhallinta-algoritmi säätää ruuhkaikkunan kokoa verkon ruuhkautumisasteen mukaan ja siten kontrolloi lähettäjän lähettämän datan määrää.

Mikä on ruuhkaikkuna? Mitä tekemistä tällä on lähetysikkunan kanssa?

Ruuhkaikkuna on lähettäjän ylläpitämä tilamuuttuja, joka määrittää lähettäjän lähettämän datan määrän. Ruuhkaikkuna muuttuu dynaamisesti verkon ruuhkatason mukaan.

Lähetysikkuna on lähettäjän ja vastaanottajan sopima ikkunan koko, joka ilmaisee vastaanottajan vastaanottaman datan määrän. Ruuhkaikkuna ja lähetysikkuna liittyvät toisiinsa; lähetysikkuna on yleensä yhtä suuri kuin ruuhkaikkunan ja vastaanottoikkunan minimi, eli swnd = min(cwnd, rwnd).

Ruuhkaikkunan cwnd arvo muuttuu seuraavasti:

Jos verkossa ei ole ruuhkaa eli uudelleenlähetyksen aikakatkaisua ei tapahdu, ruuhkaikkuna kasvaa.

Jos verkossa on ruuhkaa, ruuhkaikkuna pienenee.

Lähettäjä määrittää verkon ruuhkautumisen tarkkailemalla, vastaanotetaanko ACK-kuittauspaketti määritetyn ajan kuluessa. Jos lähettäjä ei vastaanota ACK-kuittauspakettia määritetyn ajan kuluessa, verkon katsotaan olevan ruuhkautunut.

Ruuhkaikkunan lisäksi on aika keskustella TCP:n ruuhkanhallinta-algoritmista. TCP:n ruuhkanhallinta-algoritmi koostuu kolmesta pääosasta:

Hidas aloitus:Aluksi cwnd-ruuhkaikkuna on suhteellisen pieni, ja lähettäjä kasvattaa ruuhkaikkunaa eksponentiaalisesti sopeutuakseen nopeasti verkon kapasiteettiin.
Ruuhkien välttäminen:Kun ruuhkaikkuna ylittää tietyn kynnyksen, lähettäjä kasvattaa ruuhkaikkunaa lineaarisesti hidastaakseen ruuhkaikkunan kasvuvauhtia ja välttääkseen verkon ylikuormituksen.
Nopea toipuminen:Jos ruuhkaa esiintyy, lähettäjä puolittaa ruuhkaikkunan ja siirtyy nopeaan palautumistilaan määrittääkseen verkon palautumisen sijainnin vastaanotettujen kaksoiskuittausten perusteella ja jatkaa sitten ruuhkaikkunan pidentämistä.

Hidas alku
Kun TCP-yhteys muodostetaan, ruuhkaikkuna cwnd asetetaan aluksi MSS:n (segmentin maksimikoko) minimiarvoon. Tällä tavoin alkuperäinen lähetysnopeus on noin MSS/RTT tavua sekunnissa. Todellinen käytettävissä oleva kaistanleveys on yleensä paljon suurempi kuin MSS/RTT, joten TCP haluaa löytää optimaalisen lähetysnopeuden, joka voidaan saavuttaa hitaan käynnistyksen avulla.

Hitaasti käynnistyvässä prosessissa ruuhkaikkunan cwnd arvoksi alustetaan 1 MSS, ja joka kerta, kun lähetetty pakettisegmentti kuitataan, cwnd:n arvoa kasvatetaan yhdellä MSS:llä, eli cwnd:n arvoksi tulee 2 MSS. Tämän jälkeen cwnd:n arvo kaksinkertaistetaan jokaista onnistunutta pakettisegmentin lähetystä kohden ja niin edelleen. Erityinen kasvuprosessi on esitetty seuraavassa kuvassa.

 Verkon ruuhkautumisen hallinta

Lähetysnopeus ei kuitenkaan voi aina kasvaa; kasvun on loputtava joskus. Milloin lähetysnopeuden kasvu siis loppuu? Hidas alku lopettaa tyypillisesti lähetysnopeuden kasvun yhdellä useista tavoista:

Ensimmäinen tapa on pakettien katoaminen hitaan käynnistyksen lähetysprosessin aikana. Kun pakettien katoaminen tapahtuu, TCP asettaa lähettäjän ruuhkaikkunan cwnd arvoon 1 ja käynnistää hitaan käynnistyksen prosessin uudelleen. Tässä vaiheessa otetaan käyttöön hitaan käynnistyksen kynnysarvon ssthresh käsite, jonka alkuarvo on puolet pakettien katoamista aiheuttavasta cwnd-arvosta. Toisin sanoen, kun ruuhka havaitaan, ssthresh-arvo on puolet ikkunan arvosta.

Toinen tapa on korreloida suoraan hitaan käynnistyksen kynnyksen ssthresh arvon kanssa. Koska ssthresh-arvo on puolet ikkunan arvosta ruuhkan havaitsemishetkellä, pakettien menetys voi tapahtua jokaisen kaksinkertaistumisen yhteydessä, kun cwnd on suurempi kuin ssthresh. Siksi on parasta asettaa cwnd arvoon ssthresh, jolloin TCP siirtyy ruuhkanhallintatilaan ja lopettaa hitaan käynnistyksen.

Viimeinen tapa, jolla hidas aloitus voi päättyä, on kolmen redundantin kuittauksen havaitseminen, jolloin TCP suorittaa nopean uudelleenlähetyksen ja siirtyy palautustilaan. (Jos ei ole selvää, miksi ACK-paketteja on kolme, se selitetään erikseen uudelleenlähetysmekanismin yhteydessä.)

Ruuhkien välttäminen
Kun TCP siirtyy ruuhkanhallintatilaan, cwnd asetetaan puoleen ruuhkakynnyksestä ssthresh. Tämä tarkoittaa, että cwnd-arvoa ei voida kaksinkertaistaa joka kerta, kun pakettisegmentti vastaanotetaan. Sen sijaan käytetään suhteellisen konservatiivista lähestymistapaa, jossa cwnd-arvoa kasvatetaan vain yhdellä MSS:llä (pakettisegmentin enimmäispituus) jokaisen lähetyksen valmistuttua. Esimerkiksi, vaikka 10 pakettisegmenttiä kuitattaisiin, cwnd-arvo kasvaa vain yhdellä MSS:llä. Tämä on lineaarinen kasvumalli, ja sillä on myös kasvulle yläraja. Kun pakettihäviö tapahtuu, cwnd-arvo muutetaan MSS:ksi ja ssthresh-arvo asetetaan puoleen cwnd:stä. Tai se pysäyttää MSS:n kasvun, kun vastaanotetaan kolme redundanttia ACK-vastausta. Jos kolme redundanttia kuittausta vastaanotetaan edelleen cwnd-arvon puolittamisen jälkeen, ssthresh-arvoksi tallennetaan puolet cwnd-arvosta ja siirrytään nopeaan palautumistilaan.

Nopea toipuminen
Nopean toipumisen tilassa ruuhkaikkunan cwnd arvoa kasvatetaan yhdellä MSS:llä jokaista vastaanotettua redundanttia ACK:ta kohden, eli ACK:ta, joka ei saavu peräkkäin. Tällä pyritään hyödyntämään verkossa onnistuneesti lähetettyjä pakettisegmenttejä lähetystehokkuuden parantamiseksi mahdollisimman paljon.

Kun kadonneen paketin segmentin ACK saapuu, TCP pienentää cwnd-arvoa ja siirtyy sitten ruuhkan välttämistilaan. Tämä tehdään ruuhkaikkunan koon hallitsemiseksi ja verkon ruuhkan lisäkasvun välttämiseksi.

Jos ruuhkanhallintatilan jälkeen tapahtuu aikakatkaisu, verkon tila pahenee ja TCP siirtyy ruuhkan välttämistilasta hitaan käynnistyksen tilaan. Tässä tapauksessa ruuhkaikkunan cwnd arvoksi asetetaan 1 MSS, joka on paketin segmentin enimmäispituus, ja hitaan käynnistyksen kynnysarvon ssthresh arvoksi asetetaan puolet cwnd:n arvosta. Tämän tarkoituksena on kasvattaa ruuhkaikkunan kokoa asteittain verkon toipumisen jälkeen, jotta siirtonopeus ja verkon ruuhkautumisaste tasapainottuisivat.

Yhteenveto
Luotettavana siirtoprotokollana TCP toteuttaa luotettavaa siirtoa järjestysnumeron, kuittauksen, uudelleenlähetyksen ohjauksen, yhteydenhallinnan ja ikkunanhallinnan avulla. Näistä virtauksenohjausmekanismi ohjaa lähettäjän lähettämän datan määrää vastaanottajan todellisen vastaanottokapasiteetin mukaan, mikä välttää verkon ruuhkautumisen ja suorituskyvyn heikkenemisen ongelmat. Ruuhkautumisenohjausmekanismi estää verkon ruuhkautumisen säätämällä lähettäjän lähettämän datan määrää. Ruuhkaikkunan ja lähetysikkunan käsitteet liittyvät toisiinsa, ja lähettäjän datan määrää ohjataan säätämällä ruuhkaikkunan kokoa dynaamisesti. Hidas käynnistys, ruuhkan välttäminen ja nopea toipuminen ovat TCP:n ruuhkautumisenohjausalgoritmin kolme pääosaa, jotka säätävät ruuhkaikkunan kokoa eri strategioiden avulla sopeutuakseen verkon kapasiteettiin ja ruuhka-asteeseen.

Seuraavassa osiossa tarkastelemme TCP:n uudelleenlähetysmekanismia yksityiskohtaisesti. Uudelleenlähetysmekanismi on tärkeä osa TCP:tä luotettavan tiedonsiirron saavuttamiseksi. Se varmistaa datan luotettavan siirron lähettämällä kadonneen, vioittuneen tai viivästyneen datan uudelleen. Uudelleenlähetysmekanismin toteutusperiaate ja strategia esitellään ja analysoidaan yksityiskohtaisesti seuraavassa osiossa. Pysy kuulolla!


Julkaisun aika: 24. helmikuuta 2025