Vyšlo na www.novinky.cz dne 24.2.1999
Vytištěno z adresy: http://www.earchiv.cz/anovinky/ai1681.php3

Subnetting, supernetting a CIDR

S IP adresami v celosvětovém Internetu jsou dva velké problémy - není jich nekonečně mnoho, tj. mohly by se zcela vyčerpat, a jejich použití by mohlo natolik zvětšit objem směrovacích informací, že by se samotné směrování stalo neúnosně náročným. Naštěstí existují určitá řešení.

Zopakujme si nejprve podstatu celého problému kolem IP adres. Tyto 32bitové adresy jsou koncipovány jako logicky dvojsložkové a obsahují číslo (adresu) sítě jako celku a relativní číslo (adresu) uzlu v rámci dané sítě. Přidělují se takovým způsobem, že každé jednotlivé síti se vždy přidělí všechny IP adresy, které mají stejnou první (síťovou) část - tedy tzv. síťová adresa. Autoři protokolů TCP/IP přitom počítali s tím, že v praxi budou existovat různě velké sítě, a tak zavedli tři třídy síťových IP adres: A, B a C. Síťové adresy třídy C, určené pro nejmenší sítě (co do počtu uzlů), počítají jen s 256 (přesněji 254) uzly, takže jedna tzv. síťová adresa třídy C obnáší celkem 256 konkrétních IP adres.

Pokud někdo dostane přidělenu jednu takovouto síťovou adresu pro svou počítačovou síť, ze společného a apriori daného adresového prostoru všech IP adres (kterých je jednou provždy 2 na 32) odčerpá 256 "jednotek" - a to bez možnosti nějaké "rekuperace" a bez ohledu na to, zda jich skutečně potřebuje 256, nebo třeba jen 2, 4 atd. Ještě horší je situace u takových sítí, které jen o málo "přerostou" hranici 256 uzlů, a jediná adresa třídy C jim nestačí - pokud taková síť dostane přidělenu jednu adresu třídy B, počítající s 65 536 vnitřními uzly, nenávratně tím odčerpá ze společného adresového prostoru právě 65 536 jednotlivých IP adres. Pokud jde třeba o síť s tisícovkou uzlů, zůstane cca 64 tisíc IP adres nevyužito - a hlavně bez možnosti využití jinde (kvůli specifické síťové části adresy).

Problém úbytku IP adres

Nedostatečná "granularita" (jemnost) při přidělování IP adres způsobuje poměrně velké plýtvání IP adresami. Síťové adresy třídy A, kterých je nejméně, se prakticky přestaly přidělovat, a u adres třídy B se s perspektivou možnosti jejich brzkého vyčerpání také rychle přešlo na úspornější systém přidělování. Když přišel někdo s žádostí o přidělení IP adres pro svou síť o 1000 uzlech, již nedostal 1 adresu třídy B, ale několik adres třídy C, například 8 (aby měl určitou rezervu pro růst své sítě, a nikoli jen 4, které by měly teoreticky stačit). Tím se místo 65 635 IP adres nenávratně vyčerpalo jen 8 x 256, tedy 2048 IP adres.

Problém nárůstu směrovacích tabulek

Přidělování několika síťových adres třídy C místo jedné adresy třídy B značně zpomalilo úbytek IP adres, ale na druhé straně akcelerovalo jiný nepříjemný problém - který by se projevil tak jako tak, ale nejspíše poněkud později. Jde o problém s objemem směrovacích informací, které musí být zpracovávány při rozhodování o volbě dalšího směru (neboli při faktickém směrování). Pro správné pochopení podstaty problému si představujme, že každý uzel, který provádí směrování (rozhoduje o volbě dalšího směru) neboli každý směrovač (router), má pro své rozhodování k dispozici tzv. směrovací tabulku (routing table). V té má pro každou síťovou adresu jednu položku, s údaji typu "pakety pro síť XY posílej takovým a takovým směrem". Přitom faktické směrování vyžaduje prohledávání takovéto tabulky, takže složitost směrování jako operace bude nutně záviset na velikosti směrovací tabulky.

Nyní si představme stejný příklad jako výše, se sítí, která má přibližně 1000 uzlů. Pokud by takováto síť dostala přidělenu jednu síťovou adresu třídy B (a tím "odčerpala" 65 636 konkrétních IP adres), pak by ve směrovacích tabulkách všech směrovačů stačila vždy jen jedna položka pro tuto síť. Pokud by při úspornějším přidělování IP adres zmíněná síť o 1000 uzlech dostala např. 8 síťových adres třídy C (čímž by "odčerpala" jen 2048 jednotlivých IP adres), pak by ve směrovacích tabulkách muselo být pro tuto síť vyhrazeno 8 položek, po jedné na každou síťovou IP adresu třídy C (a to obecně v každém směrovači v celém Internetu).

