Transmission Control Protocol

**Transmission Control Protocol (TCP)** er ein transportlagsprotokoll i IP-protokollfamilien. TCP er sambandsorientert, straumorientert og påliteleg. Dette gjer at ein sendar kan vere trygg på at det som blir sendt kjem fram til mottakaren heilt og i same rekkefølgje som det vart sendt. Dette kravet blir stilt av svært mange bruksområde, noko som gjer at TCP er dominerande på Internett i dag. TCP blir nytta av kjende applikasjonslagsprotokollar som HTTP-protokollen, som blir brukt på verdsveven, og SMTP, som blir brukt til å sende e-post.

## Oversyn
TCP tek imot ein straum av data frå applikasjonslaget og deler han opp i passande bitar avhengig av mellom anna kva slags tilkopling til nettverket som blir brukt. Kvar bit med applikasjonsdata saman med eit TCP-hovud blir sendt ned til nettverkslaget og IP-protokollen som syter for at pakka blir sendt til rett mottakar. Kvar einaste slik del av straumen av applikasjonsdata blir kalla eit *segment*. 

Sidan IP-protokollen ikkje garanterer at ei pakke kjem fram, må mottakaren av eit segment stadfeste at kvar pakke er motteken. Dette blir gjort ved å sende ei kvittering. Ei kvittering er eit TCP-segment med ACK-flagget sett. Avsendaren startar ei klokke som tel ned når segmentet blir sendt.  Om ikkje kvitteringa kjem før tida er ute, blir segmentet sendt på nytt.

Segment kan godt bli forseinka slik at vi brått får to like, eller kome i bakvendt rekkefølgje. For å handtere dette problemet blir kvar enkel byte i straumen identifisert med eit *sekvensnummer*. Dette gjer at mottakaren kan finne ut kvar nyttelasta i segmentet passar inn i datastraumen.

TCP har også ein sjekksum over hovudet og nyttelasta. Dette gjer at TCP kan oppdage det om eit segment har vorte endra på vegen og det blir da kasta av mottakaren som ventar på at avsendar sender det på nytt.

## Protokollen i detalj

### Sambandsorientert
Eit samband blir oppretta mellom partane før data kan utvekslast. Kvart slik samband blir identifisert med IP-adressa og portnummeret til kvart endepunkt. På den måten kan kvar enkel node tilkopla nettverket ha mange samband oppe på same tid. Sidan kvart samband skjer mellom to og berre to noder så støttar ikkje TCP multicast. Under prosessen med å opprette eit nytt samband blir ein del informasjon utveksla, der særleg sekvensnummera begge partane bruker er viktige. 

#### Oppkoplingsfasa

Opprettinga av ein samband mellom partane skjer ved eit såkalla trevegshandtrykk (eng:Three way handshake), dette skjer på følgjande måte: 

Datamaskina som ynskjer å opprette sambandet, normalt klienten,  sender eit TCP-segment med SYN-flagget sett og med portnummeret til tenesta ho skal kople seg til datamaskina som tilbyr tenesta klienten ynskjer å kople seg til. Om alt går bra får klienten eit TCP-segment attende med SYN-flagget sett og ei kvittering (ACK-flagget sett) for at det fyrste segmentet vart motteke. Klienten må så sende ei kvittering til tenaren for at opprettinga av sambandet skal bli fullført.

Når sambandet er oppretta kan data bli sendt mellom endepunkta i begge retningar samtidig (Full duplex). 

#### Dataoverføringsfasa

Sidan TCP er straumorientert vil ikkje grensene mellom meldingar bli tekne vare på. Om ei node bed TCP om å sende til dømes 576 byte to gonger, kan det godt hende at berre eitt TCP-segment blir sendt. 

I denne fasa utvekslar endepunkta segment med nyttelast. Avsendar mottek kvitteringar for data som har vorte motteke og ikkje er skadde. Om mottakaren får fleire segment i rask rekkjefølgje kan det godt bli kvittert for fleire samla. Om til dømes det første inneheld byte 124–156 og det neste 157–234 så kan mottakaren sende berre ei kvittering for til og med byte 234 i straumen.

#### Nedkoplingsfasa

Sambandet kan bli teke ned på fleire måtar. Den feilfrie måten blir kalla eit firevegs handtrykk  (en.: Four way handshake). Dette skjer slik: 

Det eine endepunktet for sambandet sender eit segment med FIN-flagget sett, dette tyder at det ikkje vil bli  sendt meir applikasjonsdata den vegen. Andre enden kvitterer for FIN-segmentet. Nå er sambanda stengde denne vegen; denne tilstanden blir kalla halvt lukka (en.: Half close). Når det andre endepunktet er ferdig med å sende blir eit segment med FIN-flagget sett sendt. Fyrste endepunkt kvitterer for dette segmentet. Sambandet er nå oppløyst.

### Flytkontroll

For at ikkje ein rask sendar skal drukne ein tregare mottakar med data, kontrollerer TCP kor mykje data ein avsendar kan sende om gongen før han får kvitteringar frå mottakaren. Dette skjer ved hjelp av eit såkalla vindauge. Vindauget avgjer kor mykje data som kan sendast før avsendaren får kvitteringar. TCP blir kalla ein  *glidande vindaugsprotokoll* (en.: Sliding window protocol) sidan vindauget er av fast storleik og «glid» over sekvensnummera etter som dei blir kvitterte for. Når til dømes mottakaren kvitterer for nye 1000 byte så vil vindauget bli flytta 1000 byte oppover i sekvensnummer.

### Mettingskontroll

TCP har fleire ulike teknikkar for å regulere hastigheita på overføringa når nettverket blir *metta*, altså at det ikkje er meir ledig kapasitet på nettverket. Ein av desse blir kalla «congestion avoidance». Dette er ein teknikk som blir brukt når segment går tapt. Sidan svært få segment går tapt som følgje av at dei blir skadde på vegen antek TCP at det er ein ruter som er overbelasta og må kaste pakkar. TCP reduserer da overføringshastigheita.

## Alternativ til TCP
Pålitlegheita har på den andre sida ulemper i form av eit større protokollhovud. TCP har eit hovud på minimum 20 byte, mens UDP har ein fast storleik på 8 byte. Pålitlegheita kan også føre til forseinkingar på grunn av at eit segment må bli sendt på nytt. Dette kan vere eit problem for tenester som IP-telefoni og ulike mediastraumar som video og lyd. I slike tenester er ofte eit forseinka segment lite nyttig. I slike samanhengar blir ofte UDP-protokollen brukt. Det er også utvikla mange andre alternativ, men dei er i liten grad teke i bruk. Eit alternativ som er under aktiv utvikling er SCTP.