Živě.cz o počítačích a internetu

Umíme to s Delphi: 127. díl – protokoly TCP/IP pro začátečníky

Václav Kadlec - 26.4.2004

V současnosti se náš seriál zabývá problematikou síťových aplikací v Delphi. V minulých dílech jsme si nejprve vysvětlili několik klíčových informací, které se týkaly úplných základů při práci s počítačovými sítěmi a programování síťových aplikací; následně jsme společně naprogramovali jednoduchý TCP server a jednoduché TCP klienty, kteří dokázali se serverem komunikovat a posílat mu textové zprávy.

Programování serveru i klientů proběhlo jaksi živelně, bez toho, abychom znali jakékoliv teoretické podrobnosti o fungování socketů a odpovídající komponent v Delphi. Cílem příkladů však bylo, abyste co nejrychleji a nejdříve získali představu o tom, co se skrývá po zadáním „naprogramujte síťovou aplikaci pomocí socketů“.

V tomto seriálu se však nesnažím poskytnout vám jen praktické rady (k tomu slouží spíše seriálů o tipech a tricích), ale také předat vám všechny podstatné teoretické vědomosti, ktré se dané oblasti týkají. A tím se již nezvratně dostáváme k náplni dnešního dílu: jeho obsah bude tvořen popisem dvou hlavních síťových komunikačních protokolů, které sockety používají k realizaci spojení a k veškeré funkčnosti, kterou nám poskytují.

Nutné informace o protokolu IP

Před několika díly jsme si řekli, že celosvětová počítačová síť (tedy Internet) je ve své podstatě postavena na dvou hlavních komunikačních protokolech. Těmi jsou:

Ještě jednou pro jistotu připomeneme, že pod slovem „protokol“ se skrývá přesný a jednoznačný popis pravidel pro vzájemnou komunikaci všech zúčastněných členů, tedy všech relevantních účastníků naší síťové komunikace (v příkladech z předchozích dílů tedy serverů a klientů).

Podrobný popis protokolů začneme protokolem IP (Internet Protocol). Ten zajišťuje přenos tzv. IP datagramů. Co to je datagram? Lze si jej představit jako malou část dat, která je opatřena vlastním záhlavím. Přenos datagramů pomocí protokolu IP je zajišťován mezi dvěma koncovými uzly v Internetu (tedy mezi dvěma koncovými počítači, které jsou na Internet připojeny).

V této souvislosti však vyvstává jedna podstatná a nevyhnutelná otázka. Jak se pozná, od koho IP datagram je a komu se vlastně má doručit?

Dostáváme se k tomu, co jsme si vlastně o sítích a o internetu už také naznačili. Každý počítač, který chce komunikovat v Internetu, musí totiž mít svou unikátní adresu. Tato adresa se nazývá „IP adresa“ a má tvar např. 147.228.58.123. Jedná se tedy o čtyři čísla, každé z nich je v rozsahu od nuly do 255; čísla jsou oddělena tečkou.

Některé IP adresy jsou speciální. Jedním z hlavních představitelů speciální IP adresy je adresa 127.0.0.1. Pokud jste pravidelným čtenářem tohoto seriálu, jistě si vzpomenete, že právě tuto adresu jsme používali při programování jednoduchého serveru a klienta k tomu: adresa 127.0.0.1 je vyhrazena pro tzv. lokální softwarovou smyčku. Co to znamená? Pokud něco pošleme na adresu 127.0.0.1, pošleme to vlastně sami sobě, a to ať jsme kdekoliv. 127.0.0.1 adresuje lokální počítač, tj. počítač, na kterém tuto adresu uvedeme.

Výhoda adresy 127.0.0.1 spočívá v tom, že na jednom počítači můžeme spustit aplikaci serveru a současně i několik aplikací klientů a komunikace pak může probíhat právě přes tuto adresu. Přitom však zůstává zachován síťový charakter celé komunikace: přestože počítač komunikuje vlastně „sám se sebou“, všechny systémové vrstvy se tváří, jako že jde o plnohodnotnou síťovou komunikaci (a k tomu, abyste mohli používat komunikaci na 127.0.0.1, musíte mít také nainstalovány potřebné síťové ovladače, např. ovladač TCP/IP apod.). V minulém článku jsme si také ukázali, že pokud používáte jakýkoliv program pro monitorování síťové komunikace (např. firewall apod.), bude tento program „křičet“ i při pokusu komunikovat s adresou 127.0.0.1.

Prosím tě, mrkni mi na 102.94.64.127

IP adresy jsou tedy užitečné v tom smyslu, že dokážou odlišit všechny počítače připojené v současnosti (i v blízké budoucnosti) do celosvětové sítě internet. Předchozí větu mohou snadno napadnout všichni znalci počítačových sítí, protože celá situace ještě není tak jednoduchá (existují lokální sítě, v nichž jsou sice počítače také rozlišeny unikátními IP adresami, avšak celá síť je „schována“ za jedním speciálním počítačem – proxy serverem, firewallem, takže se pro okolní svět jeví nikoliv jako počítačová síť , ale jako jeden počítač identifikovaný IP adresou proxy/firewallu apod.), nicméně tyto speciality můžeme pro jednoduchost ignorovat; ostatně na principu celé věci vlastně nic nemění.

