Alhálózatokra bontás (2. rész)

Ha még nem olvastad, a cikksorozat első részét, ITT elérheted.

A címpazarlás problémája

Mi a gond az osztályos hálózatokkal? Az, hogy pazarlóak. Gondoljuk el: 3 féle méretű hálózatból választhatunk: Vagy 16 millió címesből (A osztályú), vagy 65 ezer címesből (B osztályú), vagy 254 címesből (C osztályú). Ha egy kis iroda, ahol 10-12 gép található, publikus IP címeket igényel, a legkisebb hálózat, amit kaphat, 254 kiosztható címet tartalmaz. Egy iskola, ahol 300-400 számítógépet kell megcímezni, már csak egy B osztályú hálózatba fér bele. (Persze megtehetem, hogy 2 C osztályúba osztom a gépeket, de akkor meg kell oldanom közöttük a forgalomirányítást, ami nem lenne nagy gond, de például olyan szolgáltatások, amelyek üzenetszórással működnek, már gondot okozhatnak. Ha valakinek most az a gondolata támad, hogy vonjuk össze a 2 hálózatot egy szuperhálózattá, az nem jelentene megoldást, mert ilyen szuperhálózatokat csak a forgalomirányítók számára útvonalválasztás céllal hozhatunk létre.) A fel nem használt címek más szervezeteknek nem oszthatók ki, hiszen azok állomásait nem tudjuk fizikailag a saját hálózatunkba beemelni. Az Internet használatának elterjedése olyan hatalmas méreteket öltött, hogy tisztán látszott, ilyen címpazarlással nagyon hamar kifogyunk a rendelkezésre álló hálózatokból. Valamilyen megoldást kellett találni. Az egyik megoldás a privát címtartományok bevezetése volt, a másik pedig a rendelkezésre álló hálózatok további alhálózatokra való bontása. Mi ez utóbbival fogunk foglalkozni.

Alhálózati maszk, prefix

Egy osztályos cím bevezető bitjei egyértelműen eldöntik, hogy a címben melyik byte (oktet) után van a netid és a hostid határa. Ez a merev felbontás okozza, hogy csak 3 féle méretű hálózattal dolgozhatunk. Ha valamilyen módon el tudnánk érni, hogy nem byte, hanem bit határon adjuk meg ezt a határt, sokkal finomabban lehetne meghatározni a hálózat méretét. Ennek érdekében bevezették az alhálózati maszk fogalmát (RFC 950).

Az alhálózati maszk, az IPv4-es címhez hasonlóan egy 4 byte-os szám, melyet pontozott decimális formában ábrázolunk. Egy IPv4-es cím minden egyes bitjéhez az alhálózati maszk azonos helyiértékű bitje tartozik. Ahol a maszkban 1-es értékű bit áll, ott a címben netid bit van, ahol 0-s bit áll, ott hostid bit. Az alhálózati maszk által hordozott információ más módon kerül kifejezésre a prefix-ben. A prefix megadja, hogy összesen hány darab netid bit szerepel az adott címben. (Annak a koncepciónak, hogy már nem csak byte-határokon, hanem bitre pontosan tudjuk kijelölni egy (al)hálózat határát CIDR, azaz Classless Inter Domain Routing a neve. 1993-ban váltotta le a korábbi osztályos hálózatok módszerét.) Az alábbi ábrák egy A, egy B és egy C osztályú cím esetében mutatják be az alhálózati maszk és pontozott decimális és bináris felírását.

A fenti ábrákon látható maszkokat az egyes osztályok alapértelmezett maszkjának is nevezzük.

Érdemes megjegyezni, hogy IPv6-os címek esetén a prefix jelentése más, ott a prefix hossz kifejezést kell használnunk abban az esetben, ha a címben a hálózatot (és alhálózatot) azonosító bitek számára gondolunk.

Mivel tervezés során sokkal kényelmesebb a prefixszel számolnunk, konfiguráláskor (IPv4 esetén) viszont az alhálózati maszkot kell megadnunk, nagyon fontos, hogy a kétféle ábrázolási módot oda-vissza át tudjuk egymásba alakítani.

Prefix és alhálózati maszk átalakítása egymásba

Maszk átalakítása prefixé nagyon egyszerű. Ahol a maszkban decimális 255-ös értéket látunk, ott egyértelmű, hogy 8 darab 1-es bit található. Ahol decimális 0-t, ott 0 darab 1-es bit található. Egyedül egyetlen helyen láthatunk nem 255 vagy 0 decimális értéket, ott pedig azt kell csak megnézni, hogy a legfelső (7.) bitből kiindulva a helyiértékek értékét összeadva, mikor kapjuk meg a számot.

