Internet

V minulém díle jsem vám slíbil, že se v další kapitole naučíte komunikovat po internetu. Nemyslel jsem ale tuto kaptilolu, ale až tu následující :-). V této kapitole vás provedu trochou teorie internetové komunikace.

Základní pojmy

Asi nikomu nemusím vysvětlovat, co jsou to ty internety, nebo že nesmíte hledat v googlu slovo google, jinak byste celý internet zničili :-).

Jako programátoři byste ale měli mít alespoň malou představu o tom, jak internet funguje. Proto vám tu na začátek napíšu pár základních pojmů, které byste měli znát, nebo alespoň měli umět předstírat, že je znáte. Faktem ale je, že k tomu abyste mohli posílat data po internetu v C/C++ většině z toho zas až tak moc rozumět nemusíte, protože C má knihovny, které udělají většinu špinavé práce za vás.

IPv4 adresa

IPv4 je 32-botové číslo, které slouží jako adresa počítače (nebo jakéhokoliv jiného zařízení) v síti. Obvykle se každý ze 4 bajtů tohoto čísla zapisuje zvlášť, v desítkové soustavě, oddělené tečkou. Tedy něco jako 162.209.15.98.

IP znamená internetový protokol, v4 je pak označení verze 4, tj verze se 4 bajty.

IP adresy se rozdělují do několika intervalů.

127.0.0.0 – 127.255.255.255
Tyto adresy se používají pro tzv. loopback, tj. pro posílání dat po „síti“ sám se sebou. Nejčastěji se používá pro loopback 127.0.0.1. Podívejte se do /etc/hosts, kde je tato IP adresa nastavena.
172.16.0.0 – 172.31.255.255 a 192.168.0.0 – 192.168.255.255
Toto jsou tzv. interní (neveřejné) IP adresy. Tyto adresy nejsou unikátní v rámci Interentu, ale pouze v rámci lokální (domácí) sítě. Pokud je váš poskytovatel internetu škrt, má váš počítač jednu z těchto adres. Což znamená, že se z venku nemůžete připojit ke svému počítači (k tomuto se ještě vrátím později).
224.0.0.0 – 224.0.0.255
Lokální multicast. Pokud pošlete zprávu na některou z těchto adres, dorazí na každý počítač v lokální síti, který se do multicatu „přihlásí“ Samozřejmě jen ten počítač, který se o zprávy přicházející na takovou adresu zajímá, tuto zprávu zpracuje. Ostatní ji ignorují a zahodí. Multicast se hodí například při hraní her. Server pošle jen jednu zrávu na multicast a ta dojde všem hráčům v lokální síti, místo aby opakoval každou zprávu pro každého hráče.
224.0.1.0 – 224.0.1.255, 224.0.2.0 – 238.255.255.255
Multicast pro veřejné adresy. Využívají se například pro vysílání rádií či televize po internetu.
239.0.0.0 – 239.255.255.255
Administrativní adresy pro lokální sítě

Všechny ostatní IP adresy se už používají pro identifikaci konkrétního stroje v síti.

Maska sítě

Počítačovou síť můžete rozdělit do několika menších sítí. Usnadňuje to administraci sítě i směřování komunikace. Představte si například velkou budovu, kterou chcete zasíťovat. Každému patru vytvoříte vlastní síť, kterou můžete spravovat samostatně.

Jak poznat, do jaké sítě patří počítač 192.168.254.121? Na základě masky sítě. To je 32-bitové číslo, které má bity na začátku nastaveny na samé jedničky a na konci samé nuly. Všechny bity z IP adresy, které odpovídají bitům s jedničkou z masky sítě, se považují za adresu sítě a všechny ostatní se považují za adresu počítače.

Například maska sítě 255.255.255.0 říká, že první 3 bajty jsou adresou sítě a poslední bajt identifikuje počítač v rámci této sítě. V síti s takovouto maskou můžete mít tedy max. 254 počítačů, protože první IP adresa ze sítě se používá jako číslo sítě (např. 192.168.254.0) a poslední jako broadcast (192.168.254.255). Ostaní IP adresy jsou už konkrétní adresy strojů v této síti (192.168.254.1 - 192.168.254.254).

Pokud pošlete něco na ip adresu broadcast, odešle se zpráva všem počítačům. Je to podobné, jako multicast. Do multicastu se ovšem počítače přihlašují, takže zpráva příjde jen všem přihlášeným počítačům. Samozřejmě i u broadcastu platí, ještě víc než u multicastu, že počítač takovou zprávu může ignorovat a zahodit.

