Tento článek jsem napsal pro časopis Connect a vyšel v posledním čísle Connect 07-08/10, zde jej publikuji s laskavým svolením redakce.
Jedná se o čtvrtý díl seriálu o počítačových sítích. Na tomto webu již existuje obsahově shodný (a rozsáhlejší) seriál Počítačové sítě - Computer networks, ale tento článek jsem napsal s určitým časovým odstupem a z trochu jiného pohledu.
Bohužel další díly již následovat nebudou, protože časopis Connect byl zrušen. Je to škoda, protože se podle mne jednalo o jediný český časopis na docela technické úrovni (oproti hrůzám jako je Chip a další). Ale vydavatelství CPress Media koupila Mladá Fronta a rozhodla se řadu časopisů, mezi nimi Connect, zrušit.
Adresy a jejich výpočty v počítačových sítích založených na TCP/IP
Celou řadu termínů z oblasti počítačových sítí jsme probrali v minulých dílech. Nyní si některé termíny zopakujeme a přidáme několik nových, které jsou důležité pro výpočty adres v IP sítích. Zásadním termínem je IP adresa a maska podsítě. V celém článku budeme hovořit o čtvrté verzi IP protokolu, tedy IPv4.
IP adresa a subnet
IP adresa je logická adresa zařízení v počítačové síti (na 3. vrstvě podle OSI modelu), která používá IP protokol. V IP v4 je tato adresa velká 32bitů (4 byte) a zapisuje se pomocí dot-decimal notation. To znamená pomocí čtyř dekadických hodnot (každá velká jeden byte), označovaných jako oktet, oddělených tečkou. Příkladem IP adresy je 193.222.5.15
. IP protokol je zde již delší dobu a stále probíhá jeho vývoj, my se budeme bavit o modifikacích, které jsou běžné v dnešních sítích. Veškerý popis se nachází v RFC dokumentech.
IP adresa může nabývat hodnot 0.0.0.0
až 255.255.255.255
(teoreticky, ne všechny adresy je možno v praxi použít), což je adresní rozsah IP sítí a internetu. Sice se zápis adresy provádí standardně v desítkové soustavě, ale vše je optimalizováno pro zpracování počítačem, který používá binární soustavu. Takže pro výpočty adres jsou třeba základy počítání v dvojkové soustavě.
V minulých dílech jsme si vysvětlili základní způsoby komunikace, takže víme, že tento rozsah musíme rozdělit na menší části. Těmto částem říkáme subnety (česky podsítě) někdy i sítě. Síťová zařízení uvnitř subnetu sdílí společný prefix IP adresy.
Maska sítě
IP adresa se skládá z několika částí. V základu jde o dvě části, prefix identifikující síť a adresa uzlu v rámci podsítě. U původních classful sítí byl prefix pevně dán třídou, do které adresa patřila. U dnešních classless sítí můžeme prefix určit z masky podsítě. Nebo adresu rozdělit na tři části, adresu sítě, adresu podsítě a adresu uzlu. Kde adresa sítě je dána třídou IP adresy a adresa podsítě je rozdíl masky a třídy.
classful <network-prefix><-------host-number--------> classless <network-number><subnet-number><host-number> classless <-------network-prefix--------><host-number>
Pro to, abychom určily, která část IP adresy je pro podsíť a která pro uzel, se používá maska podsítě (subnet mask). Ta v binárním tvaru obsahuje jedničky následované nulami a pomocí jedniček „vymaskovává“ část síťového prefixu v IP adrese. Jinak řečeno, tam kde jsou v masce jedničky je v IP adrese část podsítě a kde jsou nuly je část uzlu. Síťová část IP adresy určuje podsíť a používá se ke směrování. Část uzlu identifikuje stanici uvnitř daného subnetu.
Maska se v IPv4 zapisuje stejně jako IP adresa pomocí dot-decimal form s tím, že jsou validní pouze adresy, které v binárním zápisu mají zleva jedničky následované nulami (za první nulou smí být pouze nuly). Příkladem síťové masky je 255.255.255.0
. Maska 255.255.255.254
není platná, protože uvnitř takového subnetu by se nacházelo 0 uzlů. Maska 255.255.255.255
není maskou podsítě, ale určuje jeden uzel.
Když se bavíme o masce sítě, tak ještě musíme zmínit občas používaný speciální zápis, který se označuje jako inverse mask nebo wildcard mask. Jedná se o obrácenou masku, jednoduše řečeno tam, kde jsou v tradiční masce jedničky jsou nuly a naopak. Pro výpočet v dekadické formě můžeme použít pro každý oktet hodnota = 255 – hodnota oktetu
. Například pro masku 255.255.255.240
je inversní maska 0.0.0.15
.
Veřejné a privátní adresy
Prvotní princip IP sítí byl takový, že IP adresa musela být unikátní v rámci celé sítě a jednotlivé uzly (stanice, servery a další zařízení s přiřazenou IP adresou) spolu mohli komunikovat. S rozvojem internetu se ukázalo, že počet adres, které je možno v IPv4 vytvořit, rozhodně není dostatečný. Začaly se tedy používat různé metody, jak se s nedostatkem adres vypořádat. Nejrazantnější je nová verze IP protokolu IPv6, která obsahuje mnohem více adres, ale její nasazování není jednoduché. Dále se objevila technika CIDR a také se IP adresy rozdělili na dva typy, na veřejné a neveřejné IP adresy.
Veřejné IP adresy (public address) tvoří hlavní část adresního rozsahu internetu a tyto adresy jsou routovatelné v rámci celého internetu. Jednoduše řečeno počítač s veřejnou adresou může být dostupný z celého internetu. Tyto adresy musí být unikátní v celé síti (internetu).
Oproti tomu privátní IP adresy (private adress) by se měly používat pouze v rámci LAN sítí a v internetu by přes ISP neměli komunikovat. Firma pak používá jednu (nebo více) veřejnou adresu a pomocí techniky NAT (Network Address Translation) se při komunikaci mimo LAN překládají privátní adresy na tuto veřejnou. Stejné privátní adresy se tak mohou nacházet na mnoha místech v internetu, ale nemohou spolu přímo komunikovat. Následující tabulka ukazuje jednotlivé privátní rozsahy.
síť | adresa sítě | broadcast adresa | adresy uzlů |
---|---|---|---|
10.0.0.0/8 | 10.0.0.0 | 10.255.255.255 | 10.0.0.1 - 10.255.255.254 |
192.168.0.0/16 | 192.168.0.0 | 192.168.255.255 | 192.168.0.1 - 192.168.255.254 |
172.16.0.0/12 | 172.16.0.0 | 172.31.255.255 | 172.16.0.1 - 172.31.255.254 |
Některé adresy z veřejných i privátních mají od začátku plánovaný speciální význam. Z těch důležitějších se jedná o rozsah 127.0.0.0/8
, což jsou localhost loopback adresy či 169.254.0.0/16
, to jsou adresy pro autokonfiguraci (APIPA).
Síťové třídy
Metoda, s kterou se již v dnešní praxi nesetkáme, ale jejíž označení se stále používá, je rozdělování sítí do tříd. V minulosti se adresní prostor rozdělil do pěti tříd (hlavní jsou třída A, B a C), v každé třídě existovalo určité množství podsítí. Třída byla určena prvními čtyřmi bity adresy a ke každé třídě byla napevno přiřazena maska podsítě. Masky navíc mohly mít v daném oktetu pouze jedničky nebo nuly. Protože byly masky pevně dány a daly se podle adresy rozeznat, tak se ani neuváděly (což byl později problém u routování). Pokud používáme síťové třídy, tak mluvíme o classful network. Následující tabulka zobrazuje základní parametry jednotlivých tříd.
třída | určující bity | rozsah adres | maska | CIDR maska | poznámka |
---|---|---|---|---|---|
class A | 0xxx | 0 - 127.x.x.x | 255.0.0.0 | /8 | hlavní |
class B | 10xx | 128 - 191.x.x.x | 255.255.0.0 | /16 | hlavní |
class C | 110x | 192 - 223.x.x.x | 255.255.255.0 | /24 | hlavní |
class D | 1110 | 224 - 239.x.x.x | multicast | ||
class E | 1111 | 240 - 255.x.x.x | rezervováno |
Později se ukázalo, že toto pevné rozdělení sítí je neefektivní a velice plýtvá adresami, které začaly ubývat. Tak vznikl síťový design označovaný jako classless. Ten využívá Variable Length Subnet Mask (VLSM), které povoluje proměnnou délku síťové masky. Na VLSM je založen Classless Inter-Domain Routing (CIDR), který dovoluje libovolně dlouhou masku a používá zkrácený zápis pomocí počtu jedničkových bitů v masce (délka masky). CIDR zápis adresy vypadá například 10.5.0.2/28
, tomu odpovídá tradiční maska 255.255.255.240
, kterou zapíšeme binárně 11111111.11111111.11111111.11110000
.
CIDR také obsahuje mechanismus agregace, který dovoluje spojit několik spojitých síťových rozsahů do jednoho supernetu. Použití agregace šetří místo a prostředky při routování. Použitím agregace můžeme spojit subnety 192.168.0.0/24
a 192.168.1.0/24
do 192.168.0.0/23
.
Adresy v subnetu
Každá podsíť obsahuje tři typy adres. První adresa z rozsahu se nesmí přiřadit žádnému uzlu. Tato adresa slouží k identifikaci subnetu o označuje se jako network ID nebo adresa sítě či základní adresa. Tato adresa obsahuje pouze nuly v části adresy uzlu. Dále následují standardní adresy uzlů, které můžeme přiřazovat síťovým zařízením. Poslední adresa subnetu se opět nemůže použít pro uzel, jedná se o tzv. broadcast address. Tato adresa se využívá pro subnet directed broadcast, tedy zprávu, kterou chceme zaslat všem stanicím v subnetu. Tato adresa má pouze jedničky v části adres uzlu.
V následující tabulce jsou zobrazeny všechny adresy pro síť 192.168.5.12/30
. Masku /30
můžeme zapsat binárně 11111111.11111111.11111111.11111100
, takže IP adresa se může měnit pouze v posledních dvou bitech.
IP adresa | binárně | typ |
---|---|---|
192.168.5.12 | 11000000.10101000.00000101.00001100 | network ID |
192.168.5.13 | 11000000.10101000.00000101.00001101 | uzel |
192.168.5.14 | 11000000.10101000.00000101.00001110 | uzel |
192.168.5.15 | 11000000.10101000.00000101.00001111 | broadcast |
Výpočet maximálního počtu uzlů a podsítí
Maximální počet uzlů a subnetů v určité síti je určen pomocí masky podsítě. Určení, která část IP adresy je částí sítě a která částí hostů, je jednoduché. Když si IP adresu i masku zapíšeme binárně pod sebe, tak tam, kde jsou v masce jedničky, je část síťová a kde nuly část adresy uzlu v rámci subnetu. Jednoduché je to u nejběžnějších masek, kdy v oktetu jsou buď jen jedničky, tedy hodnota 255, nebo nuly.
IP adresa | 10.240.5.8 | 00001010.11110000.00000101.00001000 |
maska | 255.255.255.0 | 11111111.11111111.11111111.00000000 |
Když máme masku v CIDR zápisu, tak rovnou víme počet jedniček a počet nul můžeme dopočítat 32 – CIDR hodnota
. Síťová část je dána jedničkami v masce sítě, pokud v této části IP adresy změníme nějakou hodnotu, dostaneme jiný subnet. Takže počet kombinací v této části adresy se rovná maximálnímu počtu subnetů. Počet kombinací spočítáme jako 2počet jedniček
.
Ve starších dobách se nesměli používat subnety, které měli v adrese samé jedničky nebo nuly (to určovalo staré RFC 950), takže podle této normy by počet subnetů byl 2počet jedniček - 2
. Již dlouho ale platí novější RFC 1812, kde můžeme využít všechny adresy. Celkový počet subnetů také záleží na tom, jestli přihlížíme k síťovým třídám, potom počítám počet subnetů v dané síťové třídě, tedy 2počet jedniček v masce – počet jedniček ve třídě
.
Maximální počet adres pro uzly spočítáme obdobně pomocí vzorce 2počet nul – 2
. Dvojku odečítáme, protože jako adresu uzlu nemůžeme použít network id a broadcast adresu.
Uvedeme si nyní jednoduchý konkrétní příklad, na kterém snad bude dřívější obecný popis jasně pochopitelný. Máme síťovou adresu zapsanou pomocí CIDR 148.25.3.5/22
. Takže počet jedniček v masce je 22
a počet nul je 32 - 22 = 10
. Pokud budeme uvažovat třídy, tak tato adresa spadá do třídy B (podle prvních dvou bitů IP adresy, první oktet je binárně 10010100) a její maska je /16. Počet subnetů v rámci třídy B s maskou /22
je 222-16 = 26 = 64
. Pokud bychom brali veškeré subnety, tak je to 222 = 4 194 304
. Počet hostů, který může být v každém subnetu s touto maskou sítě, je 210 – 2 = 1024 – 2 = 1022
.
Jsou dvě adresy ze stejného subnetu?
Občas potřebujeme určit, zda se dvě adresy (které známe včetně masky) nachází ve stejném subnetu (podle toho pak probíhá komunikace apod.). Pokud máme jednoduchou masku, tak to poznáme na první pohled, ale u některých složitějších musíme použít základní matematiku. Stačí porovnat síťové části adres a pokud jsou stejné, patří adresy do stejné podsítě. Nejjednodušší je převést všechny adresy do binární formy a vše je hned patrné. Důležitým předpokladem je, aby masky podsítí byly shodné.
Příklad si ukážeme na adresách 192.168.5.13/22
a 192.168.7.128/22
, hned vidíme, že masky jsou stejné.
dekadicky | binárně |
---|---|
192.168.5.13 | 11000000.10101000.00000101.00001101 |
192.168.7.128 | 11000000.10101000.00000111.10000000 |
255.255.252.0 | 11111111.11111111.11111100.00000000 |
Ze zápisu vidíme části IP adres určených jedničkami v masce a jednoduše porovnáme, že jsou obě stejné, tudíž patří obě adresy do stejné sítě.
Nalezení Network ID
Nalezení první adresy podsítě se může zdát jednoduché, ale někdy to na první pohled vidět není. Pak musíme použít logiku nebo matematiku. Network ID se dá vypočítat z binárního zápisu adresy a masky, kdy se provede bitové AND, networ-ID = IP-adresa AND subnet-mask
.
Příklad pro adresu 10.217.123.7/20
IP binárně | 00001010.11011001.01111011.00000111 |
maska binárně | 11111111.11111111.11110000.00000000 |
operace AND | 00001010.11011001.01110000.00000000 |
dekadicky | 10.217.112.0 |
Místo matematiky můžeme použít i logické uvažování. Maska /20 znamená, že dochází ke změně ve 3 oktetu, takže první 2 oktety zůstávají zachovány a poslední je nulový. Ve 3. oktetu máme čtyři jedničky a čtyři nuly, takže adresy podsítí jdou po 16ti (24). To znamená 0 až 15, 16 až 31, atd., pro hodnotu 123 je nejbližší nižší hodnota 112.
Nalezení broadcast adresy
Broadcastovou adresu subnetu nalezneme podobně jako network ID. Matematicky můžeme použít bitové OR mezi IP adresou a negovanou maskou, tedy broadcast-adresa = IP-adresa OR NOT(subnet-mask)
. Příklad pro stejnou adresu jako minule 10.217.123.7/20
.
IP binárně | 00001010.11011001.01111011.00000111 |
maska binárně | 11111111.11111111.11110000.00000000 |
negace masky | 00000000.00000000.00001111.11111111 |
operace OR | 00001010.11011001.01111111.11111111 |
dekadicky | 10.217.127.255 |
Jiná možnost výpočtu je, když známe network ID, pak stačí do části uzlů v binárním tvaru zadat samé jedničky.
Jiné výpočty
Otázky na to, co chceme spočítat mohou být různé, ale vše vychází z předchozích úvah. Například chceme najít masku podsítě, aby se v ní nacházel zadaný počet adres. Převedeme počet adres na binární hodnotu, z toho dostaneme jak dlouhá je část uzlů a doplněk je maska podsítě. Tedy například subnet pro 4000 klientů, binárně 1111.10100000
, to je délka 12
, maska je dlouhá 32 – 12 = 20
. Subnet /20
může obsahovat až 4094
adres uzlů.
Jiný příklad může být, když chceme rozdělit síť na určitý počet stejných subnetů. Vezmeme hodnotu počtu subnetů, odečteme 1 (protože nabývá hodnot 0 až n-1), převedeme na binární hodnotu, ta musí obsahovat samé jedničky, jinak není možno dosáhnout tohoto počtu subnetů. Pokud počítáme v rámci nějaké třídy, tak připočteme masku třídy a máme cílovou masku jednoho subnetu, kterých může vzniknout zadaný počet.
Například síť 192.168.100.0/24
v rámci třídy C rozdělit na 8 stejných podsítí. 8 – 1 = 7
binárně 111
, v rámci třídy C máme masku 24 + 3 = 27
, takže možné subnety jsou 192.168.100.0/27, 192.168.100.32/27, 192.168.100.64/27, 192.168.100.96/27, 192.168.100.128/27, 192.168.100.160/27, 192.168.100.192/27, 192.168.100.224/27
.
Kalkulačky
Pro výpočty různých hodnot okolo adresování se používají kalkulačky IP podsítí (IP subnet calculator). Takových aplikací nalezneme celou řadu a velká část jich je online na internetu. Příkladem je subnet-calculator.samuraj-cz.com.
Super článek!! moc díky za osvětlení této problematiky
IP kalkulacka, ktera nepotrebuje (krome stazeni) pristup na internet: http://www.slunecnice.cz/sw/ipv4-calculator/
super článek
Nádhera, krásně vysvětleno !!!
pěkný článek
Zdravim, vo vete "Počet subnetů v rámci třídy B s maskou /22 je 22^2-16 = 26 = 64." by asi bolo dobre v tom vypocte upravit trochu tie horne indexy/mocniny. Inac pekny clanok, dakujem zan :).
odpověď na [6]Ondro: Díky, když jsem to převáděl do HTML, tak jsem to přehlédl. Je vidět, že to někdo opravdu čte .
Výborné články!!!
"Použitím agregace můžeme spojit subnety 192.168.0.0/24 a 192.168.1.0/24 do 192.168.0.0/23."
Bylo by možné uvést princip této agregace? Všechno jsem v článku pochopil, ale tohle spojování mi hlava nebere.
odpověď na [9]Karel: "sumarizace" sítě má 2 možnosti buď větší síť např /16 rozjibi na 2 menší kdy každá z menších bude /17 (kdy /17 mohu zase rozdělit na dvě menší která každá bude /18) nebo opačně mám například 2 sítě s /24 a spojím je pod jednu větší síť /23. V konkrétně tomto případě pak pod /23 nebo 255.255.254.0 schovám síť která začíná na 192.168.0.0 a končí 192.168.1.255. stejně pod /22 schován sít začínající ..0.0 a končící 3.255. Na internetu lze další příklady hledat pod pojmy jako subnetting nebo suppernetting
"Maska 255.255.255.254 není platná, protože uvnitř takového subnetu by se nacházelo 0 uzlů"
tohle uz taky neni uplne pravda, protoze maska 255.255.255.254 neboli /31 se pouziva na point to point spoje. Tam staci s prehledem 2 adresy, takze vse ostatni by bylo plytvanim
\"Subnet /20 může obsahovat až 4096 adres uzlů.\"
Ak tomu správne rozumiem, tak len 4096 - 2 uzlov.
odpověď na [12]...: Máte pravdu, 4096 je počet všech adres, 4094 je použitelný počet uzlů.
I dnes super článek.... díky
Začínající administrátor moc děkuje za vysvětlení této problematiky <3