Visszafelé, tehát prefixet alakítva alhálózati maszkká ugyanilyen egyszerű dolgunk van: Ahányszor megvan a maszkban a 8, annyi 255-ös érték van a maszkban egymás után, a maradékot pedig az előző eljárásnak megfelelően csak át kell alakítanunk decimális számmá a legfelső bitektől kiindulva. Az átalakításban segítségünkre vannak az alábbi ábrák:










Vegyünk két példát: Az első esetben a 255.224.0.0 alhálózati maszkot írjuk fel prefix formátumban. Az első 255-ös értékű oktet 8 db. 1-es bitet jelent, míg a a második 224-es értékű 3 db. 1-es bitet (hiszen 224=128+64+32). A 0-s értékű oktetek egyértelműen 0 db. 1-es bitet tartalmaznak, így a prefix értéke 8+3+0+0=11.

A második példában írjuk fel a /18 prefixet alhálózati maszk formájában. A 18-at felbontjuk így: 18=8+8+2, így az első két oktetünk az alhálózati maszkban 255, míg a harmadik 192 (hiszen 192=128+64). A negyedik oktetben 0 darab 1-es bit van, így annak értéke 0. Az alhálózati maszkunk így: 255.255.192.0.

Alhálózatot azonosító bitek (subnetid)

Hogyan is történhet az alhálózatokra bontás? Azt fogjuk kihasználni, hogy az alhálózati maszkban már bit-szinten tudjuk meghatározni a hálózatazonosító és az állomásazonosító rész határát. Viszont jegyezzük meg: A számunkra kiosztott hálózati címben a hálózatazonosító részen nem változtathatunk! Tehát a netid szent és sérthetetlen!

Fontos, hogy értsük a hálózat és az alhálózat közötti különbséget. Hálózatokról beszélünk az osztályos hálózatok esetén, vagyis amikor egyértelműen eldönthető a bevezető bitek alapján, hogy hol van a netid és a hostid határa. Ilyenkor az alhálózati maszk vagy prefix gyakorlatilag ugyanezt azt információt hordozza. Amikor ezeket az osztályos hálózatokat bontjuk tovább, akkor beszélhetünk alhálózatokról. Ilyenkor az alhálózati maszk (vagy prefix) adja meg, hogy bit szinten hol van ez a határ. Annak érdekében, hogy meg tudjuk különböztetni az osztályos hálózatot és alhálózatot egymástól, bevezetjük a subnetid fogalmát. A subnetid megadja, hogy az adott osztályos hálózatot hány alhálózatra bontottuk. Az alábbi ábrán jól látható, hogy egy C osztályú hálózat hostid-jéből vettünk kölcsön 4 bitet, ezek alkotják a subnetid-t. A korábban tanultaknak megfelelően kiszámoltuk az alhálózati maszkoté és a prefixet. Alhálózatok esetében a prefixet a netid és a subnetid bitek számának az összeadásából kapjuk. (Nevezhetjük akárhogy is ezeket a biteket, végeredményben a hozzájuk tartozó címbitek azt határozzák meg, hogy az adott IP című hoszt melyik (al)hálózatban van.)

Alhálózatokra bontás

Alapok

Az alhálózatokra bontás feladatát kétféleképpen szokás megfogalmazni:

  • Bontsuk az adott hálózatot megadott számú alhálózatra.
  • Bontsuk az adott alhálózatot olyan alhálózatokra, melyek megadott számú hosztokat tartalmazhatnak.

Ez utóbbi esetben, ha az összes alhálózat azonos hosztot képes megcímezni, akkor állandó méretű alhálózatokról, ha különböző számú hosztokat, akkor változó méretű alhálózatokról beszélünk. (Ebben a bejegyzésben mi az állandó méretű alhálózatokra bontásról beszélünk.)

Bárhogy is fogalmazzunk, a feladatunk az, hogy megállapítsuk, hány bitet kell subnetid-nak felhasználnunk.

Ismételten ki kell hangsúlyozni, hogy az alhálózat számára biteket csak a hostid-ból lehet kölcsönvenni, a netid bitjeihez nem nyúlhatunk hozzá! Ez a későbbiekben annyival is megkönnyíti a dolgunkat, hogy az egyes alhálózatok címtartományának felírásakor a netid részt a kiindulási címből, és a maszkból is egyszerűen csak át kell írnunk. Kizárólag az eredeti hostid részben kell számolnunk. Tehát ha például az a feladat, hogy a 192.168.1.0 255.255.255.0 osztályos hálózatot bontsuk fel 4 egyenlő méretű alhálózatra, akkor az új alhálózatok címe mindegyik esetben 192.168.1.X 255.255.255.Y lesz, ahol csak az X és Y okteteket kell meghatározni.

