Close

Jak je to s IP, MAC adresami a sítěmi

RIR regiony

Pod článkem Programování webových rozhraní pro Arduino se objevil zajímavý dotaz.

Možná se zeptám jako úplný primitiv, asi mi uniká základní princip. Jak je to s tou MAC a IP adresou zařízení? Abych mohl komunikaci přes internet používat, znamená to, že si musím někde (třeba na tom webzdarma.cz) založit stránku a k ní (k její IP adrese) se budu připojovat – to bych ještě pochopil.
Když ale přes toto webové rozhraní chci poslat příkaz do svého zařízení, které sedí na nějaké IP adrese přidělené dynamicky přes DHCP, tedy IP adresa může být každou chvíli jiná, jak tam něco pošlu, když tu adresu nemohu znát? Nebo to vždycky musí probíhat tak, že spojení nejdřív navážu z toho arduina na tu webovou stránku (její IP adresa je předpokládám vždycky pevná), pošlu tam dotaz a dostanu odpověď? Trochu mi to nesedí s pár let starou informací, že už všechna IP adresy byly vyčerpány a přešlo se na IPv6 a všude se stále objevují adresy ve formátu IPv4. Jakou roli v tomhle spojení hraje MAC adresa zařízení? Ta by měla být unikátní, to znamená že je někdo centrálně obhospodařuje a přiděluje? Nebo si ji mohu pro své zařízení zvolit libovolně?

Odpověď na tuto otázku je komplexnější, tak ji rozvedu ve článku. Nejedná se o hluboký pohled do zmiňované problematiky, ale měl by poskytnout souhrn základních oblastí, se kterými se při různých síťových aplikacích setkáme.

Síťové vrstvy

Síťová architektura je poměrně komplexní. Aby si každý výrobce netvořil vlastní způsob komunikace po síti, vznikl standardní model, tzv. ISO/OSI. Jemu je v mnohém podobný (částečně z něj vychází) často používaný síťový model TCP/IP. Tento pojem možná znáte, protože je implementovaný v různých síťových modulech pro Arduino.

ISO/OSI vs TCP/IP
ISO/OSI vs TCP/IP, zdroj: https://www.earchiv.cz/a708s600/a708s684.php3

V obou modelech rozlišujeme různé vrstvy, které na sobě hierarchicky staví. Bez nižší vrstvy nemůže vyšší vrstva fungovat.

Podíváme-li se na TCP/IP odspodu, najdeme tam vrstvu síťového rozhraní. Na této úrovni používáme k adresování MAC adresy. Představte si dvě síťová zařízení, která propojíme UTP kabelem. Tato zařízení si vymění MAC adresy a díky tomu vědí, kde mají zapojená zařízení s jakými MAC adresami.

O vrstvu výše leží síťová vrstva, ve které se k adresování používají IP adresy. Tato vrstva řeší např. správné směrování packetů v síti, tedy hledat cestu ze zařízení A do zařízení B přes více uzlů v síti.

Dva nejznámější protokoly transportní vrstvy jsou TCP a UDP. První ze zmiňovaných je schopný zajistit spolehlivou komunikaci – pohlídá si, že zaslaný packet skutečně dorazí na cílové zařízení. UDP protokol je používaný u zpráv, u kterých nepotřebujeme mít jistotu, že dojdou. Může jít o přenos různých mediálních informací, obrazu, zvuku, …, kde nám nevadí, že o nějakou část přijdeme.

Nejvyšší vrstva TCP/IP je aplikační vrstva, na které běží spousta známých protokolů – například FTP pro přenos souborů, SMTP na emailovou komunikaci, HTTP(S) pro komunikaci s www servery a konečně i MQTT, které možná znáte z IOT sítí.

MAC adresy

MAC adresy by měly sloužit k jednoznačné identifikaci síťových rozhraní. Adresa je složena z 48 bitů. Prvních 24 bitů identifikuje výrobce zařízení a je přidělováno výrobcům za poplatek. Druhých 24 bitů už rozděluje výrobce jím vyrobeným zařízením. Pokud vyčerpá tento rozsah, musí si pronajmout další adresu z první poloviny MAC. To ale někteří výrobci nedělají a přidělují MAC adresy opakovaně, což může způsobovat problémy, když se dvě zařízení se stejnou MAC potkají v jedné síti. Potom musí zasáhnout administrátor a MAC změnit manuálně.

IP adresy

IP adresy obecně slouží k identifikaci uzlu v síti. Dnes jsou používané dvě verze, konkrétně IPv4 a IPv6. Liší se od sebe ve spoustě věcí. Z nich některé si popíšeme.

IPv6