Masku sítě můžete vidět zapsanou pomocí zkratky, kdy se za IP adresu píše jen počet bitů, které určují masku sítě (tedy počet bitů nastavených na 1). Například 192.168.254.121/24 označuje IP adresu v síti 192.168.254.0 s maskou 255.255.255.0. (Poslední číslo z IP adresy - 121 - určuje konkrétní počítač).

Router

Router je taková malá krabička, do které se zapojují síťové kabely z počítačů (nebo má i WiFI). Tato krabička se stará o posílání komunikace správným směrem. Když dostane požadavek na počítač ze sítě, ke které je připojen, pošle požadavek rovnou na správný počítač. Když z jiné sítě (což pozná podle masky sítě), pošle požadavek jinému routeru, který se o tento požadavek postará. Pro případ, že je požadavek na IP adresu z neznámé sítě, má router nastaven nějakou defaultní bránu, tedy nějaký konkrétní router, ke kterému je připojen, kterému požadavek předá a ten už se postará o jeho doručení.

Domácí uživatelé jsou připojeni k routeru svého poskytovatele internetu, který se o všechno postará. Router taky poskytuje IP adresu vašemu počítači pomocí protokolu DHCP. Funguje to asi tak, že se váš počítač zeptá, pomocí broadcast, všech počítačů na síti, jestli by mu někdo dal IP adresu. A router mu nějakou dá.

Switch a MAC adresy

Switch je další krabička, která se stará o komunikaci v rámci sítě. Switch se ale už nestará o IP adresu, ale o MAC adresu. To je adresa vaší síťové karty. Ta vypadá nějak tatko: 91:BD:98:4F:CA:23.

Na fyzické úrovni totiž dvě zařízení mezi sebou komunikují právě pomocí MAC adres. Switch se zeptá všech na síti, kdo má IP adresu třeba 192.168.254.121 a odpovědí mu bude MAC adresa 91:BD:98:4F:CA:23. Všechnu komunikaci pro tuto IP adresu pak směřuje na síťovou kartu s touto MAC adresou.

Dnes se obvykle prodávají krabičky, které fungují jako router a switch dohromady.

MAC adresa je pro každou síťovou kartu na světě unikátní! Je to něco jako otisk prstu. Naštěstí se dá na většině síťových karet snadno změnit :-). Dřív totiž poskytovali poskytovatelé internetu připojení jen pro jeden počítač (pokud jste si nezaplatili více) a ten identifikovali pomocí MAC adresy. Naštěstí se začali vyrábět switche a routery, kterým jste mohli změnit MAC adresu, tedy třeba na adresu vašeho počítače a pak si nastavit domácí síť s X počítači :-).

Packet

Když posíláte přes internet nějaký soubor, rozdělí se do tzv. packetů. Packety obsahují adresu odkud pocházejí a kam jdou, číslo pořadí a kus zprávy (kus souboru, který posíláte) a pár dalších informací.

Rozdělení zprávy do packetů umožňuje, mimo jiné, plynulejší chod sítě, viz animace níže.

Klikněte si třeba na PC a iPad. PC posílá dlouhou zprávu, která se rozdělí do 10 packetů. iPad posílá kratší zprávu, která se rozdělí do 5 packtů. Všiměte si, že jak se dostanou packety k routeru, posílají se v tom pořadí, v jakém přijdou. Zpráva z jednoho počítače nemusí čekat na to, až se odešle celá zpráva z jiného počítače, která se začala odesílat dřív. Zprávy procházejí skrze router současně. I kdyby PC posílalo 100GiB dat, iPad dostane svou zprávu k cíli „ihned“.

TCP/IP

TCP/IP je označení pro Transmission Control Protocol/Internet protokol. Je to protokol, který pospisuje přenos dat po internetu. V minulosti bylo navrženo mnoho protokolů, jak posílat data po síti, ale TCP/IP to vyhrál na celé čáře a tak se dnes v internetu používá v 99% právě on.

Spolehlivý vs nespolehlivý přenos dat

TCP/IP popisuje dva způsoby přenosu dat. Tzv. spolehlivý a nespolehlivý přenos dat.

Spolehlivý přenos dat se označuje jako TCP a nespolehlivý jako UDP. Rozdíl je v tom, že při TCP nejdříve navazujete se svým protějškem zahájení komunikace, pak si pošlete data a pak si pošlete informaci o tom, že data došli v pořádku. Víte tak, jestli komunikace proběhla, nebo ne. Případně si můžete nějakeré ztracené packety nechat poslat znovu.

UDP naproti tomu prostě pošle packet na nějakou IP adresu a doufá, že mu dojde. Nenavazuje komunikaci, takže netuší, jestli na druhé straně někdo poslouchá, ani nedostane info o doručení, takže neví, zda packet došel. Navíc, pokud posílá více packetů, není zaručeno, že dojdou do cíle ve správném pořadí. (Router může posílat packety – třeba kvůli vytížení sítě – po různých linkách, každá s jinou rychlostí.)

UDP je ale oproti TCP mnohem rychlejší (právě proto, protože nenavazuje spojení atd.). UDP se hodí například při hraní her po síti. Server pošle hráči stav hry a nezajímá se o to, jestli hráč packet odstal, protože za několik milisekund poté mu pošle další packet s novým stavem hry …

Port

Port je velmi důležitý pojem. Je to číslo, kterým se identifikuje program ve vašem počítači, který komunikuje po síti. Vemte si, že váš počítač má jen jednu IP adresu, ale spoustu programů, které chtějí komunikovat v síti s mnoha dalšími počítači. Jak poznat, kterému programu patří packet, který příjde ze sítě? Právě pomocí čísla portu.

Každý odeslaný packet obsahuje IP adresu odesílatele a i port. Když například webový server dostane takový packet s žádostí o zobrazení nějaké webové stránky, ví, na kterou IP adresu poslat odpověď. V odpovědi uvede i port. Když váš počítač tuto odpověď dostane, podle portu pozná, který program si o tento packet řekl a doručí jej dané aplikaci, tedy na daný port. V tomto příkladě si z tohoto portu odpověď přečte webový prohlížeč. Pokud má webový prohlížeč otevřeno více oken, tak každé okno má svůj port, takže snadno pozná, v jakém okně má odpověď zobrazit.

Stejně tak, když váš prohlížeč posílá požadavek na nějaký webový server, musí znát nejen jeho IP adresu, ale i port aplikace, kterou o něco žádá. Konkrétně tedy číslo portu programu, který funguje jako webový server (obvykle Apache).

Důležitá otázka je, jak počítač ví, na jakém číslu portu apache poslouchá? Existuje seznam známých služeb, kde je tento port uveden (jde o číslo 80, to si zapamatujte). Pro tyto známé proty jsou vyhrazeny čísla 0 až 1023. Čísla 1024 až 49151 jsou tzv. registrované porty (programy používající tyto porty by se měli registrovat u společnosti ICANN). Porty 49152 až 65535 jsou tzv. dynamické a soukromé porty. Ty můžete využívat pro svoje aplikace.

Bohužel, neexistuje způsob, jak vybrat port pro vaší serverovou aplikaci tak, aby se nestalo, že nějaká jiná aplikace si nevybrala stejný port a nedošlo ke kolizi (pokud si port neregistrujete u ICANN).

Jediným rozumným řešením je poskytnout uživateli možnost nakonfigurovat si port sám. Apliace, které se pak k tomuto portu budou chtít připojit také musejí mít možnost určit si, na který port se mají připojovat. Až uvidíte praktickou ukázku, pochopíte :-).

Tento problém mají jen serverové aplikace. Klient si může při každém spuštění vyžádat od OS libovolné číslo portu, které pak serveru (na jeho známy port) při každém požadavku pošle.

Network Address Translation

NAT je způsob úpravy IP adres, který umožňuje komunikovat strojům s lokální IP s internetem. Fungování NAT (někdy též zvané Network Masquerading (síťová maškaráda)) zobrazuje následující animace.

IP adresy PC, iPadu a Laptopu jsou lokální (192.168.x.x). K internetu jsou tyto zařízení připojené přes WiFi Router, který má 2 síťové karty. Wifi karta má adresu 192.168.254.100 a používá se pro komunikaci v lokální síti, druhá síťová karata má adresu 223.111.192.112 a ta se používá pro přístup na internet.

Servery mají globální IP adresy, takže je můžete přímo adresovat, ale server nemůže adresovat zařízení s lokální adresou. Lokální adresu 192.168.x.x může mít (a také má) každá firmička či domácnost. Nejsou unikátní, proto je lze používat jen v rámci lokální sítě.

Jak tedy pošle server správu na PC, iPad nebo Laptop? Nijak. Server může komunikovat jen s Wifi Routerem, který má globální IP adresu (v příkladu 223.111.192.112).

Komunikace probíhá takto: PC pošle packet na server. Součástí packetu je IP adresa i port zdroje (src) a IP adresa a port cílového serveru (dst). Když packet dorazí na router, tak ten provede masqueradu - vymění lokální adresu v packetu za svojí globální, vymění i port a zapamatuje si, pro jakou lokální adresu odesílá packet na IP adresu serveru a s jakým portem.

Server o NAT nic neví, odpově pošle na adresu odesílatele packetu (src a dst se prohodí). Packet tak dojde zpět na router.
Routeru pak stačí IP adresa odesílatele (serveru) a port příjemce k tomu, aby zjistil, ze zapamatovaných údajů, pro kterou lokální adresu packet patří.

