Kari Jaatinen

Transmission Control Protocol, TCP.

Kari Jaatinen
13.11.1997
TCP is a communication protocol, not a piece of software.
- Douglas E. Comer.

Mikä TCP on ?

TCP on eräs tärkeimpiä Internetin perusprotokollia. Internet - arkkitehtuurissa se toimii IP:n päällä, mutta sitä voidaan käyttää muissakin ympäristöissä kuten vaikkapa lähiverkossa (Ethernet, Token Ring, ...).
TCP - sijoittuu [1,2] OSI - mallin mukaisesti kuljetuskerrokseen (kerros 4).

Kuva 1 : TCP sijoittuneena TCP/IP - protokollaympäristössä.


Perusajatuksena on luoda luotettava viestintäyhteys kahden pisteen välille. Yhteyden abstraktiona on rakenteeton kahteen suuntaan virtaava bittivirta, bitstream. Varsinainen tiedonsiirto on puskuroitua pakettien välitystä. Paketit on sijoitettu alla olevan siirtoprotokollan vaatimaan kehykseen ja niissä on myös TCP:n oma kehysotsikko. Tämä ei kuitenkaan periaatteessa näy käyttäjälle.

Kuva 2 : TCP otsikko.


Tässä otsakkeessa on kentät protokollan sisäiseen tiedonsiirtoon, joihinkin voi myös käyttäjä vaikuttaa. TCP - on oikeastaan tilakone, ja otsakkeen kentillä voi käyttäjäkin aiheuttaa tilasiirtymiä. Tarkat käyttöohjeet TCP - otsakkeeseen löytyy vaikkapa [1,3] RFC 793:sta missä TCP itse asiassa esitelläänkin. Kaikki implementaatiot eivät välttämättä tarjoa kovinkaan suoraviivaisia välineitä näiden tilasiirtymien aikaansaamiseen.

Yhteys ja sen muodostus

TCP - yhteys kyetään yksikäsitteisesti nimeämään sen alku ja loppuosoitteiden yhdistelmänä. Nämä osoitteet koostuvat koneen [1,4] IP-osoitteesta ja porttinumerosta. Yhteyden luonti on periaatteessa analoginen vaikkapa puhelun kanssa : toisen osapuolen on tehtävä aktiivinen (connect ) avaus ja toisen vastaavasti passiivinen (accept) vastaten soittajaa ja vastaajaa. On huomattava että myös [1,5] UDP liikenteessä lähde / kohde muodostuu IP - osoite ja portti yhdistelmistä, mutta vaikka koneessa olisikin sekä UDP:tä että TCP:tä varten yhteys samasta porttinumerosta erotellaan ne toisistaan protokollan mukaan.
Yleisin tapa yhteyden muodostuksessa lienee se että otetaan yhteys (connect) johonkin koneeseen sen tunnettuun porttinumeroon jossa on sovellusohjelma odottamassa (accept).
TCP käyttää yhteyden muodostamiseen kolmitiekättelyä. Ensimmäisessä vaiheessa kättely tunnistetaan otsakkeen CODE - kentässä olevasta SYN - bitistä. Toinen viesti joka siis palautuu ensimmäisen lähettäjälle on muodostettu siten että siinä on sekä CODE - kentän SYN ja ACK bitit ylhäällä. Viimeisenä lähetetään enää muodollinen ACK viesti. Näin on yhteys muodostettu.
Osapuolet lähettävät toisilleen kättelyviesteissä luodut (esimerkiksi satunnaisesti) sekvenssinumerot joista virran katsotaan alkavan. Nämä eivät välttämättä ala 1:stä, tämä jottei mahdollisen koneen uudelleenkäynnistyksen jälkeen aletut TCP yhteydet sekoittuisi jo aikaisemmin muodostettujen kanssa. Protokolla sallii myös tiedon lähetyksen jo tässä kättelyvaiheessa, tällöin se puskuroidaan ja välitetään sovellusohjelmmalle heti kättelyn päätyttyä.
On myös mahdollista avata yhteys siten että molemmat osapuolet toimivat aktiivisina avaajina. Tilanne on hivenen keinotekoinen, mutta mahdollinen. Tällöin molemmat osapuolet lähettävät SYN - paketit jotka menevät ristiin verkossa. Lisäksi molempien osapuolien on täytynyt sitoa porttinumeronsa ristiin ja kytkeytyä toisen osapuolen paikalliseen porttinumeroon. Kaikki TCP implementaatiot eivät kuitenkaan tue tätä ominaisuutta [6].

