TCP

Vikipēdijas raksts

Piecu slāņu TCP/IP modelis
5. Lietojuma slānis

DHCP • DNSFTPHTTPIMAP4IRC • MIME • POP3 • SIP • SMTP • SNMP • SSH • TELNET • BGP • RPC • RTP • RTCP • TLS/SSL • SDP • SOAP • L2TP • PPTP • …

4. Transporta slānis

TCPUDP • DCCP • SCTP • GTP • …

3. Tīkla slānis

IP (IPv4 • IPv6) • ARP • RARP • ICMP • IGMP • RSVP • IPSec • …

2. Kanāla slānis

ATM • Ethernet • FDDI • Frame relay • GPRS • PPP • …

1. Fizikālais slānis

Ethernet physical layer • ISDN • Modemi • PLC • RS232 • SONET/SDH • G.709 • Wi-Fi • …

TCP (Transmission Control Protocol)(Pārraides vadības protokols) ir viens no galvenajiem interneta protokoliem. TCP ļauj tīkla datoru programmām izveidot konnekcijas no vienas uz otru, caur kurām var pārsūtīt datus. Atšķirībā no UDP, šis protokols garantē drošu un secīgu datu pārraidi. TCP arī atšķir dažādu programmu konnekciju datus (lietojot portu numurus).

TCP ir internetā plašāk lietotais transporta slāņa protokols. Programmas TCP piegādā baitu plūsmas, kas tiek sadalītas atbilstoša izmēra segmentos (kuru izmēru parasti nosaka kanāla slāņa MTU (maximum transmission unit)). Iegūtās paketes TCP tālāk piegādā IP nosūtīšanai caur tīklu. TCP pārbauda, vai paketes nav pazaudētas katrai paketei pieliekot sequence number, kuru arī lieto lai pārliecinātos, ka dati ir piegādāti sākotnējā secībā. Par sekmīgi saņemtajām paketēm, TCP sūta atpakaļ apstiprinājumus (acknowledgement). Ja sūtītājs laicīgi (kamēr nav iestājies taimauts) nesaņem apstiprinājumu, paketi uzskata par pazaudētu un nosūta vēlreiz. TCP pārbauda vai paketes dati nav bojāti, lietojot kontrolsummu.

TCP nav optimizēts letošanai bezvadu tīklos. Pieņem, ka visi pakešu zudumi (packet loss) rodas nepietiekamas datu kanāla caurlaidības dēļ. Bezvadu tīklos pakešu zudumi rodas lielākoties citu iemeslu dēļ. Tas samazina TCP ātrumu šādos apstākļos, jo pēc katras pazaudētās paketes TCP samazina sūtīšanas ātrumu.

Lai arī TCP ir internetā visplašāk lietotais transporta slāņa protokols, ir daži pielietojumi, kur tas nav piemērots (tur lieto UDP):

  • TCP nodrošina secīgu datu pārraidi, ja daļa datu pazūd, tos pārsūta velreiz un tas rada aizķeršanos. Dažiem pielietojumiem (spēles, voip) šāda aizķeršanās ir nevēlamāka kā datu zudumi.
  • TCP ir relatīvi sarežģīts protokols, lai atvērtu konnekciju vien vajag 3 paketes (no kurām neviena nenes derīgos datus). Vēl, TCP darbināšanai vajag vairāk atmiņas nekā UDP (tam nav nozīmes datoriem, bet var būt nozīme PXE).

Satura rādītājs

[izmainīt šo sadaļu] Protokola darbība

Atšķirībā no UDP, kas var sākt sūtīt datus bez jebkādas iepriekšējas sagatavošanās, TCP nodrošina konnekcijas, kuras vispirms vajag izveidot, pirms var sākt sūtīt datus. TCP konnekcijām ir 3 dzīves stadijas:

  • Izveidošana (konnekcijas atvēršana)
  • Datu pārraide (konnekcija ir atvērta)
  • Aizvēršana (konnekcijas aizvēršana)

Konnekciju galapunkti datorā ir soketi (sockets). TCP tiem var būt 11 stāvokļi:

  1. LISTEN - šajā stāvoklī sokets gaida konnekcijas pieprasījumu no ārpuses, šo lieto visi TCP serveri
  2. SYN-SENT - šeit nupat no šejienes ir nosūtīts konnekcijas pieprasījums uz ārēju serveri un sokets gaida atbildi
  3. SYN-RECEIVED - sokets nupat ir nosūtījis SYN paketi un gaida saņemšanas apstiprinājumu (ACK) (šo lieto TCP serveri. Šajā stadijā nonāk LISTEN konnekcijas pēc konnekcijas pieprasījuma saņemšanas un apstiprinājuma nosūtīšanas)
  4. ESTABLISHED - caur šo soketu ir atvērta darbojoša konnekcija, caur kuru var pārsūtīt datus
  5. FIN-WAIT1 - konnekcijas aiztaisīšanas stadija, no šejienes ir nosūtīts konnekcijas aiztaisīšanas pieprasījums uz otru galu un šis sokets gaida atbildi
  6. FIN-WAIT2 - konnekcijas aiztaisīšanas stadija, saņēmis konnekcijas aiztaisīšanas pieprasījumu (no otra gala) un gaida pēdējo ACK
  7. CLOSE-WAIT - konnekcijas aiztaisīšanas stadija, otrs gals pieprasīja aiztaisīt konnekciju, šis aizsūtīja apstiprinājumu un nonāca te
  8. CLOSING - konnekcijas aiztaisīšanas stadija, abi gali mēģināja aiztaisīt konnekciju vienlaicīgi
  9. LAST-ACK - konnekcijas aiztaisīšanas stadija, gaida, kamēr pienāks pēdējās šai konnekcijai piederošās paketes
  10. TIME-WAIT - konnekcijas aiztaisīšanas stadija, šajā stadijā sokets nonāk pēc konnekcijas aiztaisīšanas pieprasījuma nosūtīšanas uz otru galu, te sokets gaida apstiprinājumu tam pieprasījumam. Saskaņā ar rfc793, šajā stadijā sokets var būt ne ilgāk kā 4 minūtes.
  11. CLOSED - šajā stadijā konnekcija ir aiztaisīta, te atrodas vai nu pirms konnekcijas atvēršanas (vienalga, aktīvās vai pasīvās) vai arī pēc konnekcijas aizaisīšanas.

[izmainīt šo sadaļu] Konnekcijas atvēršana

Lai klients varētu pieslēgties serverim, tur ir jābūt atvērtam portam (passive open). Pēc tam klients uz turieni var sūtīt konnekcijas pieprasījumu. TCP, tāpat kā UDP, ir klienta-servera bāzēts protokols. Visas TCP implementācijas spēj darboties gan kā klients, gan kā serveris. Klients atver konnekciju uz serveri. Konnekcijas sastāv no divien vienvirziena datu kanāliem.

  1. Klients sūta konnekcijas atvēršanas pieprasījumu (SYN) uz severi (active open)
  2. Serveris atbild ar SYN-ACK
  3. Klients apstiprina servera SYN-ACK ar ACK.

Piemērs:

  1. Klients aizūta serverim SYN paketi (ar aktīvu SYN flag). Visas SYN paketes satur numuru (sequence number), tas ir 32 bitu lauks TCP paketes hederī, sākumam parasti paņem nejaušu skaitli. Šajam piemēram pieņemam x.
  2. Otrs gals (serveris) saņem paketi un pieraksta tās numuru (sequence number), kas šajā gadījumā ir x un nosūta atpakaļ paketi ar SYN un ACK (aktīvi SYN un ACK flagi paketes hederī). ACK ir 32 bitu lauks paketes hederī, tas satur nākamās sagaidāmās paketes numuru, kas šajā gadījumā ir x+1, ar šo paketi vienlaikus tiek atvērta pretējā virziena konnekcija, kuras vajadzībām lieto sākotnējo numuru (sequence number) y.
  3. Sākotnējais dators (klients) aizsūta ACK paketi, kurai ACK laukā ir y+1. Ar to abu virzienu konnekcijas ir sasinhronizētas.