Klikněte si na PC, iPad nebo Laptop a sledujte, jak se adresy cestou mění.

Důležité je si zapamatovat, že zařízení s lokální IP adresou nemůže být nikdy přímo kontaktováno z „venku“. Pokud máte tu smůlu, že váš poskytovatel internetu vám přidělil lokální IP adresu, tak se na svůj počítač z venku nedostanete, ačkoliv díky NAT můžete posílat packety ven a dostanete i odpověď.

Router lze nastavit tak, že když dostane nějaký „ neznámý “ packet, který je mu adresován, bude mít nastaven nějaký defaultní adresu/počítač, kam packet přepošle. Takže je možné, aby byl vybraný počítač dostupný i z venku. Ale poskytovatelé internetu obvykle chtějí, abyste jim za veřejnou adresu zaplatili. Takže je možné, že váš router nebude mít veřejnou IP adresu ani na jedné kartě.

Domain Name System

DNS se stará o překlad doménových jmen na IP adresy.

DNS server je program, který odpovídá na otázky typu „jaká je IP adresa serveru www.sallyx.org?“.

Servery které se o DNS starají jsou strukturovány hierarchicky. Tj. několik počítačů na světě se stará o tzv. Top-Level Domain, TLD, tj domény nejvyšší úrovně, jako je např. com, org, cz, sk atp. IP adresy těchto serverů jsou dobře známé.

Když vás zajímá IP adresa www.sallyx.org, nejdříve se zeptáte TLD serveru na org a ten vám poradí, který server se stará o org (těch serverů je samozřejmě na světě více, kvůli rozložení zátětě). Tohoto serveru se zeptáte na sallyx.org a on vám poradí další server, který se stará o sallyx.org. A toho se pak zeptáte na www.sallyx.org a on vám řekne, že IP adresa je 46.28.105.66.

Odpovědi se obvykle uchovávají v cache, takže při dalším dotazu na org doménu už ses TLD serveru neptáte. Ve skutečnosti to může být tak, že se zeptáte DNS serveru svého poskytovatele internetu a ten se dotáže na další věci už za vás (nebo si zjistí odpovědi ze své cache) a dá vám rovnou výsledek.

Pokud chcete mít vlastní doménu, jako je třeba, www.sallyx.org, musíte si ji zaplatit. Pak si musíte taky koupit nějakou IP adresu a tyhle dvě věci dát dohromady. Nebo se obrátíte na nějakého poskytovatele webhostingu, který udělá oboje za vás.

Dobrá zpráva je, že pro jazyk C existují funkce, které vám převedou doménové jméno na IP adresu (dotážou se serverů za vás). Seznámím vás s nimi v některé z dalších kapitol.

V příkazové řádce Linuxu můžete použít pro překlad doménových jmen program host:

$ host www.sallyx.org
www.sallyx.org has address 46.28.105.66
www.sallyx.org has IPv6 address 2a02:2b88:1:4::19

Odpověď ukazuje dvě IP adresy. IPv4 46.28.105.66 a IPv6 2a02:2b88:1:4::19.

IPv6 adresa

IPv4 je 32 bitové číslo (4 bajty), takže umožňuje adresovat 232 zařízení, což je cca 4 miliardy. A to je na celý svět málo. Dneska chce mít IP adresu každá lednička. Proto byla navržena adresa IPv6, která se skládá z 16 bajtů, tedy 2128 adres. To už je hodně velké číslo :-).

Aby fungovali IPv6, musí být správně nastaven váš počítač, router, poskytovatel internetu i server, který chcete kontaktovat a vůbec všichni na cestě od vás k cíli. To zatím ještě není na 100% zprovozněno, proto je postup nahrazování IPv4 adresami IPv6 pomalý. Ale jak jste mohli vidět na příkladu výše, může mít váš počítač obě verze adresy a obě používat.

IPv6 se zapisuje pomocí hexadecimálních čísel, rozdělených po 4 znacích dvojtečkami. Pokud nějaká čtveřice začíná nulami, tak se mohou vynechat. Následující zápisy IP adresy jsou ekvivalentní:

2a02:2b88:0001:0004:0000:19
2a02:2b88:1:4:0:19
2a02:2b88:1:4::19

Závěr

Toto byl stručný úvod do základních pojmů fungování internetu. Podrobější informaci si můžete najít na wikipedii nebo v nějakých kurzech o síťování. V příští kapitole už se zase vrátím k programování v C. Uvidíte, jak málu z toho, co jsem tu popsal, budete potřebovat rozumět :-). O většinu problémů se postarají už hotové funkce. Vy budete muset, více méně, jen správně určit IP adresu a port.

Komentář Hlášení chyby
Vytvořeno: 6.10.2014
Naposledy upraveno: 10.10.2014
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..