Virran hallinta ja luotettavuus

TCP:n tietovirta on jaettu oktetteihin (8 bittiä) jotka on numeroitu alkaen kättelyvaiheessa sovitusta sekvenssinumerosta. Yksi TCP:n tärkeimmistä tavoitteista on luoda luotettava tiedonsiirto, ja koska yleisesti ottaen ei alla olevan verkkokerroksen palveluihin voi luottaa (toisin sanoen, oletetaan että viestejä voi kadota tai korruptoitua) käytetään TCP:ssä 'positive acknowledgement with retransmission' - periaatetta. Tällaisessa mallissa jokainen vastaaotettu paketti kuitataan, ja mikäli tietyn ajan sisällä ei kuittausta lähetyksestä ole saapunut uudelleen lähetetään paketti. Tämä malli takaa luotettavuuden, ja yhdessä sekvenssinumeroinnin kanssa myös mahdolliset kahteen kertaan saapuvat paketit voidaan erotella.
Tälläinen jokaisen paketin kuittaava liikenne on kuitenkin hyvin tehotonta. Niinpä TCP:ssä on käytössä ns. liukuva lähetysikkuna.

Kuva 3. Lähetysikkuna.


Jokainen ikkunan vasemmalla puolella oleva paketti on lähetty ja kuittaus niistä on saapunut. Ikkunan sisällä äärivasemmalla on ensimmäinen lähetetty kuittaamaton paketti. Ikkunan ulkona oikealla ovat sellaiset paketit joita ei ole vielä lähetetty. Lisäksi ikkunan sisällä on osoitin joka kertoo lähetettyjen ja lähettämättömien pakettien rajan. Tämä yleensä liukuu hyvin nopeasti äärioikealle.
TCP:ssä käytetään vaihtuvan kokoista lähetysikkunaa näin on mahdollista mukautua verkossa usein esiintyviin resurssien vaihteluun. Tämä ominaisuus hoidetaan siten että osapuolet mainostavat omaa ikkunaansa, ts. kertovat kuinka suurta vastaaottoikkunaa niillä on varaa pitää. Koska yhteys on kaksisuuntainen, on yhdessä TCP - yhteydessä itseasiassa neljä ikkunaa käytössä, kummallekkin virralle omat lähetys ja vastaanottoikkunat.
TCP ylläpitää neljää erilaista ajastinta joilla yhteyttä voidaan mallintaa ja hallita.

Tarkistussummat paketeille

Jotta mahdolliset siirtovirheet saataisiin eliminoitua, lasketaan paketille tarkistussumma. Tämän 16 bittisen luvun laskemiseksi lähettäjä liittää segmenttiin pseudo-otsikon ja täyttää tarpeellisen määrän tätä konkatenoitua segmenttiä jotta sen pituus olisi 16:sta jaollinen. Tämän jälkeen tarkistusumma lasketaan koko konkatenoidun segmentin yli. Pseudo-otsikon CHECKSUM - kenttää pidetään laskennan aikana nollattuna.

Kuittaukset ja uudelleenlähetykset

Jokainen numeroitu ja lähetty segmentti (paketti) on kuitattava. Mikäli lähettäjä ei saa kuittausta paketista tietyn ajan kuluttua uudelleenlähetetään kyseinen paketti. Kuittaussanomissa vastaanottaja kertoo myös seuraavan odottamansa paketin järjestysnumeron. Näin on mahdollista että vastaanottaja kuittaakin useita paketteja yhdellä kuittaussanomalla, sillä kertomalla odottamansa seuraavan paketin tietää lähettäjä tästä että kaikki nyt kuitatun ja odotetun paketin väliset paketit ovat myös saapuneet perille. TCP:n uudelleenlähetys ajastin on tärkeä osa protokollaa, siksipä siitä on yritetty tehdä sellainen että se pystyy muuntautumaan yhteyden laadun mukaisesti. Tätä varten lasketaan paketin lähetykstä sen kuittauksen saapumiseen kuluva ns. round trip time. Tällä lasketulla ajalla korjataan sitten käytössä olevaa uudelleenlähetysajastinta sopivan kaavan mukaisesti.

