TDAT 2004 Datakommunikasjon med nettverksprogrammering
Oppgavenummer 26 - Tilstandsdiagram
Skrevet av Håvard Aasmo og Aner Glavovic
1. Innledning
Tilstandsdiagrammer i TCP hører til transportlageret, og blir brukt til å vise livslinjen til en forbindelse. En forbindelsesprosess går igjennom en serie av tilstander gjennom sitt livsløp. For å gjøre det enkelt, er det vanlig å dele disse opp i 3 faser, etablering av forbindelse, dataoverføring og terminering av forbindelse. En forbindelse mellom TCP-enhetene må være i orden før den går videre til neste fase. Når en forbindelse har blitt opprettet, kan dataoverføringen mellom de to TCP-enhetene foregå. Etter at dataoverføringen er fullført går den til siste tilstand som lukker alle kretsene og ressursene mellom de to enhetene.
2. Ønsket funksjonalitet
Pålitelig overføring: TCP bruker et sekvensnummer for å identifisere hver byte av data. På denne måten kan data som blir borte bli gjenoppbygget dersom packet loss skulle oppstå under overføringen. Pålitelighet oppnås ved at senderen oppdager tapt data gjennom RTO og DupAcks, og sender den på nytt. Selvom tapt data blir gjensendt er det likevel andre ting som kan forårsake skade når dataoverføringen pågår. Det hender en sjelden gang at en hacker greier å gjette sekvensnummeret, og kan dermed forfalske pakkene som blir sendt til mottakeren. Dette kan igjen bli forhindret ved at senderen konfigurerer ruteren eller brannmuren til å ikke ta inn pakker fra en ukjent IP-adresse.
Feilfri dataoverføring: For å sikre at pakker ikke er korrupte og at de kommer til sine rette destinasjoner, bruker TCP feilretting og datastrømteknikker til dette.
Flytkontroll: Hensikten med flytkontroll er å sikre pålitelig overføring. TCP bruker noe som heter «sliding window protocol» for akkurat dette. Sliding windowfungerer ved at mottakeren kontinuerlig gir beskjed til senderen hvor mye data som kan bli sendt. Når mottakerens buffer er fylt, blir det sendt en beskjed om å stoppe dataoverføringen slik at dataen som har blitt sendt kan behandles.
Metningskontroll: Hensikten med metningskontrollen i TCP er å oppnå så høy ytelse som mulig, uten at det skulle oppstå trafikkforstoppelse. For dette blir det brukt en rekke mekanismer, som blant annet passer på at raten dataen blir sendt med, holder seg under det som ville forårsaket forstoppelse.
3. Virkemåter
En TCP-forbindelse kan beskrives som en endelig tilstandsmaskin med 3 hovedfaser; opprettelse av forbindelse, dataoverføring og avslutning av forbindelse. I hver av disse fasene har vi også mindre faser. Overgang mellom faser skjer ved at de aktuelle enhetene sender meldinger mellom hverandre. Kortfattet så har vi 3 forskjellige meldinger som brukes:
SYN: (synchronized) melding som brukes når forbindelsen skal opprettes.
FIN: (finish) Brukes når forbindelsen skal avsluttes.
ACK: (acknowledment) Brukes som til å bekrefte en SYN- eller FIN-melding.
Opprette forbindelse
Enhver TCP-forbindelse begynner in en lukket (CLOSED) tilstand.
For å opprette en forbindelse brukes et treveis håndtrykk.
CLOSED | Standard tilstand som alle forbindelser starter i. Representerer at det ikke er noen forbindelse mellom den aktuelle enhetene, og er derfor en ”fiktiv” tilstand. |
LISTEN | Enheten venter på en SYN-meding fra en klient. Det er vanligvis servere som er i denne tilstanden. |
SYN-SENT | Enhetene har sendt en SYN-melding og venter på svar fra en annen enhet (vanligvis en server). |
SYN-RECIEVED | Enheten har både sendt og fått en SYN-melding fra den andre enheten. Venter på en ACK-melding for å gå videre til ESTABLISHED. |
Dataoverføring
Her er begge enhetene (vanligvis server og klient) i en ESTABLISHED tilstand. Her kan data sendes fritt fram og tilbake mellom enhetene. Denne tilstanden vil holdes helt til forbindelsen avsluttes.
Hvis en enhet vil avslutte forbindelsen sendes en FIN-melding og enhetene går over til FIN-WAIT-1.
Hvis en enhet mottar en FIN-melding, vil den sende en ACK-melding og gå til CLOSE-WAIT.
Avslutte forbindelse
Startes når minst en av enhetene vil avslutte forbindelsen. Her brukes et fireveis håndtrykk, der hver enhet stenger forbindelsen uavhengig av den andre. Dette gjør at en TCP-forbindelse kan være ”halvveis” åpen, der en enhet har stengt forbindelsen mens den andre ikke har det.
CLOSE-WAIT | Enheten har mottatt en FIN-melding og venter nå på at den lokale brukeren vil bekrefte denne meldingen. |
LAST-ACK | Enheten har nå fått en FIN-melding og bekreftet denne med en ACK-melding. Nå venter den bekreftelse (ACK) fra den andre enheten. Når det får det vil den gå til CLOSED. |
FIN-WAIT-1 | Enheten venter på en ACK-melding som den selv har sendt, eller på en FIN-melding fra den andre enheten. |
FIN-WAIT-2 | Enhetene har fått en bekreftelse (ACK) på at den vil avslutte forbindelsen og venter på en FIN-melding fra den andre enheten. Når den får det vil den gå videre til TIME-WAIT. |
CLOSING | Enheten har fått en FIN-melding og sendt en ACK-melding, men den har ennå ikke fått en bekreftelse (ACK) for sin egen FIN-melding som er sendt. |
TIME-WAIT | Enhetene har nå fått en FIN-melding fra den andre enheten og bekreftet den, og den har sendt sin egen FIN-melding og fått den bekreftet av den andre enheten. |
CLOSED | Se ”Opprette forbindelse” lenger oppe på siden. |
Legg merke til at det ligger en timeout på slutten av denne fasen (TIME-WAIT). Dette er for å sikre at vi får bekreftet den siste FIN-meldingen og unngår overlapp med en eventuell ny forbindelse på samme port.
4. Referanser
https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment
http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm