Spring 2000CS 4611 Megbízható Byte-Folyam Szolgáltatás (Transmission Control Protocol TCP) Vázlat Kapcsolatlétrehozás és bontás Csúszó Ablak Hibajavító Illesztése Folyamatvezérlés (Folw Control) Adaptív Időzítő (Timeout)
Spring 2000CS 4612 Vég-Vég (End-to-End) Protokollok Az alap hálózat „legjobb szándék” szolgáltatást nyújt –üzenetek elveszhetnek –üzenetek érkezési sorrendje felcserélődhet –üzenetek több példányban is érkezhetnek –az üzenetek hossza korlátozott –az átvitel késleltetése akármilyen nagy is lehet A vég-vég szolgáltatással kapcsolatos igények –garantált üzenettovábbítás –sorrendtartó átvitel –üzenet legfeljebb egy másolatának célba juttatása –valósítsa meg tetszőleges hosszúságú üzenet átvitelét –szinkronizáció támogatása –tegye lehetővé a fogadó számára, hogy vezérelje a küldő itenzitását (flow control) –támogasson több alkalmazást hosztonként
Spring 2000CS 4613 Egyszerű Demultiplexelő (UDP) Megbízhatatlan sorrendet tévesztehtő datagram szolgáltatás Hoszt-hoszt adatátvitelt többszörösít vég-vég szintre Nincs forgalomvezérlés (flow control) Végpontot port azonosít a hoszton belül –Szerver oldalon: jól ismert portok –Lásd: /etc/services( Unix) Fej formátuma Opcionális kontrollösszeg –psuedo header + UDP header + data SrcPort DstPort Checksum Length Data 01631
Spring 2000CS 4614 TCP Áttekintése Kapcsolat-orientált Byte-folyam –alk. byteokat ír –TCP szegmenseket szállít –alk. byteokat olvas Application process Write bytes TCP Send buffer Segment Transmit segments Application process Read bytes TCP Receive buffer … …… Full duplex forgalomvezérlés: a fogadó megakadályozza, hogy a küldő elárassza a fogadót torlódásvezérlés: megakadályozza a küldőt, hogy elárassza a hálózatot
Spring 2000CS 4615 Adatkapcsolat (p2p) és Szállítás összevetése Potenciálisan több különböző hosztot kapcsol össze –kifejezett kapcsolat-felépítés és -bontás fázis szükséges Potenciálisan különlbözőek az RTT értékek –adaptív időzítő szükséges az újraküldéseknél Potenciálisan hosszú késleltetés is lehet a hálózatban –nagyon régi csomagok érkezésére is fel kell készülni Potenciálisan a fogadó pontok kapacitása különböző –alkalmazkodni kell a különböző kapacitású végpontokhoz Potenciálisan különböző a hálózat átviteli kapacitása –fel kell készülni a hálózati torlódásokra
Spring 2000CS 4616 Szegmens Formátuma
Spring 2000CS 4617 Szegmens Formátuma (folyt.) Valamely kapcsolatot a küvetkező 4-es azonosítja: –(SrcPort, SrcIPAddr, DsrPort, DstIPAddr) Csúszó ablak + forgalomvezérlés –acknowledgment, SequenceNum, AdvertisedWinow Flagek –SYN, FIN, RESET, PUSH, URG, ACK Kontroll összeg –pseudo header + TCP header + data Sender Data(SequenceNum) Acknowledgment + AdvertisedWindow Receiver
Spring 2000CS 4618 Kapcsolatkialakítás és bontás Aktív résztvevő (kliens) Passzív résztvevő (szerver) SYN, SequenceNum = x SYN + ACK, SequenceNum = y, ACK, Acknowledgment = y + 1 Acknowledgment = x + 1
Spring 2000CS 4619 Állapotátmeneti Diagram CLOSED LISTEN SYN_RCVDSYN_SENT ESTABLISHED CLOSE_WAIT LAST_ACKCLOSING TIME_WAIT FIN_WAIT_2 FIN_WAIT_1 Passive openClose Send/SYN SYN/SYN + ACK SYN + ACK/ACK SYN/SYN + ACK ACK Close/FIN FIN/ACKClose/FIN FIN/ACK ACK + FIN/ACK Timeout after two segment lifetimes FIN/ACK ACK Close/FIN Close CLOSED Active open/SYN
Spring 2000CS Módosított Csúszó Ablak Küldő oldal –LastByteAcked < = LastByteSent –LastByteSent < = LastByteWritten –tárolja a byteokat LastByteAcked és LastByteWritten között Sending application LastByteWritten TCP LastByteSentLastByteAcked Receiving application LastByteRead TCP LastByteRcvdNextByteExpected Fogadó oldal –LastByteRead < NextByteExpected –NextByteExpected < = LastByteRcvd +1 –tárolja a byteokat NextByteRead és LastByteRcvd között
Spring 2000CS Forgalomvezérlés Küldő buffer mérete: MaxSendBuffer Fogadó buffer mérete: MaxRcvBuffer Fogadó oldalon –LastByteRcvd - LastByteRead < = MaxRcvBuffer –AdvertisedWindow = MaxRcvBuffer - ( LastByteRcvd - NextByteRead ) Küldő oldalon –LastByteSent - LastByteAcked < = AdvertisedWindow –EffectiveWindow = AdvertisedWindow - ( LastByteSent - LastByteAcked ) –LastByteWritten - LastByteAcked < = MaxSendBuffer –block sender if ( LastByteWritten - LastByteAcked ) + y > MaxSenderBuffer Mindig küld ACK válaszul az érkező adat szegmensre Kitart (persist) ha AdvertisedWindow = 0
Spring 2000CS Körbefutás elleni védelem 32-bit SequenceNum SávszélességKörbefutási idő T1 (1.5 Mbps)6.4 hours Ethernet (10 Mbps)57 minutes T3 (45 Mbps)13 minutes FDDI (100 Mbps)6 minutes STS-3 (155 Mbps)4 minutes STS-12 (622 Mbps)55 seconds STS-24 (1.2 Gbps)28 seconds
Spring 2000CS Tartsuk telítetten a vonalat (Keeping the Pipe Full) 16-bit AdvertisedWindow SávszélességDelay x Bandwidth Szorzat T1 (1.5 Mbps)18KB Ethernet (10 Mbps)122KB T3 (45 Mbps)549KB FDDI (100 Mbps)1.2MB STS-3 (155 Mbps)1.8MB STS-12 (622 Mbps)7.4MB STS-24 (1.2 Gbps)14.8MB
Spring 2000CS TCP Kiterjesztések Megvalósítás: header opciókban Tároljuk az elhagyás pillanatát (timestamp) a kimenő szegmensekben Azonosítók terének kiterjesztése a 32-bit timestamp-pel (PAWS) Advertised window eltolása
Spring 2000CS Adaptív Újraküldés (Eredeti Algoritmus) Mérjük a SampleRTT minden szegmend/ ACK párra Számítsuk a súlyozott átlagos RTT-t –EstRTT = x EstimatedRTT + x SampleRTT –ahol + = 1 0.8 és 0.9 közötti érték 0.1 és 0.2 közötti érték Állítsuk be az időzítőt az EstRTT függvényében: –TimeOut = 2 x EstRTT
Spring 2000CS Karn/Partridge Algoritmus Ne vegyük figyelembe RTT-t újraküldéskor Duplázzuk meg a timeout-ot minden újraküldéskor SenderReceiver Original transmission ACK SampleR TT Retransmission SenderReceiver Original transmission ACK SampleR TT Retransmission
Spring 2000CS Jacobson/ Karels Algoritmus Az átlagos RTT új számítása Diff = sampleRTT - EstRTT EstRTT = EstRTT + ( 8 x Diff) Dev = Dev + 8 ( |Diff| - Dev) –ahol 8 factor 0 és 1 között Vegyük figyelembe a varianciát (DEV) ha beállítjuk a timeout értéket TimeOut = x EstRTT + x Dev –ahol = 1 és = 4 Megjegyzés –az algoritmus az időmérés pontosságától függ (500ms on Unix) –a pontos timeout mechanizmus fontos a torlódásvezérléshez (később)