VyÜlo v t²denφku: COMPUTERWORLD
╚φslo:11/93
RoΦnφk:1993
Rubrika/kategorie: Co je Φφm ... v poΦφtaΦov²ch sφtφch
Dφl:60

zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ dφl | nßsledujφcφ dφl

Ji°φ Peterka: Co je Φφm ... v poΦφtaΦov²ch sφtφch (60):

Protokol TCP - IV.

Po p°edchßzejφcφch t°ech dφlech, ve kter²ch jsme se zab²vali celkovou filosofiφ protokolu TCP a jeho p°φstupem k °eÜenφ r∙zn²ch problΘm∙, ji₧ m∙₧eme b²t pon∞kud konkrΘtn∞jÜφ. M∙₧eme si ukßzat p°esn² formßt datov²ch blok∙, se kter²m protokol TCP pracuje.

Obrßzek 60.1.
Obr. 60.1.: Formßt TCP segmentu
Nejprve si ale p°ipome≥me (v souladu s 57. dφlem), ₧e bloky dat, p°enßÜenΘ protokolem TCP jako celek, se oznaΦujφ jako segmenty (segments), zatφmco v p°φpad∞ alternativnφho protokolu UDP jde o tzv. u₧ivatelskΘ datagramy (user datagrams). V obou p°φpadech je p°enßÜen² datov² blok tvo°en dv∞ma hlavnφmi Φßstmi: hlaviΦkou (header) a vlastnφmi daty. Zatφmco ale v p°φpad∞ protokolu UDP staΦφ, kdy₧ hlaviΦka krom∞ zabezpeΦovacφho ·daje a p°φznaku dΘlky obsahuje ji₧ jen ·daj o portu koncovΘho p°φjemce a odesilatele (viz obr. 56.2 v 56. dφlu), hlaviΦka TCP segmentu musφ b²t obsa₧n∞jÜφ - jak je ostatn∞ mo₧nΘ oΦekßvat v p°φpad∞ v²razn∞ slo₧it∞jÜφho p°enosovΘho protokolu. P°esn² formßt segmentu protokolu TCP ukazuje obrßzek 60.1.

╚φm je urΦeno spojenφ

SpojovanΘ (connection-oriented) protokoly, mezi kterΘ pat°φ i protokol TCP, musφ v₧dy n∞jak²m zp∙sobem identifikovat konkrΘtnφ spojenφ, po kterΘm jsou urΦitß data p°enßÜena. SpojovanΘ protokoly sφ¥ovΘ vrstvy majφ blφ₧e k p°edstav∞ spojenφ jako kanßlu, kter² n∞kudy vede, a tak jej obvykle oznaΦujφ jednoznaΦn²m identifikßtorem (nap°. Φφslem). Tento identifikßtor pak pou₧φvajφ jak pro zanesenφ p°φsluÜnΘ cesty do sm∞rovacφch tabulek mezilehl²ch uzl∙, p°es kterΘ spojenφ prochßzφ, tak i ve vlastnφch datov²ch paketech pro urΦenφ cesty, kterou majφ b²t p°enßÜeny (mφsto adresy p°φjemce). SpojovanΘ protokoly na ·rovni transportnφ vrstvy (co₧ je p°φpad protokolu TCP) vÜak ji₧ "nevidφ" ₧ßdnΘ mezilehlΘ uzly, nepot°ebujφ brßt je v ·vahu, a je pro n∞ p°irozen∞jÜφ identifikovat spojenφ dvojicφ: .

Co je ale koncov²m a poΦßteΦnφm bodem spojenφ v p°φpad∞ protokolu TCP? IP adresa p°φjemce a odesilatele nestaΦφ, nebo¥ ta jednoznaΦn∞ identifikuje pouze uzlov² poΦφtaΦ, a nikoli ji₧ konkrΘtnφ entitu aplikaΦnφ vrstvy v rßmci danΘho uzlu. Obdobn∞ nenφ samo o sob∞ dostateΦnΘ ani Φφslo portu (viz 55. dφl), kterΘ zase identifikuje aplikaΦnφ entitu v rßmci danΘho poΦφtaΦe. PoΦßteΦnφ (a stejn∞ tak i koncov²) bod spojenφ m∙₧e b²t urΦen a₧ dvojicφ <IP adresa, Φφslo portu>.

Obrßzek 60.2.
Obr. 60.2.: TCP segment a jeho pseudohlaviΦka
Jak ovÜem vypl²vß z obrßzku 60.1., v TCP segmentu jsou vyjßd°eny pouze Φφsla port∙ odesilatele a p°φjemce. Pot°ebnΘ IP adresy jsou pak, obdobn∞ jako v p°φpad∞ protokolu UDP, souΦßstφ tzv. pseudohlaviΦky (viz obr. 60.2), kterß je shodnß s pseudohlaviΦkou protokolu UDP (samoz°ejm∞ a₧ na obsah pole PROTO, kterΘ identifikuje transportnφ protokol, a pro TCP mß hodnotu 6). Stejn² jako u protokolu UDP je i v²znam pseudohlaviΦky a zp∙sob jejφho vyu₧itφ - je zahrnuta do v²poΦtu kontrolnφho souΦtu (polo₧ka CHECKSUM v TCP segmentu), ale ve skuteΦnosti p°enßÜena nenφ. Obsah jednotliv²ch polo₧ek (p°edevÜφm pak ob∞ IP adresy) dostßvß transportnφ vrstva na stran∞ p°φjemce od vrstvy sφ¥ovΘ - stejn²m zp∙sobem, kter² jsme si popisovali ji₧ v 56. dφlu.

KladnΘ potvrzovßnφ

Z p°edchozφch dφl∙ ji₧ takΘ vφme, ₧e protokol TCP pou₧φvß kladnΘ potvrzovßnφ - nikoli ovÜem cel²ch blok∙ (segment∙), ale jednotliv²ch byt∙ (osmibitov²ch oktet∙). P°φjemce i odesilatel se dφvajφ na p°enßÜenß data jako na lineßrnφ posloupnost byt∙, a v ka₧dΘm segmentu se vlastn∞ p°enßÜφ Φßst tΘto lineßrnφ posloupnosti. Kterß Φßst to je, udßvß polo₧ka SEQUENCE NUMBER v hlaviΦce segmentu (vyjad°ujφcφ pozici prvnφho p°enßÜenΘho bytu v tΘto posloupnosti). KladnΘ potvrzenφ, kterΘ p°φjemce vracφ odesilateli v p°φpad∞ ·sp∞ÜnΘho p°φjmu, pak mß op∞t formu pozice bytu v uva₧ovanΘ lineßrnφ posloupnosti - tentokrßte ale pozice prvnφho bytu, kter² p°φjemce oΦekßvß jako dalÜφ (polo₧ka ACKNOWLEDGEMENT NUMBER). V polo₧ce WINDOW je pak vyjßd°ena velikost datovΘho okΘnka, kterΘ p°φjemce nabφzφ odesilateli, a kterΘ ve svΘ podstat∞ signalizuje, kolik volnΘho mφsta ve svΘ vyrovnßvacφ pam∞ti mß p°φjemce jeÜt∞ k dispozici (viz minul² dφl).

Je dobrΘ si uv∞domit, ke kterΘmu sm∞ru p°enosu se obsah t°φ prßv∞ uveden²ch polo₧ek vztahuje. Uva₧ujeme-li segment, sm∞°ujφcφ od uzlu A do uzlu B, t²kß se jeho polo₧ka SEQUENCE NUMBER p°enosu v tΘm₧e sm∞ru (tj. od A do B), zatφmco potvrzenφ v polo₧ce ACKNOWLEDGEMENT NUMBER se vztahuje k p°enosu dat v opaΦnΘm sm∞ru (tj. od B do A). Stejn∞ tak se i obsah polo₧ky WINDOW t²kß p°enosu dat v opaΦnΘm sm∞ru (od B do A).

NalΘhavß data

Jak jsme si ji₧ takΘ naznaΦili, protokol TCP nabφzφ svΘ p°enosovΘ slu₧by ve form∞ proudu (stream) jednotliv²ch byt∙ - odesilatel na jednΘ stran∞ zadßvß k odeslßnφ postupn∞ jednotlivΘ byty, a p°φjemce si je na druhΘ stran∞ ve stejnΘm po°adφ vyzvedßvß. Lze si tedy p°edstavit, ₧e protokol TCP implementuje pomyslnou rouru, do kterΘ odesilatel z jednΘ strany jednotlivΘ byty vklßdß, a p°φjemce si je z druhΘ strany zase odebφrß. Uvnit° tΘto roury se vÜak m∙₧e nachßzet nezanedbateln² poΦet byt∙, kterΘ ji₧ byly odeslßny, ale nebyly dosud p°ijaty. A to m∙₧e u n∞kter²ch aplikacφ zp∙sobovat nemalΘ problΘmy. Nap°φklad p°i vzdßlenΘm p°φstupu pomocφ terminßlovΘ emulace se uvnit° pomyslnΘ roury nachßzφ znaky, kterΘ u₧ivatel ji₧ zadal z klßvesnice, ale kterΘ jeÜt∞ nebyly hostitelsk²m poΦφtaΦem p°ijaty a zpracovßny. Pot°ebuje-li vÜak u₧ivatel nßhle zadat vhodn² povel k p°eruÜenφ prßv∞ probφhajφcφ Φinnosti (tzv. break), musely by p°φsluÜnΘ °φdφcφ znaky postupn∞ projφt rourou a mohly by se uplatnit a₧ teprve tehdy, kdy₧ budou zpracovßny vÜechny p°edtφm zadanΘ znaky.

Protokol TCP vÜak prßv∞ pro tyto ·Φely nabφzφ mo₧nost "p°edbφhßnφ", dovolujφcφ vyslat p°φsluÜnΘ povely jako tzv. nalΘhavß data (urgent data), n∞kdy oznaΦovanß tΘ₧ jako data mimo po°adφ (out-of-band data). P°φznak toho, ₧e dan² segment obsahuje nalΘhavß data, je vyjßd°en nastavenφm p°φsluÜnΘho bitu v polo₧ce CODE BITS. Vlastnφ nalΘhavß data pak musφ b²t umφst∞na od zaΦßtku datovΘ Φßsti segmentu, a v polo₧ce URGENT POINTER je ukazatel na jejich konec v rßmci danΘho segmentu.

Po doruΦenφ nalΘhav²ch dat by m∞l b²t koncov² p°φjemce neprodlen∞ upozorn∞n na jejich existenci. Samotn² protokol TCP vÜak ji₧ nestanovuje, jak²m zp∙sobem se tak mß dφt. Ostatn∞ ani dost dob°e nem∙₧e, nebo¥ p°φsluÜn² mechanismus zßvisφ na konkrΘtnφ implementaci.

DalÜφ °φdφcφ bity v ÜestibitovΘ polo₧ce CODE BITS pak slou₧φ mj. pot°ebßm navazovßnφ a ruÜenφ spojenφ, operaci push (viz 57. dφl), umo₧≥ujφ zneplatnit polo₧ku ACKNOWLEDGEMENT NUMBER atd.

Segment ani jeho hlaviΦka nemajφ pevnou dΘlku

Velikost datovΘ Φßsti segmentu, a tφm i segmentu jako takovΘho, nenφ pevnß, a stejn∞ tak nemusφ b²t stejn∞ velkΘ ani segmenty, p°enßÜenΘ postupn∞ v rßmci tΘho₧ spojenφ. Celkovß dΘlka segmentu (tj. jeho datovΘ Φßsti i hlaviΦky) p°itom nenφ vyjßd°ena p°φmo v segmentu samotnΘm, ale a₧ v jeho pseudohlaviΦce (viz obr. 60.2., polo₧ka TCP LENGTH).

