Transport Control Protocol
4 jun. 2010RFC 793
Det er en grunn til at utrykket tcp/ip brukes om Internettprotokollene. TCP-protokollen er i likhet med UDP en protokoll på transportlaget, rett under applikasjonslaget. I motsetning til UDP-protokollen, er denne langt mer avansert. Feltene tilgjengelige er:
Her har jeg merket feltene protokollen har i tillegg til de UDP-protokollen har.
Denne protokollen har som mål å sørge for at all trafikk kommer frem til mottaker, samt at pakkene blir satt sammen i riktig rekkefølge hos mottakeren, noe vi er helt avhengig av når det kommer til oppgaver typisk lik kopiering av filer.
Sekvensnummer:
For å holde styr på pakkene, får hver pakke et sekvensnummer. TCP-protokollen ser på data den får tilsendt fra applikasjonslaget som en "strøm av data". Sekvensnummeret beskriver hvor langt inn i strømmen (i byte) vi har kommet. Figuren under prøver å illustrere dette: TCP-protokollen deler opp data i pakker. Hver pakke får en header, der det står at "første byte av data i denne pakken er byte nummer 1,3,6,7..."
Acknowledgment
er et tilsvarende felt, men dette feltet lar mottakeren fortelle senderen nummeret på hvilket byte den forventer å få. Feltet sier med andre ord: "jeg har mottatt alle byte av strømmen frem til nå, her er hva jeg forventer å få neste gang". Hvis mottakeren mister noen pakker, vil det oppdages hos sender ved at dette tallet ikke øker, og data må sendes på nytt. Nøyaktig hvordan denne prosessen går, er et fint samspill mellom bufferkapasitet og timeout.
Tilsammen støtter disse to feltene prosessen med å få all data overført i riktig rekkefølge
Offset
forteller hvor mange 32-bit "words" headeren består av. Dette for at mottaker skal vite når nyttedata begynner.
Så kommer 6 "flagg". Bit som enten er 0 eller 1 (av eller på).
Disse brukes for å sette opp, re-starte og avslutte en oppkobling, samt noe i forbindelse med prioritering. TCP-protokollen har alltid en oppkoblingsfase før det kan sendes data. Denne prosedyren kalles "3-way handshake" og går som dette:
Den parten som starter, setter SYN flagget i en ellers nokså tom pakke. Mottakeren av pakken svarer med en melding der SYN-flagget også er satt, samt at ACK-flagget er satt (den sier "Ja, jeg mottok din forrige pakke, gi meg neste").
Du som kaller opp, sender nå en tredje pakke, nå med SYN avslått (vi har koblet opp), men du fortsetter å sette ACK på ("ja, jeg mottok..", sender med dine første data. Sekvensnummer og acknowledgment nummer må hele tiden stemme. For å øke sikkerheten blir starverdien på sekvensnummeret valgt tilfeldig. Dette har med at en pakke mottatt blir kastet om den ikke ligger innenfor vinduet, eller med andre ord, et nummer mellom sist aksepterte bytenummer og det antall byte vi har sagt fra om at bufferet vårt holder. En angriper kan prøve å kaste inn en tilfeldig pakke for å prøve å ødelegge for en etablert tilkobling. Er startnummeret tilfeldig, aner ikke angriperen hvilket nummer han skal bruke.
Når en part ønsker å koble ned, settes FIN flagget. Den andre parten kan fortsette å sende data, da FIN kun betyr "Jeg er ferdig", noe som ikke betyr at "Begge er ferdig". Når begge har satt FIN flagget, kobles forbindelsen ned og resurser (minne) frigjøres. URG (urgent) og PSH (push) er flagg som kan settes for å unngå at data blir liggende i buffer i vente av at data skal samles opp for å sendes i en stor pakke. RST (reset) brukes hvis noe går galt, og tilkoblingen på re-startes.
Window
er feltet som lar partene fortelle hverandre hvor mye "data på forskudd" de er i stand til å håndtere. For å få opp farten på overføringen, kan senderen sende mange pakker i forveien uten å vente på et ACK. Når et ACK først kommer, sier det "Ja, jeg har mottatt alle pakker frem til denne verdien". Av og til forsvinner pakker på veien. For å få re-sent pakken på nytt innen rimelig tid går det timere (tellere). Tikker de ut før ACK ankommer, starter TCP-protokollen på nytt fra sist mottatte ACK. Dette feltet spiller en viktig part i å unngå metning på nettverket.
En nettverksforbindelse har en maksimal overføringskapasitet. Overskrides denne, går buffer før eller siden fulle (ofte på rutere og svitsjer). Dette medfører naturligvis at pakker må slettes. Alle kommer ikke igjennom. Pakketap kalles dette, og er et stort problem da det igjen betyr at mye data må sendes på nytt som igjen fyller opp kapasiteten enda mer. For å unngå metning må TCP-protokollen sørge for å senke farten (pakkeutsendinger per sekund). Dette kan gjøres i "endene" ved å øke og senke vinduet.
Til slutt kommer Urgent pointer, som kombinert med URG flagger gir støtte for at senderen kan kaste på "viktig" data i en pakke, og få mottakeren til å sende den informasjonen "raskere" opp til applikasjonslaget..kort fortalt.
TCP-protokollen trenger langt mer resurser av systemet enn UDP da det er mye å holde styr på. Samtidig skal mer header sendes i hver pakke.