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.
- Retransmission timer; Uudelleenlähetysajastinta käytetään laskemaan aikaa kun
odotetaan kuittausta.
- Persist timer; Tätä ajastinta käytetään estämään liukuvan ikkunan
äkillistä sulkeutumista mikäli toinen osapuoli katkaisee
vastaanottavan yhteyden.
- Keepalive timer; Tällä ajastimella havaitaan mikäli toinen
osapuoli kaatuu alta.
- 2MSL timer; Tämä ajastin mittaa aikaa jonka yhteys on ollut
TIME_WAIT - tilassa.
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 :
- socket() - tällä saadaan varattua järjestelmän sisältä rakenne johon
voidaan yleensä muodostaa muitakin kuin TC yhteyksiä. Socket() kutsun
yhteydessä asetetaan halutuksi yhteydeksi TCP.
- bind() - sitoo socketin johonkin paikalliseen porttinumeroon.
- connect() - aktiivisen yhteyden muodostus.
- listen() - vaikuttaa myös protokollan tilaan, tällä ilmaistaan
halukkuus kunnella sidottua sockettia.
- accept() - passivinen osapuoli käyttää tätä systeemikutsua.
- setsockopt() - tällä voidaan määrätä protokollan tiloja
- getsockopt() - vastaavasti protokollan tilasta saadaan tietoa
tällä kutsulla.
- shutdown() - sulkee yhteyksen halutulla tavalla. Mahdollistaan
myös vain toisen kanavan sulkemisen.
- close() - sulkee koko yhteyden.
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