Protože IP adresy nejsou příliš dobře zapamatovatelné a pro běžného (i neběžného) člověka by bylo jejich používání značně nepohodlné, používají se místo adres dobře zapamatovatelná (slovní, textová) jména – např. http://www.zive.cz/. Co to však znamená?

Pokud zadáte do internetového prohlížeče nějakou www adresu, například http://www.dbsvet.cz/, nemá tato adresa zdánlivě nic společného s IP adresou (aaa.bbb.ccc.ddd), o které jsme před okamžikem hovořili. Ve skutečnosti však dojde k jejímu převodu právě na příslušnou IP adresu.

Tento převod zajišťuje propracovaný jmenný systém DNS (Domain Name System), který představuje celosvětovou databázi jmen a příslušných IP adres rozmístěnou po různých specializovaných serverech v Internetu.

Své textové označení má i speciální adresa 127.0.0.1, které odpovídá jméno „localhost“. Pokud zadáte do svého internetového prohlížeče adresu „localhost“ (na místo, kam obvykle zadáváte www adresu), zobrazí prohlížeč zřejmě hlášku o tom, že stránku nelze zobrazit. Pokud byste však na svém počítači provozovali webový server, byla by situace jiná: po zadání adresy localhost do prohlížeče by se zobrazily stránka zobrazená na vašem lokálním počítači, kterou máte ve svém webovém serveru definovánu jako výchozí, viz následující obrázek:

V tomto okamžiku jste možná částečně zbystřili a na jazyk se vám dere následující otázka:

Adresa 127.0.0.1 slouží k lokální komunikaci; lze s ní komunikovat s lokálním počítačem i přesto, že tento lokální počítač není vůbec nijak připojen k internetu ani k lokální síti a ani nikam jinam. Pokud jsme před okamžikem řekli, že jmenný systém DNS je tvořen celosvětovou databází propojených serverů, které si pro každou (jmennou) adresu „pamatují“ odpovídající IP adresu, jak je možné, že můžeme použít jmennou adresu localhost, když nejsme připojeni k žádnému DNS serveru, který by ji dokázal převést na odpovídající IP adresu, tedy 127.0.0.1?

Odpověď na tuto otázku se skrývá v souboru hosts, který je umístěn v systémovém adresáři (Windows). Tento soubor obsahuje definovaná mapování vybraných IP adres na jména. Do tohoto souboru můžeme cokoliv připsat nebo z něj naopak cokoliv odebrat: Microsoft TCP/IP stack tento soubor používá přednostně před kontaktováním DNS serverů, takže pokud nejsou tyto servery dostupné, použijí se informace uvedené v souboru hosts.

Všimněte si, že v souboru host máte uvedenu (kromě jiných) následující řádku:

127.0.0.1      localhost

Tato řádka právě říká, že IP adrese 127.0.0.1 odpovídá doménové jméno localhost, proto můžete toto jméno používat vždycky, i v případě, že není k dispozici žádné připojení k síti.

Poznámka: mimochodem, souboru hosts můžete s výhodou využít v případě, že se chcete třeba zbavit reklamních bannerů, které se zobrazují na drtivé většině internetových stránek. Pokud dokážete „odchytat“ co největší množství provozovatelů reklamních systémů, uvedete je do souboru hosts a namísto IP jejich skutečné adresy je tímto způsobem „přesměrujete“ na 127.0.0.1, budete se moci kochat stránkami bez reklam, protože všechny požadavky na zobrazení banneru od reklamního poskytovatele se v rámci vašeho systému přesměrují na volání localhost, a proto se žádné reklamy z žádného serveru vůbec nenačtou. V této souvislosti stojí také za zmínku, že na internetu lze najít spoustu souborů hosts (autoři se dokonce předhánějí, kdo do něj uvede víc reklamních provozovatelů a odchytá tak větší procento reklam); stačí najít nějaký obzvláště vypečený a nakopírovat jej do svého systémového adresáře namísto stávajícího souboru hosts a je po reklamě.

Neodpustím si však ještě jednu poznámku – je sice pravdou, že reklamní bannery jsou často otravné, na druhou stranu si však musíme uvědomit, že celá řada bezplatných webových projektů se drží při životě právě jen díky zobrazování reklamních bannerů a příjmům od zadavatelů reklamy; pokud bychom si všichni vypnuli zobrazování reklamy, mnohé webové projekty by zkrátka neměly z čeho žít a skončili by. Nicméně tato úvaha záleží samozřejmě na každém z nás: buď jsme ochotni překousnout zobrazování reklam a mít za to na internetu bezplatný obsah, a nebo si reklamy houfně vypneme a za všechno budeme začneme platit.

