TCP

TCP () on tietoliikenneprotokolla tietokoneiden väliseen luotettavaan tiedonsiirtoon. Toisin kuin IP- tai UDP-protokollat TCP sisältää mekanismeja vikatilanteesta toipumiseen.

TCP-yhteyksien avulla tietokoneet voivat lähettää toisilleen tavujonoja luotettavasti. TCP pitää myös huolta, että paketit saapuvat perille oikeassa järjestyksessä. Tarvittaessa hävinnyt paketti voidaan lähettää uudestaan. Tätä tarkoitusta varten TCP:hen on kehitetty erilaisia vuonvalvonta- ja ruuhkanhallintamekanismeja. Suurin osa Internetin liikenteestä perustuu TCP:hen ja koko TCP/IP-protokollaperhe on saanut nimensä TCP:n perusteella.

Esimerkiksi verkkosivut haetaan internetin yli niin, että selaimen ja palvelimen välille muodostetaan TCP-yhteys HTTP-protokollalla, jossa selain voi lähettää tavujonoja palvelimelle (sivupyyntö) ja toisinpäin (sivun sisältö tai virheviesti).

TCP:n paikka OSI-mallissa on kuljetuskerroksessa.

 Historia 
Tutkimusta epäluotettavien siirtoteiden käyttöön oli tehty pitkään joista yhtenä merkittävimpänä teoreettisena työnä Claude Shannonin tutkimustyö (1948). Siirtotietä, joka voi kadottaa tai muuttaa viestiä, käsitellään TCP:ssä uudelleenlähetysmenetelmällä (Automatic Repeat Request, ARQ).

Varhaiset versiot TCP/IP protokollapinosta on kuvattu Internet Experiment Note (IEN) dokumenteissa: IEN 2 -dokumentissa TCP-protokollan tehtävät jaetaan kahtia eri kerroksiin ja esitellään IP-protokollan versio 0. TCP:n vastuulle jää "päästä-päähän" tapahtuva kommunikaatio ja IP:n vastuulle reititettävä "hyppy-hypyltä" kommunikaatio, jotka aiemmin olivat molemmat TCP:n tehtäviä.

Multipath TCP (MPTCP, ) on laajennus, joka mahdollistaa saumattoman siirtymisen matkapuhelinverkon (3G, 4G) ja WiFi-verkon välillä, sekä käyttämään useampia yhteyksiä yhtäaikaisesti paremman kaistanleveyden saamiseksi.

 TCP-yhteys 
pienoiskuva|Kolmitiekättely.
pienoiskuva|Yksinkertaistettu tilakaavio.
TCP-yhteys sisältää kolme vaihetta. Yhteyden muodostaminen, tiedonsiirto sekä yhteyden katkaisu.

TCP-yhteys pitää muistissa yhteyden tilaa ja alempi IP-kerros ei tiedä yhteydestä vaan toimii kertaluontoisesti.

 Yhteyden muodostaminen 
Yhteyden muodostamiseen käytetään kolmitiekättelyä, jossa yhteyden aloittajan laite lähettää ensiksi kohdelaitteelle SYN-paketin (SYNchronization) ja kohdelaitteen saatua SYN-paketin vastaan laite vastaa aloittajalle SYN/ACK-paketilla (ACKnowledgement) merkkinä että SYN-paketti on saapunut. Lopuksi aloittajalaite vastaa kohdelaitteelle ACK-paketilla merkiksi, että on ottanut kohdelaitteen SYN/ACK-paketin vastaan.

 Tiedonsiirto 
Tiedon siirtovaiheen aikana useat eri mekanismit varmistavat datan eheyden. Näitä mekanismeja ovat sekvenssinumerointi TCP-pakettien järjestyksen varmistamiseksi, tarkistussummat virheiden tarkistusta varten sekä ajastimet ja tunnistimet hukatuille paketeille ja viiveelle. Yhteyden muodostuksen aikana yhteyden välillä jaetaan sekvenssinumerot, joiden perusteella datavirrasta tunnistetaan kullekin yhteydelle kuuluvat paketit. Jokaisesta vastaanotetusta TCP-paketista lähetetään kuittaus lähettäjälle. Jos kuittausta ei tule, paketti lähetetään uudestaan.

 Yhteyden päättäminen 
Yhteys päätetään nelitiekättelyllä. Yhteyden molemmat osapuolet katkaisevat yhteyden erikseen. Molemmat lähettävät FIN-paketin ja molemmat kuittaavat sen ACK-paketilla.