[izmainīt šo sadaļu] Datu pārraide

Galvenās TCP atšķirības no UDP ir:

  • secīga datu pāraide,
  • atkārtota pazaudēto pakešu nosūtīšana,
  • ja vienas uz tās pašas paketes pienāk vairākkārtīgi, tad liekos eksemplārus izmet,
  • ja paketei neatbilst kontrolsumma, to arī izmet (un gaida kad atsūtīs jaunu, labāku),
  • plūsmas vadība (congestion control un flow control)

Atverot konnekciju, abi datori apmainās ar numuriem (sequence numbers), tie numuri var būt jebkādi skaitļi, šis skaitlis apraksta no attiecīgā datora nosūtīto baitu skaitu, katrai nākamajai paketei tas palielinās par iepriekšējā paketē nosūtīto baitu skaitu. Paketes apstiprinājumi (ACK) satur nākamo sagaidāmo sequence number (pēdējais saņemtais baits +1). Ja paketes pazūd, pārsūta visu kopš pēdējā veiksmīgi apstriprinātā baita. Sequence number un ACK nodrošina dubulto pakešu identifikāciju (tām tie būs vienādi), pazaudēto pakešu atkārtotu nosūtīšanu (ja sūtītājs laicīgi nesaņem ACK tas uzskata, ka pakete ir pazaudēta un nosūta vēlreiz) un secīgu datu pārraidi (numuri (sequence numbers) atbilst nosūtīto baitu skaitam, ja saņem mazāk baitu kā būtu jābūt pēc tiem numuriem, ir skaidrs, ka pa vidu kautkā trūkst.

Lai pārliecinātos, ka dati pārsūtīšanas laikā nav bojāti, lieto 16bitu kontrolsummu.

Plūsmas vadība (congestion control un flow control). Šajām vajadzībām TCP lieto vairākus mehānismus, kuri regulē nosūtīšanas ātrumu. Sūtītāji tam lieto saņemtos un nesaņemtos ACK. (Ja saņem ACK, uzskata, ka dati ir aizgājuši veiksmīgi, ja nesaņem - ka ir pazaudēti) Par galveno datu pazaudēšanas iemeslu uzskata savienojuma nepietiekamo datu caurlaidību (kā dēļ rūteri ir bijuši spiesti paketes izmest).

Pārraides logs (transmit window) ir ienākošo datu bufera izmērs, tas ir maksimālais datu daudzums, kādu var nosūtīt sūtītājs nesaņemot ACK. ACK paketes satur datus par atlikušo pārraides loga vietu. Ja sūtītājs saņem paziņojumu, ka pieejamais pārraides loga izmērs ir 0, tas pārtrauc sūtīt un gaida. Lai novērstu situāciju, kad ja pakete kas ziņoja par jaunu brīvo vietu pārraides logā ir pazaudēta un komunikācijas iestrēgst, sūtītājs ik pa laikam nosūta mazu paketi, kurai atbilstošais ACK satur pēdējo pārraides loga (transmit window) izmēru.

[izmainīt šo sadaļu] Konnekcijas aiztaisīšana

Aiztaisot konnekciju parasti tiek nosūtītas 4 paketes. Viens gals sāk konnekcijas aiztaisīšanu nosūtot FIN paketi, kuru otrs gals apstiprina ar ACK. Lai aiztaisītu otru konnekcijas pusi, vajag vēl divas tādas pašas paketes pretējā virzienā. Dažreiz pirmo ACK apvieno ar otro FIN, tad var iztikt ar 3 paketēm. Ja pazūd sakari (nevienai nosūtītajai paketei nepienāk ACK), tad arī konnekcija nobrūk.

[izmainīt šo sadaļu] TCP porti

TCP lieto poru numurus, lai identificētu sūtošās un saņemošās programmas konnekciju galapunktos. Katram TCP konnekcijas galam ir piesaistīts 16 bitu skaitlis - porta numurs, pēc kura identificē ienākošās paketes. Noteiktiem serveriem parasti piesaista noteiktus portu numurus (piem http - 80, smtp - 25), kurus lieto kā noklusēto vērtību.

[izmainīt šo sadaļu] TCP segmentu struktūra

TCP sadala ienākošo datu plūsmu segmentos (paketēs), kuras tālāk ievieto IP paketēs nosūtīšanai tālāk. TCP segments sastāv no divām daļām - hedera un datiem. TCP hederis sastāv no 11 laukiem, no kuriem 10 ir obligāti.

TCP Header
+ Biti 0–3 4–7 8–15 16–31
0 Source port Destination port
32 Sequence number
64 Acknowledgment number
96 Data offset Rezervēts Flags Window
128 Kontrolsumma Urgent pointer
160 Options (optional)
160/192+  
Dati
 
  • Source port - identificē portu, no kura segments ir ticis nosūtīts
  • Destination port - identificē portu, uz kuru segmentu sūta
  • Sequence number' - paketes numurs, tam ir divas nozīmes:
    • Ja SYN ir aktīvs, tad tas ir sākotnējais numurs (sequence number) un pirmajam datu baitam atbilst šis skaitlis +1
    • Ja SYN nav aktīvs, tad tas atbilst pirmajam datu baitam
  • Acknowledgement number - ja ACK ir aktīvs, tad šī lauka vērtība ir sūtītāja sagaidāmais nākamais sequence number
  • Data offset - norāda TCP hedera izmēru 4baitos un attiecīgi nobīdi līdz datu sākumam. Minimālais izmērs ir 5 (maksimālais - 15).
  • Rezervēts - šis lauks ir rezervēts nākotnes vajadzībām un tam ir jābūt 0.
  • Flags - 8 1 bita lauki:
    • CWR - congestion window reduced šo uzliek sūtītāji, lai norādītu, ka saņēmuši ACK ar aktīvu ECE
    • ECE - ECN-echo norāda, ka otra gala ierīce spēj darboties ar ECN protokolu (TCP paplašinājums)
    • URG - norāda, ka Urgent pointer lauks satur kautkādu vērtību
    • ACK - norāda, ka Acknowledgement number lauks satur kautkādu vērtību (pakete satur apstiprinājumu kādai no iepriekšējām paketēm)
    • PSH - norāda, ka dati ir steidzami un tos programmai jāpiegādā nekavējoties (negaidot, kamēr piepildīsies buferis)
    • RST - aiztaisa konnekciju (vardarbīgi), šo lieto arī lai atteiktu konnekciju
    • SYN - sinhronizē numurus (sequence numbers)(atverot konnekciju)
    • FIN - no sūtītāja vairāk datu nebūs (aiztaisot konnekciju)
  • Window - atlikušais pārraides loga izmērs (šo norāda saņemošais gals)
  • Kontrolsumma - 16 bitu kontrolsumma lai pārbaudītu vai hederī un datos nav kļūdu. To aprēķina pēc līdzīga algoritma kā IP kontrolsummu.
  • Dati - tie ir pārsūtāmie dati un nav daļa no hedera.

Kontrolsummu aprēķina datiem, visam TCP hederim (aizvietojot kontrolsummas lauku ar nullēm) un daļai IP hedera, kas satur abas adreses, paketes garuma lauku (16bit) protokola lauku (8bit)(identificē TCP un ir 6) un tukšu 8 bit lauku. (pēdējie 3 pretējā secībā). IPv6 gadījumā paketes garuma lauks nāk tieši aiz adresēm un ir 32bit, pēc tam ir 24bit nulles un aiz tām ir next header lauks kas identificē TCP un ir 8bit.