Yhteyden lopetus

Koska yhteys on kaksisuuntainen, on nämä mahdollista että yhteys suljetaan vain toiseen suuntaan. Tämä tapahtuu kun sovellusohjelma kertoo TCP :lle virran loppumisesta jollin TCP sulkee yhteyden tähän suuntaan lähettämällä vastaanottajalle viestin jonka CODE kentässä on FIN - bitti ylhäällä. Sulkemisen jälkeen TCP ei suostu enää lukemaan dataa suljetusta suunnasta. Kun kumpikin suunta on suljettu yhteys tuhotaan.

Yhteenveto

On huomattava ettei TCP tarjoa mitään muuta kuin tietovirran, luotettavan sellaisen. Käytännössä on tämän päälle kuitenkin mahdollista luoda toimiva rakenteellinen tiedonsiirto, kunhan vain itse pitää huolta tiedon synkronoinnista.
Tietoliikenneohjelmoijan kannalta TCP:n käyttö on suoraviivaista, ainakin BSD Unix implementaatio - perheessä. Tässä mallissa käyttöjärjestelmä tarjoaa suoraan yleensä ainakin seuraavat järjestelmäkutsut joilla TCP - yhteys muodostetaan : Yksinkertaisin kutsusekvenssi olisi tälläinen :
Aktiivinen avaaja : socket(), bind(), connect() --- close()
Passiivinen kuuntelija : socket(), bind(), listen(), accept() --- close()

Lähteet

[1] Douglas E. Comer, Internetworking With TCP/IP; Priciples, Protocols and Architecture - 1988 Prentice-Hall Inc, ss. 129 - 151. ***

[2] Tadeusz Matuszkiewicz, THE OSI REFERENCE MODEL - 14/1/96
<URL:http://laserspark.anu.edu.au/kolko-komputerowe/osi.html> **

[3] RFC 793 : TRANSMISSION CONTROL PROTOCOL; DARPA INTERNET PROGRAM; PROTOCOL SPECIFICATION - 1981
<URL:ftp://ftp.funet.fi/rfc/rfc793.txt>

[4] Arne Thon, IP Addresses - ei päiväystä. *
<URL:http://wwworg.uio.no/in312/Studbok/IP-adresser/ipaddr.html>

[5] Tao Lu, UDP(User Datagram Protocol) - ei päiväystä. **
<URL:http://www.tcm.hut.fi/Opinnot/Tik-110.350/Tehtavat/essays/udp.html>

[6] W.Richard Stevens, TCP/IP Illustrated : The protocols, Volume 1 - 1994 Addison-Wesley Publishing Company, ss 250 - 251. *****

Linkkejä


**** Transmission Control Protocol (TCP). Hyvä, syvälle luotaava esitys TCP:stä.
*** Transmission Control Protocol (TCP).Tässä esityksessä on esimerkki joka valaisee yhteyttä
** An Introduction to TCP/IP Programming. Johdatus TCP/IP ohjelmointiin.
** TCP/IP TUTORIAL. Hienosti tehtyä online - opetusta TCP/IP:stä. Sopii oikein hyvin vasta-alkajille. Pakollinen rekisteröinti suoritettava.
** The PC-Mac TCP/IP & NFS FAQ list. Usein vastattuja kysymyksiä TCP/IP:stä PC ja Macintosh - koneissa.
* The Transmission Control Protocol TCP. Lyhyt esitys
* The TCP/IP Protocol Suite. Yleiskuvaa TCP/IP protokollista.
* TCP/IP Toinen yleiskuvaus TCP/IP protokollista.
* T.C.P. Transmission Control Protocol. Lyhyt kuvaus.

Kari Jaatinen <kari@cure.tky.hut.fi>

Created Sun Nov 2 18:11:21 EET 1997 Last Modified Mon Nov 3 00:32:09 EET 1997