Yhteys voidaan päättää myös kolmitiekättelyllä. Toinen osapuoli lähettää FIN-paketin, jonka toinen osapuoli kuittaa FIN-ACK paketilla. Tämän jälkeen ensimmäinen osapuoli lähettää ACK-paketin.

Yhteyden voi myös katkaista suoraan jompikumpi osapuoli lähettämällä RESET-valitsimella varustetun paketin. Toimenpide on ilmaisu katkaista yhteys heti, eikä vastauspaketteja lähetetä.

 Tiedonsiirtovirheiden havaitseminen 
TCP sisältää tarkistussumman käsittelyn, joka löytää myös rikkinäisiä paketteja vaikka siirtokerroksen CRC:n pitäisi havaita suurin osa. Tutkimuksen mukaan Internetissä on useita vikalähteitä, joita ei voida havaita siirtokerroksessa. Kerätyistä tiedoista noin puolelle vian syytä ei voitu tunnistaa tai luokitella.

 Valinnaiset optiot 
TCP tukee eräitä laajennuksia, jotka ovat valinnaisia. TCP-paketissa voidaan lähettää aikaleima, jolla voidaan havaita vanhat kaksoiskappaleet (sama järjestysnumero mutta aikaleima edeltää jotain viimeksi saatua pakettia), sekä voidaan seurata edestakaisen liikenteen kestoa (round-trip time).

 Tiedonsiirto 
TCP-tiedonsiirtoon liittyy useita parametreja minkä verran yhdessä paketissa kerralla lähetetään. Maksimi segmentin koko (MSS) kertoo miten suuren paketin vastapuoli voi kerralla vastaanottaa.

Tiedonsiirron tehokkuutta varten on kehitetty laajennuksia, kuten skaalautuva lähetysikkunan koko (). TCP pyrkii hyödyntämään verkon koko kaistaa, mutta vikatilanteen tapahtuessa lähetettävän tiedon määrää on supistettava ja tieto on lähetettävä uudelleen. Tehokkuutta voidaan parantaa lähettämällä useita paketteja kerralla odottamatta edellisen kuittausta. Vastaanottaja ja lähettäjä voivat neuvotella lähetysikkunan koon ennen lähetystä.

Pakettien häviöiden tunnistamiseen on kehitetty RACK-TLP -algoritmi (), joka on julkaistu vuonna 2021. Aiemmin on esitetty muita algoritmeja ().

 Ruuhkanhallinta 
Pakettien katoaminen johtuu yleensä ruuhkasta internetin reitittimillä. Näissä tilanteissa reitittimelle saapuu enemmän paketteja kuin se ehtii välittämään eteenpäin. Kun reitittimen puskuri täyttyy, ylimääräiset paketit joudutaan hylkäämään. Jos datan lähettäjä vain itsepintaisesti uudelleenlähettäisi paketit, se lisäisi reitittimen ruuhkaa entisestään. Sitä varten TCP:hen on kehitetty ruuhkanhallintamekanismeja. Ruuhkanhallintamekanismit ovat pitäneet internetin käyttökelpoisena, vaikka liikenteen määrä on kasvanut vuosien saatossa räjähdysmäisesti. Osa ruuhkanhallintamekanismeista on standardisoitu.

TCP seuraa viestien välitykseen käytettävää aikaa (round-trip time, RTT) ruuhkanhallintaan.

Oleellisia TCP:n ruuhkanhallinta-algoritmeja:
 Hidas aloitus (slow start) 
 Ruuhkan välttely (Congestion avoidance) 
 Nopea toipuminen (Fast retransmit/fast recovery) 
 NewReno 
 SACK TCP -optio (Selective Acknowledgements) 
 Duplicate Selective Acknowledgement (D-SACK) 

TCP:ssä on käytetty John Naglen mukaan nimettyä Naglen algoritmia (, korvaajat  ja ) ruuhkan hallintaan, joka rajoittaa pienten pakettien lähettämistä kunnes kuittaukset saapuvat. Naglen algoritmi voi koota pieniä paketteja yhdeksi kerralla lähetettäväksi kun ruuhka helpottaa.

TCP:n ruuhkanhallinnan parantamiseen on ehdotettu useita eri vaihtoehtoja, esimerkiksi Scalable TCP, BIC-TCP, H-TCP, FAST TCP ja CUBIC-TCP. AccECN (Accurate Explicit Congestion Notification) on ehdotus seuraavaksi IETF-standardiksi . AccECN on muutos protokollaan, joka muuttaa eräiden bittien käyttöä ja menetelmä on käytössä vain jos yhteyden molemmat päät tukevat sitä. AccECN mahdollistaa aiempien menetelmien käytön ("Nonce"  ja "ECN" ) taaksepäin yhteensopivuuden vuoksi.

