Praktické základy

IP adresa a maska

Adresa je číslo přiřazené v síti některému počítači, aby se s ním šlo spojit. Adresa protokolu IPv4 má 32 bitů (čtyři čísla 0..255), u protokolu IPv6 je to 128 bitů (osm čísel 0..65535 zapsaných hexadecimálně, tedy 0..ffff). Počítač si může adresu v podstatě sám zvolit, ale musí to v dané síti samozřejmě dávat smysl. V sítích lokálního rozsahu (domácí, školní, firemní a tak) se obvykle adresy rozdávají automaticky pomocí protokolu DHCP, v Internetu adresy přiděluje skupina IANA.

Maska podsítě není vlastně nutná, ale v praxi je vždycky potřeba ji nastavit. Udává, které počítače na sebe vidí v síti přímo, a kterým je potřeba zprávy směrovat nějak složitěji. Počítače, které si můžou posílat zprávy plus mínus přímo, tvoří podsíť a mají společnou některou část adresy. Kterou část, se udává bitovou maskou: na místech, kde jsou v binárním zápisu masky jedničky, je adresa podsítě, na zbylých místech (kde jsou nuly) je číslo konkrétního počítače. Ve všech rozumných případech začíná maska nějakým počtem jedniček a za nimi má jen nuly, potom ji stručně píšeme za samotnou adresu jako počet jejích jedniček.

Například: adresa 192.168.15.2 s maskou 255.255.255.0 znamená, že podsíť má adresu 192.168.15.0 – všechny počítače ve stejné podsíti budou mít adresy 192.168.15.0 až 192.168.15.254 (nejvyšší hodnota je vždycky vyhrazená). Stručně se ta adresa s maskou zapíše jako 192.168.15.2/24, tj. 24 jedniček.

Příkazová řádka

Úkol: s pomocí programů traceroute a ping zkuste popřemýšlet, jakým způsobem jste zrovna připojení k síti: když sledujete spojení na různé známé servery, která část trasy je společná, kde se to začne větvit? Na který významný server je nejrychlejší odezva?

Jména domén (DNS)

Systém DNS je stromová struktura, nadřazené domény se oddělují tečkou, to je jasné. Správně by dotazy měly probíhat od nejvyšší úrovně dolů, v praxi se vždycky zeptáte jenom jednoho serveru (ISP, routeru nebo tak) a ten vám odpoví. Zároveň si odpověď nejspíš zapamatuje do cache, aby se příště nemusel ptát už nikoho dalšího. Z toho občas vznikají problémy.

Přenos pošty (SMTP)

Fungování e-mailu má na starosti několik docela nezávislých protokolů, ale nejdůležitější z nich je SMTP. Důležité je mít na paměti, že se do předávaných zpráv zapisuje, kdo ji odkud přijal. Někteří poskytovatelé pošty (například Seznam) tak při odeslání zapíšou adresu počítače, odkud jste mail posílali. To pomohlo například při hledání autora Bílej kůň, žlutej drak.

Úkol: projděte si vlastní poštu, kdy vám někdo tvrdil, že někde je ("teď jsem na chatě", "teď nejsem doma" atd.) a zkuste to tvrzení ověřit nebo vyvrátit.

Další zvláštnost je, že se pošta posílá jen v prvních šesti bitech každého bajtu. Národní znaky je potřeba zvláštním způsobem zakódovat a velikost příloh se během přenosu zvýší o třetinu.

Wireshark

Program Wireshark sídlí na webu wireshark.org, pokud ho chcete používat bez instalace, stáhněte verzi PortableApps (anebo ho skopírujte z \\rex\share). Pro jakýkoliv odposlech na síti je na Windows potřeba doinstalovat knihovnu WinPCap, což se nám ve škole bohužel nepodaří. Ukážeme si aspoň použití na už zaznamenaných datech: porg.cz, uloz.to, kinderporno.cz.

Horní rámeček je seznam zachycených paketů, v dolním se zobrazují podrobnosti o vybraném. Políčka v dolním rámečku mají užitečné položky v kontextové nabídce (pravý klik), použijeme Apply as Filter a Export Selected Packet Bytes. K paketům některého druhu vám Wireshark automaticky poskládá souvislý blok, například k paketům HTTP 200 OK nabízí úplně dole celý stahovaný soubor.

Úkol: stáhněte některý ze záznamů výše a získejte z nich nějaký přenášený soubor, například obrázek.

Python

Co se týče síťování, nabízí Python několik modulů na různé úrovni. Podíváme se na socket, ten nejjednodušší z nich. Má význam pro výuku, protože přesně odpovídá tomu, co se děje v operačním systému. Jiné moduly pro různá praktická použití hledejte v dokumentaci.

Ukázkový kód serveru.
import socket
server = socket.socket()
server.bind(('', 42042)) # adresa klienta (tj. bereme všechny), port serveru
server.listen(1) # počet spojení, která bude server (teoreticky) schopný obsluhovat naráz
connection, address = server.accept() # počká na spojení, do té doby se zasekne
connection.sendall("Čau".encode())
print(connection.recv(100).decode())

Ukázkový kód klienta.
import socket
client = socket.socket()
client.connect(('localhost', 42042)) # adresa serveru, port serveru; místní port se zvolí náhodně
print(client.recv(100).decode());
client.sendall("Nazdárek".encode())