Začneme novější technologií IPv6, protože se ji nebudeme moc věnovat. Adresy verze IPv6 mají 128 bitů a zapisují se v hexadecimální podobě. Protože máme 128 bitů a každá HEX číslice popisuje 4 bity, má adresa až 32 znaků, které po čtyřech oddělujeme dvojtečkou (některé sekvence nul lze vynechat při dodržení pravidel).

IPv6 adresa může vypadat například takto: 2001:0db8:0123:aaa0:0g00:faac:0042:4321

Celkem máme tedy dostupných cca 2^128 IPv6 adres, což by mělo na chvíli vydržet (uvidíme, na jak dlouho :))

IPv4

Starší IPv4 adresy mají jenom 32 bitů a zapisují se jako decimální čísla po jednotlivých bytech oddělených tečkou. Například tedy 192.168.0.1.

Adresy v této verzi jsou rozdělené hierarchicky mezi jednotlivé geografické regiony. Můžete si to představit tak, že souvislou část adres má Severní Amerika, další část Jižní Amerika apod. Adresy v jednotlivých oblastech mají na starosti nadnárodní organizace, které své přidělené rozsahy opět dále dělí a pronajímají je menším registrátorům. A ti už třeba můžou pronajmout jednu konkrétní adresu vám.

RIR regiony
RIR regiony, zdroj: https://www.root.cz/clanky/tak-jsme-na-suchu/

Takto funguje rozdělování IPv4 adres v globální síti. Jejich problém je, že mají pouze 32 bitů a už nejsou volné adresy k rozdělení.

Řekněme, že máme od registrátora přidělenou IP adresu. Ta většinou identifikuje hraniční bod naší sítě. Co ale všechny ty počítače v síti? Kdyby měl každý svoji vlastní globální IPv4 adresu, tak adresy dojdou daleko dříve.

Lokální síť

Máme tedy hraniční bod naší sítě – například router a ten zařízením v místní síti přiděluje lokální IP adresy. Hraniční bod může mít lokální IP například 192.168.0.1, NAS 192.168.0.2, PC 192.168.0.3 atd. Adresy v lokální síti je možné přidělovat napevno podle MAC adresy, nebo dynamicky pomocí DHCP – zařízení žádá router o přidělení IP adresy a ten mu nějakou volnou přidělí (nebo si řekne o jednu konkrétní a pokud je volná, tak ji používá).

Pokud nám stačí komunikace mezi dvěma Arduiny v místní síti, můžeme komunikovat přes IP napřímo. Jedno může vystupovat jako server, druhé jako klient a domluví se jen na základě IP adresy.

Problém nastává, když chceme komunikovat se zařízením mimo naši lokální síť. Když známe adresu sítě cílového zařízení, dostaneme se na její hraniční bod, ale co dál? Na hraničním bodu sítě je možné napevno nastavit port (transportní vrstva), kam když dorazí zpráva, přepošle se na konkrétní IP v lokální síti. To je ale ne vždy možné.

Co teď? Jsme v pasti?

Společný komunikační bod

Pokud nemůžeme mezi zařízeními komunikovat napřímo, musíme využít společný bod, jehož IP adresu znají obě zařízení (stačí znát URL adresu – ta se přes DNS přeloží na IP adresu). Potom jedno zařízení může uložit hodnotu na tomto domluveném bodu a druhém ji odsud vyčíst, aniž by na sebe přímo viděli.

To je vše. Doufám, že jsem dostatečně zodpověděl na dotaz a že ve článku najdete i rozšiřující informace ke článku Programování webových rozhraní pro Arduino.

Zbyšek Voda

2 Comments on “Jak je to s IP, MAC adresami a sítěmi

tuxmartin
16.2.2020 at 20:43

Odstavec o IPv6 je temer cely spatne.

>Adresy verze IPv6 mají 64 bitů a zapisují se v hexadecimální podobě. Protože máme 64 bitů a každá HEX číslice popisuje 4 bity, má adresa až 16 znaků, které po čtyřech oddělujeme dvojtečkou (některé sekvence nul lze vynechat při dodržení pravidel).
> IPv6 adresa může vypadat například takto: 2001:0db8:0123:aaa0:0g00:faac:0042:4321

IPv6 adresa ma 128 bitu, ne 64 bitu. Dale ze adresa ma „az 16 znaku“ take neni pravda. Vsak si pocitejte znaky ve sve ukazkove IPv6.

Zbyšek Voda
17.2.2020 at 7:43

Díky za upozornění. To je opravdu hloupá chyba.
Nevím jak jsem přišel na 64 bitů a od toho se odvíjely všechny další chyby 🙂
Opraveno.

Napsat komentář