Mérnöki modelllkotás Az elmélettől gykorltig IP forglomtováítás: Prefix fák és fejárások
Trtlom IP ímzés és forglomtováítás Legspeifikus ejegyzés keresése (LPM) LPM prefix fákkl, prefix fák trnszformáiój és ekvivleniáj Fejárások: preorder-postorder
IP ímzés és forglomtováítás
IPv4: ímzés IPv4 ím: 32 it unsigned integer, 4294967296 (2 32 ) dr egyedi zonosító De pl. 2554524783 ím nehezen olvshtó deimális jelölés: 2554524783 ináris:00000 00000000 00 dotted deiml : 8 itenként feltördelve négy yte-os számr: 52.66.244. 52 66 244 00000 00000000 00 2554524783
IPv4: lhálóztok IPv4 ím = lhálózt-zonosító + hoszt-zonosító IP ímek soportji lhálózti prefixe (sunet) gyűjthetőek Az lhálózt egyetlen IP prefixen látszik z Internetről (ggregáió) Az lhálózt-zonosító hossz: prefix hossz 2.0.0.0/8 2.0.0.0/6 2..0.0/6 2.2.0.0/6... 2.254.0.0/6 2.255.0.0/6 2..0.0/2 2..8.0/2 2..6.0/2... 2..248.0/2 2.254.0.0/7 2.254.28.0/7 2..8.0/24 2..9.0/24 2..0.0/24... 2..4.0/24 2..5.0/24
IPv4 lhálóztok: CIDR CIDR: ruglmsn kilkíthtó lhálóztok Vrile Length Sunet Msking (VLSM) CIDR nottion 92.68.92.0/8 Prefix hossz 8 it (z MSB-től) ináris 000000000000000 00000000 Sunet msk (ináris) 000000 00000000 Sunet msk (dotted) 255.255.92.0 Egyedi IP ímek szám Első IP ím 92.68.92. 2 32-8 =2 4 =6384 (vlóján 2-vel kevese, trtomány első és z utolsó IP íme nem hsznált) ináris 000000000000000 0000000 Utolsó IP ím 92.68.255.254 ináris 000000000 0
IPv4 forglomtováítás Minden somg trtlmzz él IP ímét Forglomtováítási tál (Forwrding Informtion Bse, FIB) minden routeren minden ismert prefixre egy ejegyzés z útvonlon következő router íme (next-hop) 92.68..0/24 FIB: 0.0.0.0/8 0.3.0.2 0.3.0.2/24 0.2.0.2/24 FIB: 0.4.0.0/6 0.2.0.2 0.4..0/24 0.4.5.0/24 Forrás 92.68..37 CSOMAG Célím: 0.4.9.29 Cél 0.4.9.29 0.4.9.0/24
A legspeifikus prefix Adott IP ímre tö FIB-ejegyzés illeszkedhet Egy router FIB-jének részlete IP prefix/prefix hossz A prefix inárisn Next-hop IP íme 92.68.0.0/6 0000000000.0.0. 92.68.0.0/7 0000000000 0.0.0.2 92.68.64.0/8 0000000000 0 0.0.0.3 92.68.96.0/9 0000000000 0 0.0.0.4 Longest Prefix Mth (LPM): preferált legspeifikus ejegyzés legtö iten illeszkedő prefix (MSB-től szmítv) legszűke lhálózt, mi trtlmzz ímet
LPM: péld Egy router FIB-jének részlete IP prefix/prefix hossz A prefix inárisn Next-hop IP íme 92.68.0.0/6 0000000000.0.0. 92.68.0.0/7 0000000000 0.0.0.2 92.68.64.0/8 0000000000 0 0.0.0.3 92.68.96.0/9 0000000000 0 0.0.0.4 A 92.68..=x.x.0000000.00000000 ímre z első két ejegyzés illik, 3. és 4. pirossl jelzett pozíiókn eltér: 2. preferált A 92.68.95.2=x.x.00.00000000 ímre 3. ejegyzés, 92.68.97.3=x.x. 00000.0000000 ímre 4. LPM
A LPM jelentősége Az IP somgtováítás legonyolult része IP ore router: LPM tö mint 550 ezer FIB ejegyzés felett minden somgr (40 Git/se ~ 50 millió LPM/se) PKT IN interfész Heder prsing IP router dt plne LPM lookup PKT pro: TTL-- hdr hksum PKT OUT interfész interfész interfész IP FIB
LPM prefix fákkl
FIB keresés: LPM A LPM megvlósítás nem triviális Nív megközelítés: végigkeresni z összes ejegyzést FIBen és megjegyezni legtö iten illeszkedőt O(N) komplexitás, h ejegyzések szám N A niv módszer hsználhttln
A (ináris) prefix f LPM keresésre optimlizált dtstruktúr A prefix f következő műveleteket támogtj: keresés: dott mintár legtö iten illeszkedő prefix megtlálás és hozzá tárolt ímke kiolvsás eszúrás: (prefix ímke) páros eillesztése törlés: prefix és hozzá trtozó ímke törlése módosítás: prefix ímkéjének módosítás
A prefix f A next-hopokt zonosítsuk egyedi ímkékkel és tároljuk külön egy next-hop index tálán FIB IP prefix Prefix Címke 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0 Next-hop index Címke Next-hop 0.0.0. Prefix f 0.0.0.2 0.0.0.3
A prefix f Gyökér Üres pont IP ím első itje IP ím második itje Élimke IP ím hrmdik itje Belső pont IP ím negyedik itje IP ím ötödik itje Levélpont Címkével ellátott pont
A prefix f Prefix=pont vezető út élímkéinek sorozt A fán prefixeknek megfelelő pontokt prefixhez trtozó next-hop ímkével jelöljük FIB IP prefix Prefix Címke 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0 Next-hop index Címke Next-hop 0.0.0. 0.0.0.2 0.0.0.3
A prefix f Prefix=pont vezető út élímkéinek sorozt A fán prefixeknek megfelelő pontokt prefixhez trtozó next-hop ímkével jelöljük FIB IP prefix Prefix Címke 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0 Next-hop index Címke Next-hop 0.0.0. 0.0.0.2 0.0.0.3
A prefix f Prefix=pont vezető út élímkéinek sorozt A fán prefixeknek megfelelő pontokt prefixhez trtozó next-hop ímkével jelöljük FIB IP prefix Prefix Címke 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0 Next-hop index Címke Next-hop 0.0.0. 0.0.0.2 0.0.0.3
A prefix f Az üres levélpontokt elhgyhtjuk, z üres pontok muttó pointerek: NULL Kise f, kevese memóri FIB IP prefix Prefix Címke 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0 Next-hop index Címke Next-hop 0.0.0. 0.0.0.2 0.0.0.3
A prefix f: keresés Keressük 84...=0... IP ímre legspeifikus tláltot prefix fán Strt gyökérpontól, output érvénytelen output: érvénytelen 0 0 84...=0... IP prefix Prefix Címke 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0
A prefix f: keresés A 84...=0... keresési ím első itje értékű, így gyökéről z -es élímkével ellátott élen lépünk következő pont 84...=0... 0 IP prefix Prefix Címke 0 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0
A prefix f: keresés Az új pontn nins ímke, output változtln A második it 0, így z 0 élímkén hldunk tová következő pont 84...=0... 0 output: érvénytelen 0 IP prefix Prefix Címke 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0
A prefix f: keresés A hrmdik it ismét, z élímkén hldunk to következő pont Az új pont ímkéje, ezért: output 84...=0... 0 IP prefix Prefix Címke 0 output: 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0
A prefix f: keresés A 4. és 5. it, z élímkéken egy, ímkével ellátott pont jutunk, ezért: output A kpott pont levél, így kilépés: output = 84...=0... 0 0 IP prefix Prefix Címke 60.0.0.0/3 0 96.0.0.0/4 00 96.0.0.0/3 0 84.0.0.0/5 0 output:
A prefix f: keresés Algoritmus: sorn olvssuk keresett IP ím itjeit, és z olvsott itnek megfelelően mindig 0 vgy élímkével ellátott élen lépünk tová egy következő pont Az iteráió közen z output változón tároljuk legutoljár olvsott ímkét (kezdeten: érvénytelen) H levélpontot vgy NULL pointert tlálunk: kilépés A kpott ímkéhez (output) kiolvsuk next-hop indexől megfelelő next-hop ímet és visszdjuk Esetünken z LPM eredmény: 0.0.0.2
A prefix f: keresés LPM 69.2.75.54=0000... IP ímre Nem tlálkozunk érvényes ímkéjű ponttl: output = érvénytelen 0 0 NULL 0
A prefix f: keresés LPM 78.4.66.9=00... IP ímre Utolsó látott ímke:, output = 0 0 0 NULL
A prefix f Tétel: prefix fán LPM keresés, eillesztés, törlés és módosítás, legfelje O(W) lépésen végez, hol W ímtér itszélessége (IPv4: 32, IPv6: 28) A fánk nnyi szintje vn, hány itől áll ím Áltlánosságn: N prefix tárolás esetén LPM keresés, eillesztés, törlés és módosítás műveletek komplexitás O(log N) A táláztos tárolási módszerrel z összes prefixen végig kellene keresni: O(N) lépés
Prefix fák trnszformáiój A ináris prefix f nem minden eseten ideális túl sok pontot/pointert trtlmz, nem fér gyors memóriá (SRAM he) 32 RAM elérés ngy seességnél gond lehet A prefix fák nem egyediek: keressünk dott FIBhez htékony prefix fákt! FIB ggregáió: prefix f konverziój kise, de z eredetivel keresés szempontjáól teljesen ekvivlens formá
Prefix fák ekvivleniáj Jelölés: legyen LPM(F, ) = x, h F FIBen IP ímre pontosn x next-hop ímke LPM Def.: FIB FIB 2, h minden 32 ites IPv4 ímre: LPM(FIB, ) = LPM(FIB 2, ) 0 0 0
FIB ggregáió Bináris prefix f 0 0 Optimlizált ináris prefix f 0 Bináris normlizált prefix f 00 0 Szinttömörített normlizált prefix f 0 0
Fejárások
Fejárások A fejárások segítségével egyszerű formán definiálhtók fákon végzett trnszformáiók Preorder/postorder ejárások: F ímkézett f összes pontján egy f függvény lklmzás A különség pontok sorrendje Az láikn sk legegyszerű esettel fogllkozunk ( prentless fák, állpotmentes preorder )
Jelölés Egyszerűsítés: F ímkézett f és gyökérpontj p = root(f) jelölésen felserélhető F pont l/jo oldli részfáj: left(f), right(f) F ímkéje: lel(f) Az egyszerűsítés mitt tehát például lel(f) = lel(root(f)) Most z üres pontokt is tároljuk root(f) left(f) Prefix f F lel(f) right(f)
Fejárások: preorder Preorder ejárás: preorder(f, f, i) először F gyökerére lklmzzuk f-et mjd l és jo oldli részfákr rekurzívn f vissztérési értéke tová gyermekeknek mint kezdeti érték ejárás kezdeti értékét meg kell dni! preorder(f, f, i): x f(f, i) preorder(left(f), f, x) preorder(right(f), f, x)
Preorder: péld Legyen f következő: f(f, i): lel(f) i return (i+) Legyen F prefix f z lái: Értékeljük ki preorder(f, f, ) ejárást
Preorder: péld preorder(f, f, i): x f(f, i) preorder(left(f), f, x) preorder(right(f), f, x) f(f, i): lel(f) i return (i+) ) F gyökerének ímkéje f vissztérési értéke: 2 preorder(left(f), f, 2): vissztérési érték l oldli részf kezdőértéke rekurzíó részfák 2
Preorder: péld preorder(f, f, i): x f(f, i) preorder(left(f), f, x) preorder(right(f), f, x) f(f, i): lel(f) i return (i+) 2) left(f) gyökerímkéje 2 f vissztérési értéke: 3 preorder(left(f), f, 3): l oldli f ímkéje 3 3 3 2 3 levélpont: rekurzió leáll preorder(right(f), f, 3): jo oldli f ímkéje 3
Preorder: péld preorder(f, f, i): x f(f, i) preorder(left(f), f, x) preorder(right(f), f, x) f(f, i): lel(f) i return (i+) 3) Vissz F gyökerére és preorder(right(f), f, 2) A preorder ejárásunk érdekes dolgot sinál Minden ponton eállítj pont szintjét fán! 3 4 3 2 2 2 3 3 3 4 4 3
Fejárások: postorder A preorder ellentéte: most f függvényt elő lklmzzuk részfákon rekurzívn és sk ezután gyökéren Postorder ejárás: postorder(f, f) lklmzzuk f-et l és jo részfákr rekurzívn, mjd hívjuk f-et gyökéren most nins vissztérési- és kezdőérték postorder(f, f): postorder(left(f), f) postorder(right(f), f) f(f)
Postorder: péld Legyen most f következő: f(f): if (F lef): lel(f) else: lel(f) lel(left(f)) + lel(right(f)) + H nins továi részf (F levélpont) ímke Ellenkező eseten gyermekek ímkéinek összege plusz Legyen F prefix f ugynz, mint elő Értékeljük ki postorder(f, f) ejárást
Postorder: péld postorder(f, f): postorder(left(f), f) postorder(right(f), f) f(f) f(f): if (F lef): lel(f) else: lel(f) lel(left(f)) + lel(right(f)) + ) F mindkét részfáján rekurzió postorder(left(f), f): továi rekurzió két részfán f először left(left(f)) és right(left(f)) levélen hívódik mindkét levél ímkéje: left(left(f)) right(left(f))
postorder(f, f): postorder(left(f), f) postorder(right(f), f) f(f) Postorder: péld 2) Mivel gyermekei ejárv, f függvény hívódik left(f) részfán z új ímke: + gyermekek ímkéinek összege = 3 f(f): if (F lef): lel(f) else: lel(f) lel(left(f)) + lel(right(f)) + left(f) 3
postorder(f, f): postorder(left(f), f) postorder(right(f), f) f(f) Postorder: péld 3) Rekurzívn ejárjuk right(f) részfát 4) Legutoljár gyökérponton értékeljük ki f függvényt z új ímke: +3+5=9 A ejárás minden pont eírj hozzá trtozó részf pontjink számát! f(f): if (F lef): lel(f) else: lel(f) lel(left(f)) + lel(right(f)) + 9 3 5 3
Érdekes fejárások Részfák mélysége (leghossz út levélig): postorder(f, f) z lái f függvénnyel f(f): if (F lef): lel(f) else lel(f) mx[lel(left(f)), lel(right(f))] + Aritmetiki kifejezés kiértékelése: postorder(f,g) g(f): if (F='+'): lel(f) lel(left(f))+lel(right(f)) if (F='*'): lel(f) lel(left(f))*lel(right(f)) 2 * 3 + 7 + 3 * 7 postorder(f,g) 6 7 2 3 2 3
Érdekes fejárások F visszállíthtó konvertálás sztringre (szerilizálás): postorder(f, f) f(f): if (F is lef): lel(f) '('. lel(f). ')' else: lel(f) '('. lel(left(f)). lel(f). lel(right(f)). ')' (((3)2(4))(5)) 3 2 5 4 postorder(f, f) ((3)2(4)) (5) (3) (4)
Érdekes fejárások Legyenek f és g függvények z láik f(f): if (F lef): lel(f) lel(f) lel(left(f)) + lel(right(f)) + g(f, i): lel(f) lel(f) / i return i Mit trtlmznk ekkor z lái F'' ímkéi? F' postorder(f, f) F'' preorder(f, g, lel(f')) Először előállítjuk pontokn részfák méretét, mjd leosztjuk ímkéket z egész f méretével Részfák reltív mérete z egész fához képest