Mérnöki modelllkotás Az elmélettől gykorltig Prefix fák tömörítése: dinmikus progrmozás
Trtlom Ismétlés: IP forglomtováítás és LPM prefix fák és fejárások normlizálás: minimális prefix-mentes form FIB ggregáió: FIBek leírás minimális számú prefixszel Szint-tömörítés
Ismétlés
IPv4 forglomtováítás Minden somg trtlmzz él IP ímét Keresés forglomtováítási tálán (FIB) Eredmény: z útvonlon következő router (next-hop) IP íme 92.68../24 FIB:.../8.3..2.3..2/24.2..2/24 FIB:.4../6.2..2.4../24.4.5./24 Forrás 92.68..37 CSOMAG Célím:.4.9.29 Cél.4.9.29.4.9./24
A legspeifikus prefix Longest Prefix Mth (LPM): h egy IP ímre tö ejegyzés illeszkedik, kkor legtö iten illeszkedő prefix preferált Tálázt: LPM komplexitás O(n), n ejegyzésre Bináris prefix f: O(log n) futási idően LPM IP prefix Prefix NH 6.../3 96.../4 96.../3 76.../4
A prefix f: keresés A keresett IP ím következő itjének megfelelően vgy élímkéjű élen lépünk tová Tároljuk legutoljár olvsott ímkét LPM(69.2.75.54) = LPM(...) NULL LPM(78.4.66.9) = LPM(...) NULL
Prefix fák ekvivleniáj FIBek leírás nem egyedi: FIB ggregáió IP prefix Prefix Címke.../ - 28.../.../2 28.../2 IP prefix Prefix Címke.../ - 64.../ 92.../2 Két FIB ekvivlens, h minden 32 ites IPv4 ímre z LPM eredménye megegyezik FIB FIB 2, h LPM(FIB, ) = LPM(FIB 2, )
Fejárások: preorder preorder(f, f, i): lklmzzuk f-et F gyökerére mjd l és jo oldli részfákr rekurzívn preorder(f, f, i): x f(f, i) preorder(left(f), f, x) preorder(right(f), f, x) Írjuk e minden pont gyökértől vett távolságot: preorder(f, f, ) 3 2 3 2 2 2 3 f(f, i): lel(f) i return (i+) 3 3 3 3 4 4 4
Fejárások: postorder postorder(f, f): f függvényt elő lklmzzuk részfákon rekurzívn és sk ezután gyökéren postorder(f, f): postorder(left(f), f) postorder(right(f), f) return f(f) Írjuk e minden pont részf leveleinek számát f(f): if (F lef): lel(f) else: lel(f) lel(left(f)) + lel(right(f)) 5 2 3 2
Egy hsznos f-trnszformáió FIB ekvivlens trnszformáiój egyedi lk Egymás utáni preorder és postorder ejárássl. preorder(f, f, d ) 2. postorder(f, g) f(f, i): if F is interior: if left(f): dd_node(left(f)) if right(f): dd_node(right(f)) if (lel(f) == ): lel(f) i return lel(f) g(f, i): if F is lef: return if lel(left(f)) == lel(right(f)) == lel(f): remove_node(left(f)) remove_node(right(f)) return lel(f) =
Normlizálás d : z első preorder-t kezdeti ímkével indítjuk Ez kerül ímkézetlen pontokr: defult gtewy! IP prefix Prefix Címke.../ - 28.../.../2 28.../2 normlizálás IP prefix Prefix Címke.../2 64.../2 28.../
Normlizálás: tuljdonságok A normlizált FIB táláztos formán prefixmentes: egyik ináris kuls sem prefixe másiknk Ninsenek kevésé speifikus ejegyzések! IP prefix Prefix Címke.../2 64.../2 28.../ A prefix f levél-ímkézett (ímke sk levélen) és szályos (nins enne NULL pointer ) A továikn normlizált lkot hsználjuk
FIB ggregáió: FIB leírás minimális számú prefixszel
FIB ggregáió Egy IP router minden továítndó somgr LPM keresést végez K. 5 ejegyzésesen tö millió LPM/se A routerek kezdenek kifogyni memóriáól, hogy z Internet növekszik FIB ggregáió: FIB ekvivlens trnszformáiój memóritkrékos formá Régei routerek is hsználhtók mrdnk Befér FIB gyors memóriá (he)
FIB optimális tömörítése Láthttuk, hogy egy FIB leírás nem egyedi Egyes ejegyzések feleslegesek lehetnek IP prefix Prefix Címke.../ -.../ 28.../ 28.../2 92.../2 ORTC IP prefix Prefix Címke.../ 28.../ 92.../2 ORTC (Optiml Routing Tle Compression): ejegyzések számánk minimlizálás FIBen
ORTC: lpgondolt Bejegyzések szám FIBen = prefix fán levő ímkézett pontok szám Az ORTC élj olyn prefix f előállítás, melyen lehető legkevese ímke vn Ötlet: h egy pont szülőjétől ímkéjével zonos ímkét örököl, kkor nem kell ele ímkét írnunk Mivel z LPM eredménye ejárás során utoljár látott ímke, jó ímkére emlékszünk Helyes válsztássl megspórolhtó egy ímke!
ORTC: lpgondolt Elhgyhtó ejegyzés például egy levélen, h szülőtől zonos ímkét örököl H zonn szülő más ímkét trtlmz, kkor ki kell írnunk levéle ímkéjét Különen hiás somgtováítás ( helyett )
ORTC: lpgondolt Hsonlón teljes részfákr: elhgyhtó ímke h szülőtől megfelelő ímkét örököl H zonn szülő más ímkét válszt, kkor ki kell írnunk pont ímkéjét!? szülő ímkéje vgy szülő ímkéje vgy = elég ímke! két ímke kell!
ORTC Induljunk FIB normlizált lkjáól IP prefix Prefix Címke.../ -.../.../2 28.../2.../3 normlizálás
ORTC Jelölje DF z F (rész)f számár preferált ímkék hlmzát H F vlmely DF -eli ímkét örököl szülőtől, kkor F gyökérpontjá nem kell ímkét írnunk {} {} {, } {, } {} {} {} {} {}
Preferált ímkék: levélpontok H F levélpont, kkor DF = { lel(f) }? {} Emlékeztető: levélpontn mindig vn ímke, mert normlizált lkól indultunk Hsonlón: első pontoknk mindig lesz két gyermeke normlizálás mitt
Preferált ímkék: első pontok H F teljes részf (gyökere első pont), kkor: )H gyermekeihez trtozó D left(f) illetve D right(f) hlmzn vn zonos ímke, kkor ezt írv F- e két részfán spórolunk egy-egy ímkét h D left(f) D right(f), kkor D F = D left(f) D right(f) D F = {} {,} = {} nins ímke F-en {} {} {} {,} - ímke lolli részfán - ímke joolli részfán összesen 2 ímkével kevese!
Preferált ímkék: első pontok 2)H zonn D left(f) és D right(f) hlmzokn nins közös ímke H F pont Dleft(F) -eli ímkét örököl szülőjétől, kkor jooldli részfán lesz egy ímkével kevese de loldlin nem H Dright(F) -eli ímkét örököl, vie vers H egyiket sem, kkor nem tudunk spórolni Tehát F-en Dleft(F) és D right(f) uniój preferált h D left(f) D right(f) =, kkor D F = D left(f) D right(f)
Preferált ímkék: első pontok D F -eli ímkét örökölve, például -t D F = {,,} {} {} {} {,} nem D F -eli ímkét örökölve, például d-t h jó ímkét kpunk, - ímke d = d h nem jó ímkét kpunk, nem tudunk spórolni
ORTC lgoritmus Input: normlizált prefix f ) Postorder ejárássl előállítjuk z egyes részfákr z D F hlmzokt postorder(f, f) f(f): if F is lef: D F lel(f) else: if D left(f) D right(f) : D F D left(f) D right(f) else: D F D left(f) D right(f)
ORTC lgoritmus 2)Megkeressük z optimális ímkét gyökéren ármely d D ímkét válszthtjuk, zonos számú ímke lesz kpott fán D F = {,} gyökér ímkéje '' {} {,} {,} {} 4 ímke fán {} {} {} {} {} gyökér ímkéje '' 4 ímke fán
ORTC lgoritmus 3)Preorder ejárássl előállítjuk z optimális prefix fát A gyökére kiírjuk z imént tlált d ímkét preorder(f, g, d ), kezdeti érték: d f(f, d): if d D F : lel(f) return d else: // szülő jó ímkét válszt // üres ímke // szülő rossz ímkén lel(f) hoose ny d D F return lel(f)
ORTC lgoritmus A végén z üres leveleket eltávolíthtjuk {,} {} {} {,} {} {} {} {} {} {}
Dinmikus progrmozás Az ORTC lgoritmus klsszikus strtégiát követ: prolémát felosztjuk egymás ágyzódó részprolémákr legszűke részprolémától indulv rekurzívn felírjuk megoldást Most z egymás ágyzódó részprolémákt részfák definiálják A legszűke részprolém z egyszerű levél Egy első pontot mindig z ltt levő részfák megoldás ismeretéen oldunk meg
Dinmikus progrmozás Ez z áltlános prolémmegoldási strtégi dinmikus progrmozás ( divide nd onquer ) {} {,} {} {} {}
Dinmikus progrmozás Az ORTC lgoritmus ekvivlensen felírhtó dinmikus progrm formáján is A művészet részprolémák definiálás fákon végzett optimlizálás esetén triviális áltlános eseten prolém struktúrájáól Htékony áltlános optimizálási strtégi!
ORTC: péld )Prefix f felírás IP prefix Prefix Címke.../ - 28.../.../2 64.../2 28.../2.../3
ORTC: péld 2)Normlizálás normlizálás
ORTC: péld 3)Preferált ímkék keresése {} {} {,} {,} {} {} {} {}
ORTC: péld 4)Gyökérpont ímkéjének megválsztás 5)Módosított prefix f felírás {} {} {,} {,} {} {} {} {}
ORTC: péld 6)Üres levélpontok eltávolítás
ORTC: péld 7)FIB felírás (6 ejegyzés helyett elég 3, rádásul next-hop ímke teljesen eltűnik) IP prefix Prefix Címke.../ - 28.../2 32.../3
ORTC: péld ORTC IP prefix Prefix Címke.../ - 28.../.../2 64.../2 28.../2.../3 IP prefix Prefix Címke.../ - 28.../2 32.../3
ORTC: összefoglló Áltlán 3 4%-kl kise prefix f A FIB táláztos formáj még kise lehet: TCAM-ek hsználtkor kulsfontosságú! A módosított FIB teljesen ekvivlens z eredetivel (minden somgot pont ugynrr next-hopr küld) és z LPM keresés is zonos ORTC futási idő: 3 fejárás (optimlizálhtó kettőre) lineáris idejű lgoritmus De frissítés/módosítás nehéz újr kell építeni z egész fát: O(N) z optimális O(log N) helyett
FIB ggregáió: Prefix fák szinttömörítése
Szinttömörített prefix fák Eddig ináris prefix fákkl dolgoztunk: minden első pontnk 2 gyermeke vn fán Szinttömörített f: minden első pontnk 2 k gyermeke vn vlmely k > egész számr Bináris prefix f (normlizált) Szinttömötített prefix f (normlizált) Alterntív szinttömötített prefix f (normlizált)
Szinttömörített prefix fák LPM lpvetően ugynz, mint ináris fán, de h egy pontnk 2 k gyermeke vn, kkor egyszerre k itet olvsunk kulsól (IP ím) 2=2 gyermek esetén itet, 4=2 2 esetén kettőt Bináris prefix f (normlizált) Szinttömötített prefix f (normlizált) Alterntív szinttömötített prefix f (normlizált)
Prefix kiterjesztése Szinttömörítés: teljes mélységű fákt állítunk elő Ekvivlens zzl, minth 28.../ prefixet de-ggregáltuk voln FIBen IP prefix Prefix Címke.../2 64.../2 28.../ IP prefix Prefix Címke.../2 64.../2 28.../2 92.../2
Szinttömörített prefix fák Előny: kevese pointer = kise tárolási méret + gyors LPM (kevese szintet kell ejárni) Hátrány: pontokn tárolni kell gyermekek 2 k számát, pontosn k-t (ez z ún. stride) Bináris prefix f (normlizált) Szinttömötített prefix f (normlizált) Alterntív szinttömötített prefix f (normlizált)
Optimális szinttömörítés Nem mindegy, hogy f egyes pontjit mekkor stride-r írjuk ki optimlizálás Az lái példán z első szinttömörített fán sk 6 pointer vn, másodikn 8 Bináris prefix f (normlizált) Szinttömötített prefix f (normlizált) Alterntív szinttömötített prefix f (normlizált)
Optimális szinttömörítés Induljunk ki normlizált ináris prefix fáól Legyen h(f) egy F részf mélysége és legyen C i (F) z F részfán z i-edik szinten levő gyermekek hlmz ( gyökértől számítv) F F 2 h(f ) = 2 C h(f 2 ) = (F ) C 2 (F ) C (F 2 )
Optimális szinttömörítés Jelölje nk (F) z F részfán levő pointerek számát n z eseten, h F gyökeréen gyermekek szám pont 2 k (stride=k) Tegyük fel, hogy vlhogy már meghtároztuk F összes részfájár z optimális stride méretet és hozzá trtozó optimális n(f) fméretet Levélpontokr könnyű: levélpont ltti részf mindig üres (nins enne pointer), így: n(f) = h F levélpont
Optimális szinttömörítés Ötlet: h egy F részfát k stride-r írunk ki, kkor enne levő poiterek szám n k (F) = 2 k + n(g) G C k (F) Például z lái F f 2-es stride-on: 6 pointer 2 2 = 4 pointer F n 2 (F) = 4 + (2 + + + ) = 6 C 2 (F) n = 2 n =
Optimális szinttömörítés Természetesen minden pontr érdemes legkise fát eredményező stride-ot válsztni n(f) = min n k (F) = min (2 k + n(g)) k=..h(f) k=..h(f) G C k (F) Algoritmus: postorder sorrenden minden F részfár kiszámítjuk z optimális n(f) értéket Dinmikus progrm: részprolémák ismét részfák, önmgukn optimálisn megoldhtók! n(f) = min (2 k + n(g)) k=..h(f) G C k (F) F első pont n(f) = F levélpont
Optimális szinttömörítés: péld )Induljunk normlizált ináris prefix fáól
Optimális szinttömörítés: péld 2)Minden F részfár htározzuk meg z n k (F) és n(f) értékeket postorder sorrenden n =2+(+)=2 n=2 n= n=
Optimális szinttömörítés: péld 2)Minden F részfár htározzuk meg z n k (F) és n(f) értékeket postorder sorrenden n =2+(2+)=4 n 2 =4+(+++) n=4 n=2 n= n= n=
Optimális szinttömörítés: péld 2)Minden F részfár htározzuk meg z n k (F) és n(f) értékeket postorder sorrenden n=2 n=4 n= n= n= n =2+(+) n=2 n= n=
Optimális szinttömörítés: péld 2)Minden F részfár htározzuk meg z n k (F) és n(f) értékeket postorder sorrenden n=2 n=4 n= n= n= n =2+(4+2)=8 n 2 =4+(2+++)=6 n 3 =8+(++...)=8 n=6 n=2 n= n=
Optimális szinttömörítés: péld 3)Az optimális megoldás n(f)=6 irtokán előállítjuk z optimális szinttömörített prefix fát egy preorder ejárássl megoldhtó, h pontokn tároljuk z optimális stride-méretet n = 6 = n 2 optimális stride=2
Optimális szinttömörítés A szükséges preorder/postorder ejárásokt most nem részletezzük (gykorlt) A szinttömörítés sökkenti f méretét és szintjeinek számát (vgyis z LPM keresés idejét) A gykorltn elterjedten hsznált: Linux kernel fi_trie dtstruktúráj egy szint- (és útvonl)tömörített prefix f network proesszorok mindegyike támogtj Intel DPDK Kominálhtó z ORTC-vel (PhD tém, vlki?)