Podstata problému je zde v tom, že původní koncepce IP adres nedokáže nijak využít skutečnosti, že zmíněných 8 síťových adres třídy C "vede" na stejné místo, resp. nedokáže je spojit (tzv. agregovat) do jediné "společné" položky směrovací tabulky. Tím významně roste jak spotřeba místa v paměti, kde jsou směrovací tabulky uchovávány, tak i složitost práce se směrovací tabulkou a tím i vlastní směrování.

Prapůvodní příčina problému je přitom v tom, že nelze libovolně měnit pomyslnou dělící čáru, která vymezuje obě logické části 32-bitové adresy. Autoři protokolů TCP/IP pamatovali jen na tři "předdefinované" polohy této dělící čáry, odpovídající třídám A, B a C.

Masky IP adres

Cesta k možnému řešení se otevírá v okamžiku, kdy se k IP adresám připojí explicitní údaj o poloze pomyslné dělící čáry. Ačkoli by stačilo jednoduché číslo, udávající bitovou pozici příslušného předělu, v praxi se tato informace vyjadřuje nejčastěji ve formě tzv. masky - 32-bitového řetězce, který obsahuje 1 v těch bitech, které odpovídají síťové části adresy, a nulou tam kde jde o relativní adresu uzlu v rámci sítě. To sice dává prostor k možné "nespojitosti" obou logických částí, v praxi se však tato možnost nevyužívá.

Pomocí masky lze dosáhnout dvou různých efektů:

  • Lze spojit několik "sousedních" síťových adres do jedné síťové adresy - tomuto postupu se říká supernetting
  • Lze rozdělit jednu síťovou IP adresu na několik menších síťových adres - tomu se říká subnetting

Subnetting a jeho použití

Technika tzv. subnettingu je starší a její obvyklé použití nevyžaduje žádnou změnu ve způsobu práce s IP adresami v globálním měřítku. Typicky se totiž tato technika používá v nějaké omezené oblasti, kde je třeba efektivněji využít již přidělených IP adres.

Uveďme si jako příklad firmu, která provozuje několik velmi malých lokálních sítí (například jednu pro své obchodníky, jednu pro účetní, jednu pro techniky atd.), přičemž počty uzlů v těchto sítích jsou malé - nechť se dohromady vejdou do počtu 256 (resp. 254). Místo toho, aby zmíněná firma požadovala po jedné síťové adrese třídy C pro každou svou síť, díky subnettingu může vystačit s jedinou síťovou adresou třídy C pro všechny své sítě - pokud si ji pomocí vhodně nastavených masek rozdělí na tak velké části, jaké potřebuje.

Rozdělení jedné síťové adresy na několik síťových adres přitom odpovídá posunutí pomyslné dělící čáry mezi oběma složkami směrem k nižším bitům (doprava ve smyslu obrázků). Konkrétní posunutí je samozřejmě vždy definováno příslušnou maskou.

[Obr: bs5_1.gif (2860 Bytes)]
Představa subnettingu na příkladu rozdělení jedné síťové adresy na 4 nové adresy

Důležitý je na subnettingu princip uzavřenosti - to, že rozdělení původní síťové adresy pomocí specifické masky resp. masek má pouze lokální platnost a nikoli platnost globální. Aplikováno na naši pomyslnou firmu s jedinou síťovou adresou třídy C to znamená, že způsob, jakým si ji "rozparceluje" pro své dílčí sítě, je její interní záležitostí, která je "viditelná" pouze uvnitř (v rámci dané firmy resp. jejích sítí) a není viditelná "zvenku" - mimo soustavu firemních sítí se nadále vše tváří jako jediná adresa třídy C. Lze se na to dívat také tak, že informace o detailním "rozparcelování" není šířena ven, mimo místa, kde vzniká a kde se třeba i mění. Z tohoto důvodu je nutné, aby sítě používající stejnou adresu rozdělenou pomocí subnettingu měly jediný společný vstupní bod - pokud by jich bylo více, pak by ve vnějším okolí chyběla potřebná informace o rozdělení adres, a bez této informace by nebylo možné volit mezi více možnými vstupy.

Supernetting