Tím jsme se však dostali poněkud stranou od původní náplně dnešního dílu :-) Věřím, že mi to odpustíte. Vraťme se k popisu síťových protokolů: popsali jsme si protokol IP, s nímž souvisí také adresování v internetu (tedy IP adresy, doménové názvy a jmenné služby DNS). Dalším protokolem, na kterém je síťová komunikace založena, je TCP.

Protokol TCP

Druhý z protokolů, které si dnes vysvětlíme, se nazývá TCP (Transmission Control Protocol, protokol pro kontrolu přenosu). Už z jeho názvu vyplývá, že se bude zřejmě více starat o přenos dat jako takový: vskutku, protokol TCP zajišťuje tzv. spojované služby. Znamená to, že se stará o navázání spojení (proto spojované); po navázání spojení a zaslání dat musí příjemce potvrdit, že data přijal. V případě, že potvrzení nedojde (tj. ztratila se data nebo se ztratilo potvrzení) jsou data zopakována – zaslána znovu.

Jeden z rozdílů mezi protokoly IP a TCP spočívá v tom, že zatímco IP garantuje pouze tzv. „best effort delivery“ (tedy zaručuje, že se pokusí doručit data, ale negarantuje, že se to podaří), protokol TCP garantuje (prostřednictvím mechanismu potvrzování), že data budou doručena.

Ve skutečnosti existuje celá řada strategií, jakým způsobem navazovat spojení (např. známé three-way handshake), jakým způsobem potvrzovat přijetí dat (kladné potvrzování, záporné potvrzování apod.), jakým způsobem data posílat (číslovat jednotlivé balíčky dat – packety apod.), v jakém množství (používat tzv. klouzavé okénko, sliding window, takže je možné poslat víc očíslovaných packetů a počkat na potvrzení posledního z nich apod.), nicméně pro jednoduchost není nutné se těmito otázkami zabývat.

Co je však důležité: protokol TCP používá ke své činnosti právě protokolu IP, který jsme popisovali v první části tohoto článku. Protokol TCP zjednodušeně „přijímá“ a „posílá“ data právě přes protokol IP. Čili: protokol TCP chce poslat data, nicméně postará se pouze o navázání spojení a o zasílání dat a přijímání potvrzení. Samotné posílání dat, tedy realizaci síťové komunikace mezi dvěma počítači ležícími kdesi v širém internetu, zajišťuje protokol IP (a používá k tomu všechny mechanismy, které jsme si popsali výše, tedy DNS, IP adresy apod.). Protokol TCP pouze „kontroluje“, „řídí“ spojení, tedy stará se o to, aby všechna data došla k příjemci. Sám je ale vlastně nepřenáší, k tomu využívá protokol nižší vrstvy, tedy IP.

Na rozdíl od protokolu IP ale TCP vytváří spojení ne mezi dvěma libovolnými počítači v internetu, ale mezi dvěma aplikacemi (je to protokol vyšší vrstvy). Co to však znamená?

Protože na jednom počítači může běžet více aplikací (využívajících protokol TCP) současně,

potřebujeme mít nějaký další mechanismus, jak rozlišovat nejen mezi počítači v internetu (k tomu máme IP adresy, které využívá IP protokol), ale také mezi jednotlivými aplikacemi – službami. K tomuto účelu se používá právě tzv. číslo portu. Pokud jste společně s námi programovali ukázkové aplikace v předchozích dvou částech tohoto seriálu, jistě si vzpomenete, že kromě IP adresy jsme pro příslušné komponenty Delphi nastavovali také číslo portu, které jsme si sami zvolili. V našem konkrétním případě se jednalo o číslo 5050.

Číslo portu musí být v intervalu mezi 0–65 535, avšak porty s čísly pod 1 024 jsou označeny jako privilegované a slouží výhradně pro základní služby, jako jsou http (80) nebo telnet (21) apod. Při programování vlastní síťové aplikace si však volíme číslo portu podle svých preferencí a představ: na číslu portu vlastně vůbec nezáleží, záleží pouze na tom, aby jej znal jak server, tak i klient, zkrátka aby se při komunikaci na tomto čísle portu „shodli“.

Na závěr

Dnešní článek se pokusil vnést trochu světla do síťové problematiky. Pověděli jsme si nejdůležitější informace týkající se základních přenosových protokolů, které jsou využívány sockety, tedy protokolů TCP a IP. Vysvětlili jsme si, že protokol IP používá k adresování počítačů v internetu tzv. IP adresy, a že každý poítač může být kromě IP adresy označen také doménovým jménem. Převod jmen na adresy je realizován jmenným systémem DNS. Nad protokolem IP, který se stará o komunikaci na úrovni počítačů prostřednictvím datagramů, běží protokol TCP, který má nastarosti spojované služby, tj. stará se o navazování s udržování spojení a o komunikaci mezi jednotlivými aplikacemi na síťových počítačích. K identifikaci příjemce nestačí znát jeho IP adresu, ale musíme vědět také číslo portu, které vlastně označuje požadovanou službu.

V příštím díle se podíváme na to, jak s tímhle vším souvisí sockety.