TCP-ruuhkanvalvonta (RFC 2581) TCP-ruuhkanvalvonta on yksi keskeisimpiä toimintoja Internetin toiminnan varmistamiseksi Internetin ruuhkanhallinta pitkälti TCP:n varassa Pääsääntöisesti muut protokollat eivät t toistaiseksi tee ruuhkanvalvontaa Ilman ruuhkanvalvontaa Internet (tai sen osa) voi kaatua (Congestion Collapse) Ruuhkatilanteessa paketteja (segmenttejä) ) katoaa, joten ruuhkanvalvonta nivoutuu toipumiseen ja sitä kautta TCP:n suorituskykyyn Ruuhkanvalvonnan kannalta kaikki TCP data- segmenttien katoamiset tulkitaan ruuhkaksi TCP:n ruuhkanvalvonta-algoritmit: algoritmit: Slow Start ja Congestion Avoidance Fast Retransmit ja Fast Recovery 19 Ruuhkaikkuna ja vastaanottoikkuna Vastaanottoikkuna (receiver( window,rwnd) TCP-vastaanottaja ilmoittaa lähettl hettämiensä segmenttien (kuittausten) ikkunakentäss ssä (window) - paljonko saa vielä lähettää ko. segmentissä kuitatun järjestysnumeron jälkeenj TCP-vastaanottaja kasvattaa, kun sovellus vastaanottaa dataa ja pienentää ää,, kun saapuu dataa vuonvalvontaa varten Ruuhkaikkuna (congestion( window,cwnd) Kuinka paljon kuittaamatonta dataa (FlightSize)( ) saa olla lähetettynä verkkoon ruuhkanhallintaa varten: ruuhkanvalvonta-algoritmit algoritmit säätelevätcwnd:n kokoa min( min(rwnd,cwnd) ) rajoittaa lähettl hettämistä 20 Page1 1
Kuittauksen mukana ilmoitettava vastaanottoikkunan koko (rwnd( rwnd) Sovellukselle TCP-puskuriin saapunut data TCP-vastaanottopuskuri rwnd Vapaa tila Sijoita windowkentän arvoksi ACK Data IP-kerrokselta 21 TCP:n itsetahdistus (self-clocking, ack-clocking) clocking) Lähettäjä verkko vastaanottaja datasegmentit ACK Kuittaukset toimivat TCP-lähetyksen tahdistajana sekä ohjavat ruuhkaikkunan koon päivitystä Kuittaus saapuu verkosta poistunut dataa, joten voidaan lähettää sama määrä lisää 22 Page2 2
Hidas aloitus (Slow( Start) Hidasta aloitusta käytetk ytetään: Yhteyden alussa (Initial( Slow Start) Uudelleenlähetysajastimen lauettua (RTO Recovery) Jos ei ole ollut lähetettl hetettävääää vähään n aikaan (Restart( After Idle) Tarkoituksena Käynnistää TCP:n itsetahdistus Selvittää käytettävissä oleva verkkokapasiteetti Periaate Ruuhkaikkunaa kasvatetaan kunnes segmentti/segmenttejä katoaa = syntyy ruuhkaa 23 Initial Slow Start Aloitusikkunan koko 1 SMSS Nykyää ään n voi olla myös s isompi (mutta aina <= 4 SMSS) cwnd:tä kasvatetaan korkeintaan yhdellä SMSS:llä jokaista uutta dataa kuittaavaa ACKia kohden cwnd tuplaantuu per RTT Lähettäjä cwnd = 1 SMSS 1. RTT Vast.ottaja Datasegmentti = 2 SMSS 2. RTT Kuittaus = 3 SMSS = 4 SMSS 24 Page3 3
Ruuhkan välttv lttäminen (Congestion Avoidance) Kynnysarvo (Slow( Slow-StartStart Threshold, ssthresh) Aluksi iso (käyt ytännössä korkeintaan rwnd:n kokoinen) Kun cwnd ylittää ssthresh:n arvon siirrytää ään ruuhkanvältt lttämisvaiheeseen: cwnd:ta kasvatetaan jokaista uutta dataa kuittaavaa ACK:ia kohden: cwnd = cwnd + SMSS*SMSS/cwnd Additive Increase -cwnd kasvaa lineaarisesti suurin piirtein yhdellä SMSS:llä per RTT eli kun yksi ikkunallinen dataa tulee kuitatuksi 25 Nopea uudelleenlähetys (Fast Retransmit) Toistokuittaus (duplicate( ACK) Jos vastaanottaja saa vääv äärässä järjestyksessä tulevan segmentin, se kuittaa välittv littömästi samalla numerolla kuin se kuittasi viimeisen oikeassa järjestyksessj rjestyksessä saadun segmentin Ilmoittaa lähettl hettäjälle että segmetti saapui vääv äärässä järjestyksessä ja mikä on odotettu järjestysnumeroj Kun lähettl hettäjä saa 3 peräkk kkäistä toistokuittausta lähettää uudelleen ensimmäisen isen kuittaamattoman segmentin Nopean uudelleenlähetyksen jälkeen j jatketaan uudelleenlähetyst hetystä Slow-start start issa aivan kuin uudelleenlähetys hetys- ajastin olisi lauennut (TCP Tahoe) tai nopealla toipumisella (Fast( Recovery) ) (TCP Reno ja sitä uudemmat versiot) 26 Page4 4
Nopea Toipuminen (Fast Recovery) TCP Reno Usean toistokuittauksen saapuminen ilmaisee, että paketteja poistuu verkosta itse-kellotus toimii Fast Retransmit & Fast Recovery (Reno) 1. aseteta ssthresh = max (FlightSize / 2, 2*MSS) 2. Lähetä puuttuva segmentti (ensimmäinen inen kuittaamaton) ja aseta ruuhkaikkuna cwnd = ssthresh + 3*MSS 3. Kaikki vielä tulevat toistokuittaukset kasvattavat ruuhkaikkunaa yhdellä SMSS:llä 4. Lähetä (uusi) segmentti, jos cwnd:n uusi arvo (ja rwnd) sallii 5. Kun saapuu ACK, joka kuittaa uutta dataa, aseta cwnd = ssthresh 27 Fast Retransmit&Fast Recovery Sender Receiver cwnd = 6 ssthresh=3; cwnd = 6 cwnd = 7 cwnd = 8 cwnd = 3 ack = 8 ack = 9 Data, seq = 1 Data, seq = 2 Data, seq = 3 Data, seq = 4 Data, seq = 5 Data, seq = 6 Data, seq = 7 Rexmit Data, seq = 2 Data, seq = 8 Data, seq = 9 Data, seq = 10 Data, seq = 11 28 Page5 5
Uudellenlähetysajastin (RFC 2988) Ajastin käynnistetk ynnistetään, kun segmentti lähetetl hetetään Ajastimen asettaminen oikeaan arvoon on tärketätä: Liian pieni arvo: ennenaikainen ajastimen laukeaminen - Aiheuttaa turhia uudelleenlähetyksi hetyksiä,, pahimmillaan koko ikkuna! - Tarpeeton lähetysvauhdin l hidastus Liian suuri arvo: toipuminen alkaa turhan myöhää ään - Hidastaa toipumista Alkuarvo 3 s Tämän n jälkeen j estimoidaan dynaamisesti kiertoviiveen (Round-Trip, RTT) perusteella 29 Ajastimen arvon määm äärääminen Mitataan segmenttien kiertoviive (RTT( RTT) ) ja viiveen poikkeama estimaatista (DevRTT( DevRTT) Estimaattina eksponenttiaalisesti tasoitettu keskiarvo: EstimatedRTT EstimatedRTT=(1- )* EstimatedRTT + *RTT = 1/8 = 0.125 Poikkeama estimaatista: DevRTT DevRTT=(1- )* )*DevRTT + * RTT-EstimatedRTT = 0.25 Ajastimen arvo RTO = EstimatedRTT + 4* DevRTT 30 Page6 6
Ajastimen arvon määm äärääminen Miten uudelleenlähetykset pitäisi isi käsitellk sitellä? Mikä segmentti kuitattiin (alkuperäinen vai uudelleenlähetys)? Ratkaisu: Karnin algoritmi - uudelleenlähetetyille segmenteille ei mitata RTT:tä eikä niitä huomioida - ajastimen arvo kaksinkertaistetaan (Exponential( backoff) aina kun ajastin laukeaa, palautetaan kun on saatu onnistunut kuittaus Kuinka usein mitataan: Jotkut toteutukset mittaavat vain kerran RTT:ssä Toiset, esim. Linux, jokaiselle kelvolliselle segmentille Ajastin käynnistetk ynnistetään n aina uudelleen, kun saadaan uusi kuittaus todellinen arvo RTO + 1 RTT 31 Ajastimen laukeaminen ja toipuminen Jos kuittausta ei kuulu, niin uudelleenlähetysajastin laukeaa, jolloin cwnd = 1 ssthresh = max (FlightSize / 2, 2 2*SMSS) Lähetä uudelleen ensimmäinen inen kuittaamaton segmentti Jatka uudelleenlähetyst hetystä Slow Start algoritmilla kunnescwnd > ssthresh,, jolloin siirry ruuhkanvältt lttämisvaiheeseen - Kun ei enää uudelleenlähetett hetettävää,, niin jatka lähettämällä uutta dataa 32 Page7 7
RTO Recovery Sender Receiver Data, seq = 1 Data, seq = 2 Data, seq = 3 Ajastin laukeaa, jonka jälkeen hidas aloitus! cwnd = 3 RTO Data, seq = 4 Data, seq = 5 ack = 3 ack = 3 ssthresh= 2; cwnd = 1 cwnd = 2 ack = 6 Rexmit Data, seq = 3 Data, seq = 6 Data, seq = 7 33 NewReno (RFC 3782) Nopean toipumisen (Fast Recovery) perusversio (Reno) toteutettiin ensimmäisen isen kerran 1990. RFC 2581 kuvaa TCP Renon täsmt smällisen toiminnan Renon nopea toipuminen ei toimi, jos useita paketteja katoaa samasta ikkunasta nopean uudelleenlähetyksen jälkeen j joudutaan toipumisessa turvautumaan uudelleenlähetysajastimeen ja hitaaseen aloitukseen Eräs s ratkaisu on selektiiviset kuittaukset (SACK-optio) kuittauksessa ilmoitetaan, mitkä tavut saatu kunnolla (ja mitkä vielä puuttuvat välistv listä) 34 Page8 8
Nopea Toipuminen (NewReno( NewReno) Kuten Reno, mutta toipuminen voi jatkua, vaikka ikkunasta olisi kadonnut useita segmenttejä (vaihe 5) Tämän n selvittämiseksi talletetaan muuttujaan recover viimeksi lähetetty järjestysnumero, j kun siirrytää ään n nopeaan uudelleenlähetykseen (vaihe 1) Fast Retransmit & Fast Recovery (NewReno) 1.Aseteta ssthresh = max (FlightSize / 2, 2*MSS) ) ja aseta recover = suurimman tähän t n mennessä lähetetyn tavun järjestysnumeroj rjestysnumero 2.Lähet hetä puuttuva segmentti ja aseta ruuhkaikkuna cwnd = ssthresh + 3*MSS 3.Kaikki vielä tulevat toistokuittaukset kasvattavat cwnd:tä yhdellä SMSS:llä 4.Lähet hetä (uusi) segmentti, jos cwnd:n uusi arvo (ja rwnd) ) sallii 5.Kun saapuu ACK, joka kuittaa uutta dataa, Jos se kuittaa kaikki recover:in n ilmoittamaan arvoon asti => toipuminen valmis; aseta cwnd = min(ssthresh,flightsize+smss) muutoin kuittaus on johonkin aikaisempaan järjestysnumeroon j eli osittainen kuittaus (Partial ACK) 35 NewReno/Vaihe 5: Osittainen kuittaus Jos tulee osittainen kuittaus lähetetään n uudelleen ensimmäinen inen kuittaamaton segmentti, vähennetään n ruuhkaikkunaa (cwnd( cwnd) ) ACK:n kuittaamalla datamää äärällä ja lisätää ään n 1 SMSS lähetetään n uusi segmentti, jos ruuhkaikkuna ja vastaanottoikkuna tämän t n sallii jatketaan toipumisvaihetta - toistetaan vaiheet 3&4, jos saapuu toistokuittaus - toistetaan vaihe 5, jos saapuu uutta dataa kuittaava ACK 36 Page9 9
Fast Retransmit&Fast Recovery (NewReno) cwnd = 6 ssthresh=3; cwnd = 6 Sender Data, seq = 1 Data, seq = 2 Data, seq = 3 Data, seq = 4 Data, seq = 5 Data, seq = 6 Data, seq = 7 Rexmit Data, seq = 2 Receiver Partial Ack ack = 4 Rexmit Data, seq = 4 Partial Ack ack = 6 Data, seq = 6 37 NewReno: : tarpeettomien nopeiden uudelleenlähetysten välttv lttäminen Edellä esitetyn lisäksi aina aluksi (vaihe 1) tarkistetaan, etteivät t toistokuittaukset johdu aiemmista tarpeettomista uudelleenlähetyksist hetyksistä Jos johtuvat, niin Fast Retsransmit&Fast Recovery algoritmia ei suoriteta lainkaan Tarkistus perustuu Recover muuttujaan Jos toistokuittauksen numero kuittaa yli recover- muuttujaan talletetun numeron, toistokuittaukset ovat duplikaattien aiheuttamia Tätä varten myös s uudelleenlähetysajastimen lauetessa asetetaan recover -muuttuja kuten vaiheessa 1. 38 Page 10 10
Isompi aloitusikkuna (RFC 3390) TCP:n hidas aloitus aiheuttaa suorituskyky- ongelmia varsinkin yhteyksillä,, joilla on pitkä kiertoviive Myös s jos verkkokapasitteettia on runsaasti, niin ruuhkaikkunan kasvatus riittävän n isoksi kestää tarpeettoman kauan RFC 2581 sallii max 2 MSS:n kokoisen aloitusikkunan (IW) RFC 3390 päivittp ivittää aloitusikkunan (IW) koon max.. 4 MSS:ää ään IW = min(4*mss, max(2*mss, 4380 bytes)) 39 Page 11 11