Otßzkou ovÜem je, jak volit optimßlnφ velikost segmentu. Zde je nutnΘ si uv∞domit, ₧e jednotlivΘ segmenty jsou vklßdßny do IP datagram∙, a ty zase do rßmc∙ (na ·rovni rßmc∙ vrstvy sφ¥ovΘho rozhranφ) - ka₧d² z nich si ale k "u₧iteΦn²m" dat∙m p°idßvß svß °φdφcφ data, kterß p°edstavujφ re₧ii p°enosu. V p°φpad∞ mal²ch segment∙ je tato re₧ie relativn∞ velkß, zatφmco v p°φpad∞ velk²ch segment∙ dochßzφ k fragmentaci, kdy₧ nelze umφstit celΘ segmenty resp. IP datagramy do p°enosov²ch rßmc∙. Optimßlnφ by byl co nejv∞tÜφ segment, p°i kterΘm jeÜt∞ nebude dochßzet k ₧ßdnΘ fragmentaci. Najφt jeho velikost je ale velmi netrivißlnφ (tato velikost toti₧ zßvisφ na mnoha faktorech, kterΘ se navφc mohou dynamicky m∞nit). Samotn² protokol TCP neobsahuje ₧ßdn² mechanismus pro nalezenφ optimßlnφ velikosti segmentu.

Co vÜak protokol TCP nabφzφ, je prost°edek, pomocφ kterΘho se ob∞ strany mohou dohodnout alespo≥ na maximßlnφ velikosti p°enßÜen²ch segment∙. Implicitn∞ pou₧φvß TCP maximum, kterΘ odpovφdß datovΘ Φßsti segmentu o velikosti 536 byt∙ (tak, aby se segment vΦetn∞ svΘ obvyklΘ hlaviΦky veÜel do IP datagramu implicitnφ velikosti 576 byt∙). Tato implicitnφ hodnota je zalo₧ena spφÜe na pesimistickΘm p°edpokladu, ₧e spojenφ mezi ob∞ma koncov²mi ·Φastnφky nenφ p°φmΘ, ale vede p°es jednu Φi n∞kolik bran, a mß malou propustnost. Pokud jsou vÜak oba koncovφ ·Φastnφci p°ipojeni nap°φklad k tΘmu₧ segmentu rychlΘ lokßlnφ sφt∞, je jist∞ ₧ßdoucφ, aby pln∞ vyu₧φvali jejφ v∞tÜφ Üφ°ku p°enosovΘho pßsma a jejφ schopnost p°enßÜet najednou v∞tÜφ bloky dat. Tedy volit v∞tÜφ maximßlnφ velikost segment∙.

KonkrΘtnφ mechanismus pro stanovenφ maximßlnφ velikosti segmentu vyu₧φvß volitelnΘ polo₧ky OPTIONS v hlaviΦce segmentu (viz obr. 60.1.). Je-li ovÜem tato polo₧ka volitelnß, stejn∞ tak jako je prom∞nnß jejφ dΘlka, nem∙₧e mφt pevnou dΘlku ani samotnß hlaviΦka TCP segmentu. KonkrΘtnφ velikost hlaviΦky (rozÜφ°enΘ v²plnφ ze sam²ch nul na nßsobek 16 bit∙) je pak vyjßd°ena v polo₧ce HLEN.


zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ dφl | nßsledujφcφ dφl
Tento Φlßnek m∙₧e b²t voln∞ Üφ°en, pokud se tak d∞je pro studijnφ ·Φely, na nev²d∞leΦnΘm zßklad∞ a se zachovßnφm tohoto dov∞tku. Podrobnosti hledejte zde, resp. na adrese http://archiv.czech.net/copyleft.htm