Supernetting je pravým opakem subnettingu v tom, že posouvá pomyslnou dělící čáru mezi oběma složkami IP adresy směrem k vyšším bitům (na obrázcích doleva). Tím vlastně spojuje (agreguje) několik původně samostatných síťových IP adres v jednu výslednou. Nemohou to ale být zcela libovolné síťové adresy, nýbrž jen takové, které se shodují v určitém počtu vyšších bitů své síťové části, a vyčerpávají všechny bitové kombinace v příslušném počtu nižších bitů své síťové části (viz obrázek). S jistou dávkou zjednodušení by šlo říci, že musí jít o "sousední" síťové adresy.

[Obr: bs5_2.gif (2995 Bytes)]
Představa supernettingu na příkladu sloučení 4 síťových adres do 1 nové adresy

Typickým příkladem situace, kdy může být použit supernetting, je výše citovaný příklad sítě s cca 1000 uzly, která místo jedné adresy třídy B dostane 8 (nejspíše potřebným způsobem "souvislých") adres třídy C. Posunem pomyslné dělící čáry o tři bitové pozice k vyšším řádům (na obrázcích doleva) - kvůli tomu, že 8 je 2 na 3 - lze technikou supernettingu z těchto 8 síťových adres udělat jedinou síťovou adresu.

CIDR, alias: Classless InterDomain Routing

Techniku supernettingu lze využít k řešení výše naznačeného problému s nárůstem směrovacích tabulek v rozsahu celého Internetu. Aby to ale bylo možné, musí mít informace o příslušném "splynutí" (resp. o posunutí dělící čáry) globální charakter a být všude dostupná (na rozdíl od subnettingu, kde tato informace zůstává lokální).

Pro praktické nasazení supernettingu proto bylo nutné modifikovat celý koncept IP adres v rámci protokolů TCP/IP a způsob práce s nimi - místo tří předdefinovaných poloh "dělící čáry" se umožnila její libovolná poloha, s tím, že ke každé IP adrese musí vždy být k dispozici potřebná informace o konkrétní poloze této čáry. Jinými slovy ke každé IP adrese, ať již jednotlivé či síťové, musí být k dispozici její maska. V případě jednotlivé IP adresy (neboli adresy konkrétního uzlu) slouží tato maska k tomu, aby se z jednolitého 32bitového řetězce, který IP adresa představuje, mohla zjistit jeho síťová část a jeho relativní část identifikující příslušný uzel. U síťových IP adres pak maska udává jejich "velikost", měřenou v počtu jednotlivých IP adres přiřaditelných konkrétním uzlům sítě. Zde se však spíše hovoří o "bloku" a "velikosti bloku IP adres" (a místo masky v podobě bitového řetězce se používá jediné číslo, vyjadřující polohu dělící čáry jako počet bitů síťové části adresy).

Konkrétní "pravidla hry" o použití supernettingu, významu masek a IP adres i o manipulaci s nimi v rámci celého Internetu dostaly podobu konvence, pojmenované CIDR (Classless InterDomain Routing). Tato konvence vlastně nahrazuje původní "třídní" charakter IP adres (jejich rozdělení na třídy A, B a C - proto také přívlastek "classless"). Nyní se IP adresy přidělují po tzv. CIDR blocích, s velikostí danou příslušnou maskou - takže jemnost, s jakou jsou adresy čerpány z prostoru všech IP adres, může být velmi pružně přizpůsobována skutečným potřebám praxe, což dále snižuje tempo vyčerpávání celého adresového prostoru.

Důsledek CIDRu: adresy závislé na providerovi

V důsledku zavedení mechanismu CIDR se v Internetu významně změnila jedna důležitá věc. Dříve totiž nebyly IP adresy konkrétních sítí závislé na způsobu jejich připojení - pokud se provozovatel nějaké sítě rozhodl změnit svého providera, mohl si vybrat jiného a ponechat si své dosavadní IP adresy (neboť stačilo pouze změnit položky ve směrovacích tabulkách, odpovídající jeho síťovým adresám).

S nástupem mechanismu CIDR se však IP adresy staly závislé na způsobu připojení k Internetu resp. na konkrétním poskytovateli připojení (Internet providerovi). Ten totiž dostává přiděleny vždy celé tzv. CIDR bloky, ze kterých pak přiděluje IP adresy svým zákazníkům - ovšem detailní informaci o rozdělení CIDR bloku již nerozesílá do celého Internetu, ale ponechává ji jako lokální jen ve svých sítích. Mimo tyto sítě je v příslušných směrovacích tabulkách vždy jen jedna položka obsahující informaci ve smyslu: "k adresám, které spadají do CIDR-bloku XY vede cesta tudy a tudy". Díky tomu bylo možné značně zpomalit nárůst objemu směrovacích tabulek v celém Internetu - byť za cenu toho, že zákazník konkrétního providera při přechodu k jinému providerovi musí svou síť přečíslovat.