Alhálózatokra bontás az alhálózatok számából kiindulva

Amennyiben megadjuk, hogy egy osztályos hálózatot hány alhálózatra bontsunk, akkor mindig egyenlő méretű alhálózatokról beszélünk. (Ha nem így lenne, akkor meg kellene adni, hogy melyik hány kiosztható címet tartalmazzon, az pedig már a másik feladat.) Sokszor nem számszerűen kapjuk meg a kívánt alhálózatok számát, hanem nekünk kell meghatározni egy alap topológiából. Ilyenkor a hálózatban található forgalomirányítók aktív (IP címmel konfigurált) interfészeinek száma alapján döntjük el, hány alhálózatra van szükségünk. (Ne felejtsük el, hogy ez nem kizárólag a fizikai interfészeket jelentik, hanem VLAN-ok közötti forgalomirányítás esetén az alinterfészeket is számba kell venni!)

Ha megvan a kívánt alhálózatok száma, akkor ezt a számot felkerekítjük a legközelebbi 2 hatványra, hiszen csak 2 hatványának megfelelő számú alhálózatra tudunk bontani. Ahogy sorban vesszük kölcsön a hostid-től a biteket, úgy mindig 2-vel szorozva kapjuk az alhálózatok számát, melyek így 2, 4, 8, 16, 32, 64, 128, 256, 512, stb. lehet. Ha tehát például 15 alhálózatra van szükségünk, akkor 4 bitet kell kölcsönvennünk, mert 2^4=16, és ebbe belefér a 15 alhálózat. Ha 94 alhálózatra van szükségünk, akkor 7 bitet kell kölcsönvennünk, mert 2^7=128-ba fér bele a 94 alhálózat.

Alhálózatokra bontás a hosztok számából kiindulva

Ha a másik irányból közelítjük meg a problémát, vagyis egy alhálózatban kiosztható címeket (hosztok száma) adják meg, akkor ehhez mindig hozzá kell adni 2-t (az alhálózat és az üzenetszórási címét), majd ehhez kell meghatározni a legközelebbi 2-hatvány értékét. Megnézzük, hogy ez a hatvány 2 hányadik hatványa, és ezt a számot ki kell vonni a hostid bitjeinek számából, és a maradék bitek lesznek a subnetid bitjei. Tegyük fel például, hogy egy C osztályú hálózatot úgy kell alhálózatokra bontanunk, hogy mindegyikben 36 hosztnak jusson cím. (Ebben nem csak az állomások, hanem az alapértelmezett átjáró(k), a kapcsolók, a szerverek és minden más megcímezhető eszköz is beletartozik.) Hozzáadunk 2-t (alhálózat és üzenetszórási cím), az 38, az ehhez legközelebbi 2 hatvány 2^6=64, vagyis 6 hostid bitre van szükségünk. Mivel egy C osztályú hálózatban összesen 8 hostid bit van, 8-6=2 bit marad a subnetid-ra, vagyis 2^2=4 ilyen alhálózatot kapunk.

Példák C osztályú hálózat alhálózatokra bontására

Az itt leírtakat a következő ábrákon tudjuk nyomon követni. Egy C osztályú hálózatot fogunk annyi alhálózatra bontani, amennyire lehetséges, és közben megjelenítjük a netid, subnetid és hostid biteket, a kiosztható címek és az alhálózatok számát, az alhálózati maszkot és a prefixet.

A fenti ábrákról ugyan nagyon sok lényeges adat leolvasható, de az egyes hálózatok címtartomány nem. Ennek meghatározása a fenti esetekben nagyon egyszerű. Mindig az alhálózatokban rendelkezésre álló (és nem a kiosztható!) címekből kell kiindulni. Vegyük például azt az esetet, amikor 4 alhálózatra bontottuk fel a kiindulási hálózatot. Mint láthattuk, ilyenkor 6 bit marad a hostid számára, vagyis 2^6=64 cím van egy alhálózatban. (Ebből 62 osztható ki, de ez most nem lényeges.) Mint korábban olvashattuk, a netid részhez nem nyúlhatunk hozzá, tehát mindegyik alhálózat címe a 192.168.1. oktetekkel kezdődik! Az utolsó oktetet pedig úgy kapjuk meg, hogy a rendelkezésre álló címek többszöröseit vesszük: 0, 64, 128, 192. Vagyis a 4 alhálózat címe: 192.168.1.0/26, 192.168.1.64/26, 192.168.1.128/26 és 192.168.1.192/26. Nagyon fontos, hogy az alhálózatok címei nem értelmezhetők a prefix (vagy alhálózati maszk) nélkül! Egy alhálózat üzenetszórási címét úgy kapjuk meg, hogy 1-et levonunk a következő alhálózat címéből. A kiosztható címek pedig az alhálózat címe és az üzenetszórás cím közötti tartomány. Ezeket a lépéseket mutatja a következő ábra:

