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.](/file/23364/Chip_1997-10_cd.bin/tema/_peterka/gifs/t311c111.gif) |
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.](/file/23364/Chip_1997-10_cd.bin/tema/_peterka/gifs/t311c112.gif) |
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