**TCP** (lyhenne sanoista *Transmission Control Protocol*) 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 verkkosivujen hakeminen tehdään siten, että selaimen ja palvelimen välille muodostetaan TCP-yhteys, 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, RFC 8684) 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
----------

Kolmitiekättely.
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ä.

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 (RFC 1323). 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ä.

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) RFC 2581
* Ruuhkan välttely (Congestion avoidance) RFC 2581
* Nopea toipuminen (Fast retransmit/fast recovery) RFC 2581
* NewReno RFC 2582
* SACK TCP -optio (Selective Acknowledgements) RFC 2018

TCP:ssä on käytetty John Naglen mukaan nimettyä Naglen algoritmia (RFC 896, korvaajat RFC 1122 ja RFC 6633) 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.

TCP-kehys
---------

(Pituus on 32-bitin monikerta)

| + | 0 - 3 | 4 - 9 | 10 - 15 | 16 - 31 |
| --- | --- | --- | --- | --- |
| 0 | Lähdeportti | Kohdeportti |
| 32 | Järjestysnumero |
| 64 | Kuittausnumero |
| 96 | Otsikon pituus | Reserved | Liput | Ikkunan koko |
| 128 | Tarkistussumma | Kiireellisyysosoitin |
| 160 | Optiot ja täyte |
| 192 | Data |

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 (RFC 8257, RFC 7560) 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*.

  
* RFC 675 – Specification of Internet Transmission Control Program (1974)
* RFC 793 – Transmission Control Protocol (1981)
* STD 7 – Transmission Control Protocol, Protocol specification
* RFC 1323 – TCP Extensions for High Performance
* RFC 2018 – TCP Selective Acknowledgment Options
* RFC 5681 – TCP Congestion Control (korvaa: RFC 2581)
* RFC 5925 – The TCP Authentication Option (korvaa: RFC 2385)
* RFC 6247 – vanhentuneiden dokumenttien siirto historillisiksi
* RFC 6298 – Computing TCP's Retransmission Timer
* RFC 6528 – Defending Against Sequence Number Attacks (korvaa: RFC 1948)
* RFC 7323 – TCP Extensions for High Performance (korvaa: RFC 1323)
* RFC 7414 – A Roadmap for TCP Specification Documents
* RFC 7805 – vanhentuneiden dokumenttien siirto historillisiksi
* RFC 8684 – TCP Extensions for Multipath Operation with Multiple Addresses (korvaa: RFC 6824)

Haavoittuvuudet
---------------

TCP:ssä on haavoittuvuuksia, jotka mahdollistavat mm. TCP-kaappauksen.

Katso myös
----------

* TCP/IP-viitemalli
* UDP

Lähteet
-------

1. 1 2 3 4 5 6  Fall, Kevin R. & Stevens, W. Richard: *TCP/IP Illustrated, Volume 1*. Second Edition. Addison-Wesley. ISBN 978-0-321-33631-6.
2. 1 2  Jon Postel: IEN 2, *Comments on Internet Protocol and TCP* *rfc-editor.org*.  15. elokuuta 1977. Viitattu 23.5.2019. (englanniksi)
3. ↑  Olivier Bonaventure, SungHoon Seo: Multipath TCP Deployments *ietfjournal.org*.  1.11.2016. Viitattu 27.1.2020. (englanniksi)
4. ↑  Decoupling TCP from IP with Multipath TCP (PDF) *multipath-tcp.org*. Viitattu 27.1.2020. (englanniksi)
5. ↑  5. Layering and Modularity *datatracker.ietf.org*. Viitattu 17.11.2022. (englanniksi)
6. ↑  3. The TCP Maximum Segment Size Option *datatracker.ietf.org*. Viitattu 17.11.2022. (englanniksi)
7. ↑  Boost network performance through TCP Window Scaling *site24x7.com*. Viitattu 17.11.2022. (englanniksi)
8. ↑  Van Jacobson & Michael J. Karels: Congestion Avoidance and Control (PDF) *ee.lbl.gov*.  marraskuu 1988. Viitattu 17.11.2022. (englanniksi)
9. ↑  Tom Kelly: Scalable TCP: Improving Performance in Highspeed Wide Area Networks (PDF) *datatag.web.cern.ch*.  21.12.2002. Viitattu 17.11.2022. (englanniksi)
10. ↑  Binary Increase Congestion Control (BIC) for Fast Long-Distance Networks (PDF) *an.kaist.ac.kr*. Viitattu 17.11.2022. (englanniksi)
11. ↑  H-TCP: TCP for high-speed and long-distance networks (PDF) *hamilton.ie*. Viitattu 17.11.2022. (englanniksi)
12. ↑  FAST TCP: Motivation, Architecture, Algorithms, Performance (PDF) *authors.library.caltech.edu*. Viitattu 17.11.2022. (englanniksi)
13. ↑  CUBIC: A New TCP-Friendly High-Speed TCP Variant (PDF) *cs.princeton.edu*. Viitattu 17.11.2022. (englanniksi)
14. 1 2  Understanding the Performance of TCP and UDP-based Data Transfer Protocols using EMULAB (PDF) *mospace.umsystem.edu*. Viitattu 17.11.2022. (englanniksi)
15. ↑  Nicole Hemsoth: There is a path to replace TCP in the datacenter *theregister.com*.  27.7.2022. Viitattu 8.11.2022. (englanniksi)
16. ↑  Data Center TCP (DCTCP) (PDF) *people.csail.mit.edu*. Viitattu 8.11.2022. (englanniksi)
17. ↑  John Ousterhout: A Linux Kernel Implementation of the Homa Transport Protocol (PDF) *usenix.org*. Viitattu 8.11.2022. (englanniksi)
18. ↑  Homa: A Receiver-Driven Low-Latency Transport Protocol Using Network Priorities (Complete Version) (PDF) *arxiv.org*. Viitattu 8.11.2022. (englanniksi)
19. ↑  UDT: Breaking the Data Transfer Bottleneck *udt.sourceforge.io*. Viitattu 17.11.2022. (englanniksi)

Aiheesta muualla
----------------

* Kuvia tai muita tiedostoja aiheesta **TCP** Wikimedia Commonsissa