Nézzük meg most ugyanezt a folyamatot 8 alhálózatra történő bontáskor. Itt mivel 32 cím fér el egy alhálózatban, az első lépésben 32-vel növeljük az utolsó oktet értékét, hogy megkapjuk az alhálózatok címét. (Ne feledjük, a prefixet mindig meg kell adni ilyenkor, ami most /27!)

Példák B osztályú hálózat alhálózatokra bontására

B osztályú hálózat alhálózatokra bontása, amennyiben a kívánt alhálózatok számát írják elő, ugyanolyan egyszerű, mint C osztálynál, csak nem az utolsó, hanem az utolsó előtti oktet-ben kezdünk el dolgozni. Megállapítjuk, hogy hány bit szükséges a kívánt alhálózatok kialakításához, ennyit kölcsönveszünk a hostid-ből, és kiszámítjuk a maszkot és a prefixet. Amennyiben a maradék hostid bitek elférnek az utolsó oktetben, akkor az egyes alhálózatok címeit ugyanúgy kell felírni, mint az előző esetben, tehát a rendelkezésre álló címeket többszörösét kell csak egymás alá írni. Persze ilyenkor nem állunk meg, ha “elfogy” az utolsó oktet, hiszen akkor eggyel növeljük az utolsó előtti oktet értékét, és az utolsóban újrakezdjük a folyamatot. (Olyan ez, mintha két óra járna egymás mellett. Amikor a második mutatója körbeér, akkor az elsőé egyet ugrik. ) Erre látunk egy példát a következőkben, ahol is egy B osztályú hálózatot bontunk fel 500 alhálózatra. Ehhez 9 subnetid bitre van szükségünk (2^9=512), így a hostid-ra 7 bit marad (eredetileg a B osztályú címben ugye 16 bites a hostid), vagyis 2^7=128 cím áll rendelkezésre az egyes alhálózatokban. (Ebből 126 ki is osztható, de ez megint lényegtelen ebben az esetben.)

Nézzük meg most az egyes alhálózatok címtartományait. (Természetesen nem mind az 512 tartományt írjuk fel, csupán az első 4-et és az utolsó 4-et.)

Kicsit nehezebb a dolgunk, ha az alhálózat címeinek száma nem fér bele egy oktetbe. Tegyük fel, hogy a 134.96.0.0/16 B osztályú hálózatot 16 azonos méretű alhálózatra bontjuk, vagyis 4 bit subnetid-ra van szükségünk. A hostid-ra így marad 12 bit, vagyis minden alhálózat 4096 címmel rendelkezik. (Tudjuk, 2 nem osztható ki…)

A gond ugye az, hogy most nem lépegethetünk az utolsó oktetben 4096-tal, hiszen egyetlen oktetbe csak 256 cím fér el. A megoldás az, hogy megnézzük hány bit “lóg át” az utolsó előtti (harmadik) oktetbe. Jelen esetben 4 bit, így a lépegetést ebben az oktetben végezzük 2^4=16 címenként. (Mivel ebben az oktetben egy 16-os ugrás lényegében 16×256=4096 címes ugrásnak felel meg, hiszen az utolsó oktet önmagában 256 címet jelent, nem járunk el hibásan.) Az üzenetszórási címek és a címtartományok meghatározása már az előzőek szerint történhet. (Csak itt nem egy, hanem két oktetben számolunk.)

Példák A osztályú hálózat alhálózatokra bontására

Ha megértettük a B osztályok alhálózatokra bontását, akkor az A osztályúakkal már nem lehet gond. Az alábbi három képen egy-egy A osztályú hálózat alhálózatokra bontását követhetjük nyomon. Jó gyakorlás meghatározni az egyes alhálózatok címtartományát. (Mondjuk nem kell az összeset, kicsit sok lenne…)