TCP-kehys
TCP-paketin otsikko on muotoa:

 Bitit 0 - 7 8 - 15 16 - 23 24 - 31 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 Lähdeportti Kohdeportti 32 Järjestysnumero 64 Kuittausnumero 96 Otsikonpituus Varattu Liput Ikkunan koko 128 Tarkistussumma Kiireellisyysosoitin 160 Optiot (valinnainen) 192 Data(muuttuva pituus)

 lähdeportti ja kohdeportti ovat 16-bittisiä numeroita lähetykseen ja vastaanottoon
 järjestysnumero, 32-bittiä
 kuittausnumero, 32-bittiä
 otsikon pituus on neljä bittiä, joka kertoo TCP-otsikon 32-bittisten sanojen määrän otsikossa ja kertoo data-osion alkupaikan sekä optiot-osion
 varattu on neljän kontrollibitin joukko, joka on varattu myöhempää käyttöä varten
 liput sisältää bitit: CWR, ECE, URG, ACK, PSH, RST, SYN ja FIN:
 CWR: Congestion Window Reduced
 ECE: ECN-Echo
 URG: Kiireellisyysosoitin on merkittävä
 ACK: Kuittaus on merkittävä
 PSH: Push
 RST: Yhteyden nollaus
 SYN: Järjestysnumeroiden tahdistus
 FIN: Ei enää tietoja lähettäjältä
 ikkunan koko, 16-bittinen etumerkitön kokonaisluku, joka kertoo data-oktettien määrän
 tarkistussumma, 16-bittinen tarkistussumma
 kiireellisyysosoitin, 16-bittinen järjestysnumeroon liittyvä positiivinen offset
 optiot, 8-bittisiä lisätietoja, joka on mukana vain jos otsikon pituus on suurempi kuin viisi; mukana voi olla täytettä jotta pituus on 32-bitin monikerta
 data, varsinainen dataosio, jonka pituus on muuttuva; alkukohdan paketissa kertoo otsikon pituus

 Vaihtoehtoja 
Uudempia TCP:n kanssa samantyyppistä palvelua tarjoavia protokollia ovat
 SCTP – parempi luotettavuus, mm. mahdollisuus useisiin vaihtoehtoisiin rinnakkaisyhteyksiin
 RTP – reaaliaikainen tiedonsiirto esimerkiksi puhetta (VoIP) varten

TCP suunniteltiin hajallaan olevien paikkojen väliseen liikenteeseen, josta johtuen se ei sovellu hyvin datakeskuksen sisäiseen liikenteeseen. Datakeskuksien tarpeiden vuoksi on ehdotettu DCTCP (Data Center TCP) -protokollaa (, ) ja Homa-protokollaa.

UDP-based Data Transfer Protocol (UDT) on UDP:lle perustuva protokolla, joka lisää UDP:n päälle omat mekanismit luotettavuuden ja ruuhkan hallintaan.

 Standardointi 
TCP on IP numero 6. IP-porttien numerointi löytyy artikkelista portti.
 kuva:IP-paketti.png 

  – Specification of Internet Transmission Control Program (vuodelta 1974)
  – Transmission Control Protocol (vuodelta 1981)
 STD 7 – Transmission Control Protocol, Protocol specification
  – TCP Extensions for High Performance
  – TCP Selective Acknowledgment Options
  – TCP Congestion Control (korvaa: )
  – The TCP Authentication Option (TCP-AO, korvaa: )
  – vanhentuneiden dokumenttien siirto historiallisiksi
  – Computing TCP's Retransmission Timer
  – Defending Against Sequence Number Attacks (korvaa: )
  – TCP Extensions for High Performance (korvaa: )
  – A Roadmap for TCP Specification Documents
  – vanhentuneiden dokumenttien siirto historiallisiksi
  – TCP Extensions for Multipath Operation with Multiple Addresses (korvaa: )
  – Transmission Control Protocol (TCP) (korvaa: , , , , , , )

 Haavoittuvuudet 
TCP:ssä on todettu haavoittuvuuksia, jotka mahdollistavat eräitä hyökkäyksiä. Näitä ovat TCP-kaappaus (järjestysnumerokaappaus), SYN-tulva ja Reset-hyökkäys. Eräisiin ongelmiin on kehitetty ratkaisuja.

 Katso myös 
 TCP/IP-viitemalli
 UDP

 Lähteet 

 Aiheesta muualla 

Luokka:TCP/IP
Luokka:OSI-kuljetuskerros
Luokka:Seulonnan keskeiset artikkelit