• Nie Znaleziono Wyników

Podsumowanie

W dokumencie Index of /rozprawy2/11545 (Stron 12-177)

i testów oraz wyników w odniesieniu do istniejących rozwiązań, a także odnosi uzyskane wyniki do aktualnych obecnie technologii.

2. Algorytmy wyszukiwania wzorców

2.1 Wstęp

Podstawą dla prowadzonej przez autora pracy są zaadoptowane i zmodyfikowane na potrzeby implementacji w układach FPGA algorytmy wyszukujące wzorce. Dlatego istotnym jest przedstawienie podstaw teoretycznych związanych z analizą tekstu oraz wykorzystywanych w pracy algorytmów.

W rozdziale przedstawiono podstawowe pojęcia i definicje leżące u podstaw metod przetwarzania tekstu oraz wyszukiwania wzorców. Omówiono wybrane algorytmy oraz uszczegółowiono wykorzystywane definicje istotne z punktu widzenia prowadzonych rozważań. W ostatnim podrozdziale przedstawiono zwięzłe podsumowanie przedstawionego materiału wraz z wyszczególnieniem aspektów istotnych dla dalszej pracy autora.

2.2 Podstawowy algorytmów przetwarzania tekstu i wyszukiwania wzorców

Wyszukiwanie wzorców jest istotną częścią współczesnych technik będących fundamentem przetwarzania i edycji tekstu, który jest złożoną formą reprezentacji informacji.

Przez pojęcie tekstu T w niniejszej pracy będzie rozumiany skończony ciąg symboli, będących elementami z góry zadanego, skończonego zbioru

, o mocy

|∑|

, zwanego

alfabetem [1]. Przykładem zbioru będącego alfabetem jest zbiór liter i cyfr, jednakże

w przypadku uogólnionym może to być dowolny skończony zbiór symboli.

Przez łańcuch s (ang. string), o długości N równej mocy zbioru s, będzie rozumiany dowolny podciąg tekstu T . Element s[i] reprezentuje i-ty symbol łańcucha s taki, że i∈{0…n }, gdzie n=

s

−1 i s[i]∈

. Łańcuchem pustym (ang empty string) jest łańcuch

s o zerowej długości tj. N=0.

Fragmentem łańcucha s (ang. substring) będzie łańcuch s[i : j], taki że 0⩽i⩽ j⩽∣s∣−1 [2]. Prefiksem łańcucha s (ang. prefix) o długości i jest fragment łańcucha

s[0:i−1] [2]. Sufiksem łańcucha (ang. suffix) o długości k jest fragment łańcucha

s[n−k+1: n] [2].

Przez wzorzec p (ang. pattern) będzie rozumiany dowolny łańcuch, taki że symbole

p[i] są elementami zbioru

.

Dwa symbole s[i] oraz s[ j] łańcucha s są sobie równe s[i]=s[ j], jeśli j , i∈{0…N },

s[i] , s[ j]∈

, oraz s[i] jest tożsame z s[ j], s[i]≡s[ j].

W ogólnym przypadku, dla algorytmów wyszukiwania wzorców, zdefiniowany jest

symbol wieloznaczny ?, nie będący symbolem alfabetu

, dla którego zachodzi ∀

s[i ]∈ s[i] = ?. Jednocześnie definiuje się łańcuch wieloznaczny ∗, którego elementy ∗[i] są równe ?, ∀i∈∣∗∣∗[i] = ?.

Porównanie dwóch elementów s[i] oraz s[ j] to operacja weryfikująca równość

s[i]=s[ j].

Prefiks v łańcucha s można zobrazować jako łańcuch, dla którego istnieje łańcuch

w taki, że s=vw. Podobnie można zobrazować sufiks u łańcucha s jako łańcuch z, dla którego zachodzi s=zu.

Przez prefikso-sufiks (ang. border) w będzie rozumiany łańcuch, dla którego istnieją łańcuchy u i v, takie że zachodzi s=uw=wv [2].

Przez wyszukanie wzorca będzie rozumiany proces polegający na porównywaniu kolejnych elementów wzorca p z elementami s[i]∈T taki, że:

for j=0 until j⩽∣s∣−∣p∣ do

for i=0 until i<∣p∣ && p[i]=s[i+ j ] do

if i⩾∣s∣ OK i++ end j++ end FAIL

Listing 1. Wyszukanie wzorca zapisane w pseudokodzie

Wynikiem operacji wyszukiwania jest informacja czy żądany wzorzec p znajduje się w tekście wejściowym T . Bardzo często algorytmy wyszukiwania oprócz informacji

potwierdzającej znalezienie wzorca p podają także informacje o położeniu p względem

T . Istotnym podkreślenia jest fakt, że proces wyszukiwania zależy od opracowanego

algorytmu wyszukiwania. Przyjęty w niniejszej pracy za definicje wyszukiwania proces to algorytm siłowy (ang. Brute Force algorithm – BF) o pesymistycznej złożoności obliczeniowej O(∣p∣∗∣T∣) [2].

Dopasowanie (znalezienie) (ang. match) wzorca p w T to wynik wyszukiwania, dla

którego w tekście T istnieje s[i : j] którego kolejne elementy odpowiadają (są równe) kolejnym elementom p; co można zapisać jako k∈{0…∣p∣−1}, p [k]=s[i+k ].

W myśl wprowadzonych pojęć i oznaczeń na potrzeby prowadzonej pracy przyjęto dodatkowo następujące definicje i oznaczenia. Elementami zbioru alfabet będzie podzbiór zbioru liczb całkowitych w przedziale

{

0…255

}

. Kolejne elementy zbioru T będą oznaczane jako t[i ]. Dodatkowo przyjmuje się, że symbole przyjętego alfabetu kodowane są na 8 bitach danych oraz wprowadza się uproszczenia zapisu poniższych oznaczeń:

s[i]≡si, p[i]≡ pi, t[i]≡ti .

(2.1)

2.2.1 Algorytm Aho-Corasic

W 1975r. Alfred V. Aho wraz z Margaret J. Corasick [3] przedstawili algorytm wyszukiwania wzorców, nazwany od nazwisk autorów algorytmem Aho-Corasic (AC). Opisany algorytm bazuje w swoim działaniu na automatach stanów [4], [5] i umożliwia jednoczesne dopasowywanie więcej niż jednego żądanego łańcucha w analizowanym tekście wejściowym. Zaproponowana przez autorów procedura miała za zadanie przyśpieszyć wyszukiwanie zadanych wzorców w zbiorach bibliotecznych, co w konsekwencji pozwoliło na przyśpieszenie operacji przeszukiwania od 5 do 10 razy szybciej w stosunku do stosowanych wówczas mechanizmów [3].

Celem algorytmu AC jest znalezienie każdego wzorca pl, z zadanego zbioru

K=

{

p0… pn

}

w tekście wejściowym T . Algorytm w podstawowej wersji operuje na trzech funkcjach: GO, FAIL, OUTPUT, które poprzez wzajemne współdziałanie są składowymi automatu stanu, w obrębie którego następuje współbieżne wyszukiwanie żądanych łańcuchów

elementów łańcucha s[0: j] do elementów pl. Operacja porównywania kolejnych elementów

pil z elementami T realizowana jest przez funkcje GO, która z zadanego zbioru K buduje automat stanów GO

(

fi, tj

)

= fi+1, którego stany wewnętrzne fi reprezentują przejścia (ang. transitions) pomiędzy elementami pil w drzewie wzorców K , w zależności od bieżącego stanu automatu oraz wejściowego symbolu tj. Stany funkcji GO reprezentowane są poprzez liczby naturalne, spośród których umownie wyróżnia się liczbę 0 reprezentującą stan początkowy f0. Dodatkowo, dla funkcji GO, zdefiniowany jest stan błędu fail, oznaczany jako f fail i reprezentujący stan, dla którego przy zadanych symbolach fi, ti nie istnieje stan następny fi+ 1 (GO

(

fi, tj

)

= f fail). Za wyliczenie fi+ 1 dla stanu fi przy GO

(

fi, tj

)

= f fail

odpowiada funkcja FAIL, której wynik fi+ 1 jest stanem bieżącym ( fi) dla funkcji GO przy zadanym ti. Rezultatem wyszukiwania K=

{

p0… pn

}

w T jest wynik zwracany przez funkcję OUTPUT, która dekoduje fi+ 1 na znaleziony pl

∈K . Funkcje GO, FAIL, OUTPUT są generowane przed wykonaniem głównego algorytmu wyszukiwania, przy czym złożoność czasowa algorytmu generującego funkcję GO jest rzędu O(n). Należy zaznaczyć, że siłą algorytmu AC jest jednoczesne przeszukiwanie

{

p0… pn

}

wzorców w tekście T ze złożoność czasową O(n+∣T∣) przy całkowitej liczbie transakcji funkcji GO nie większej niż 2n [3], [6].

Zapis algorytmu AC w pseudokodzie przedstawiony został na listingu 2.

Dla zadanych T =

{

t0…tN

}

, K=

{

p0… pn

}

, GO, FAIL, OUTPUT wykonuj:

begin

f ← 0

for i ← 0 until N do begin

while GO( f , ti) = f fail do f ← FAIL( f ) f ← GO( f , ti)

if OUTPUT( f )

print OUTPUT( f ) end

end

Działanie funkcji GO, FAIL oraz OUTPUT algorytmu AC zarysowane zostało na następującym przykładzie [3].

Dany jest zbiór wzorców K={he , she , his , hers}. Dla tak zdefiniowanych danych działanie funkcji GO przedstawia graf przejść (Rys.1), reprezentujący automat stanów. Funkcja FAIL dla zadanego zbioru wzorców, determinowanego postacią funkcji GO z rysunku Rys. 1, dekodowana będzie zgodnie z następującym zapisem:

Dla przyjętego K oraz wynikającej funkcji GO funkcja OUTPUT zdekoduje wynik wyszukiwania zgodnie z zapisem:

2.2.2 Algorytm Morris'a-Pratt'a

Zaproponowany przez J. H. Morris'a i V. R. Pratt'a w 1977 roku algorytm (MP) bazuje na wnioskach z analizy algorytmu siłowego [2]. Głównym spostrzeżeniem jest fakt,

f : 1 2 3 4 5 6 7 8 9 FAIL( f ) : 0 0 0 1 0 0 3 0 3

Rys. 1: Graf przejścia funkcji GO algorytmu AC dla wzorców {he, she, his, hers}

0 0

6 7

0 1 0

0 4 5

2

3

8 9

h e r s

s

e

h

s

i

!{h,s}

f → output ( f ) 2 {he} 5 {she , he} 7 {his} 9 {hers}

że długość skoku c o jaki przesunięty zostanie wzorzec p względem tekstu t w przypadku gdy p[i] ≠ t [ j+i ] może zostać zwiększona z wartości c = 1, dla procedury siłowej, do wartości c≥ 1 jeśli łańcuch p[0 … n−1] posiada prefikso–sufiks w. Wtedy długość skoku c, do tórego można przesunąć p będzie równa wartości odczytanej z pomocniczej tablicy mpNext dla wartości i.

Dla teoretycznych p, w i t, rozpatrując przypadek p[i] ≠ t [ j+i ] operacja przesunięcia dla algorytmu MP przebiegać będzie zgodnie z krokami przedstawionymi na rysunku Rys. 2.

W celu wyliczenia długości skoku c, algorytm Morris'a-Pratt'a korzysta z tablicy mpNext, generowanej w procedurze preprocessingu przed wykonaniem głównego algorytmu wyszukiwania. Wyliczona tablica mpNext umożliwia przeszukiwanie bez operacji cofania indeksu wyszukiwania j w wyszukiwanym tekście – indeks wyszukiwania jest zwiększany z każdą operacją porównania, co pozwala na analizowanie łańcuchów bez potrzeby wcześniejszego ich zapamiętywania oraz wykonanie co najwyżej 2n−1 operacji porównań na przeszukiwanym tekście t [2]. Przytoczone właściwości są szczególnie istotne w przypadku przetwarzania danych sekwencyjnych takich jak strumienie TCP/IP. Dodatkowo, istotnym zaznaczenia jest fakt, że wyliczana w złożoności czasowej O(∣p∣) pomocnicza tablica mpNext pozwala na uzyskanie złożoności obliczeniowej O(∣p∣+∣t∣)

Rys. 2: Wyliczenie pozycji wzorca p względem analizowanego tekstu t na podstawie wartości z tablicy mpNext

t:

p: w w

w

p[i]

t[j] t[j+i]

Krok 1: porównanie t[j+i] = b ≠ p[i] = a

w

p: w a

p[i]

t[j] t[j+i]

t:

Krok 2: przesunięcie (skok) p do wartości odczytanej z tablicy mpNext[i] = |w|

a

b b

głównego algorytmu wyszukującego, co umożliwia znaczne przyspieszenie procesu wyszukiwania w stosunku do metody BF o złożoności obliczeniowej O(∣p∣∗∣t∣).

2.2.3 Algorytm Knuth'a-Morris'a-Pratt'a

Zaproponowany przez D. Knuth'a, J. H. Morris'a i V. R. Pratt'a algorytm (KMP) jest rozwinięciem przedstawionym przez D. Knuth'a omówionego wcześniej algorytmu MP (strona 17). Analizując procedurę wyszukiwania MP, D. Knuth zauważył, że można wydłużyć długość skoku c w przypadku niezgodności p[i] ≠ t [ j+i ]. Rozpatrując przypadek z Rys. 3, przyjmijmy, że niedopasowanie wystąpiło w miejscu

a = p[i] ≠ t [ j+i] = b, wtedy p[0 :i−1] = t [ j : j+i−1] = u. W takim przypadku, podczas skoku można oczekiwać, że istnieje prefikso-sufix w dla łańcucha u i dodatkowo wymagać by symbol następujący po prefiksie w był różny od p[i] = a. Przyjęcie dodatkowego warunku postaci x = p [∣w∣+1] ≠ p [i ] = a pozwala uniknąć natychmiastowego niedopasowania po skoku.

Dla powyższych spostrzeżeń D. Knuth zaproponował tablice skoków kmpNext, dla której kmpNext[i ] będzie równe długości najdłuższego prefikso-sufiksu w w łańcuchu

Rys. 3: Wyliczenie pozycji wzorca p względem analizowanego tekstu t na podstawie wartości z tablicy kmpNext

t: p: b a w w w p[i] t[j] t[j+i] b w p: w w a p[i] t[j] t[j+i] t:

Krok 1: porównanie t[j+i] = b ≠ p[i] = a

Krok 2: przesunięcie p do wartości odczytanej z tablicy kmpNext[i] = |w| przy jednoczesnym zagwarantowaniu że, p[i] ≠ p[|w|+1] = x

x

p[0 :i−1] poprzedzającym symbol x różny od p[i] lub −1 gdy taki prefikso-sufiksu nie istnieje. Dla tak zdefiniowanej tablicy kmpNext, następne porównania, po skoku dla niezgodności p[i] ≠ t [ j+i ], mogą być kontynuowane pomiędzy symbolami p[kmpNext [i]] i t[ j+i] = b.

Dla teoretycznych p, w i t, rozpatrując przypadek p[i] ≠ t [ j+i ] operacja przesunięcia dla algorytmu KMP przebiegać będzie zgodnie z krokami przedstawionymi na rysunku Rys. 3 na stronie 19.

Algorytm Knuth'a-Morris'a-Pratt'a generuje tablice kmpNext, w procedurze preprocessingu przed wykonaniem głównego algorytmu wyszukiwania [2]. Schemat KMP, podobnie jak MP przypisuje tablicy przesunięć stałą wartość −1 dla indeksu i = 0 –

knpNext[0] = −1 wynikającą z warunków brzegowych algorytmu. Wyliczona tablica umożliwia przeszukiwanie bez operacji cofania indeksu j w wyszukiwanym tekście oraz wykonanie co najwyżej 2 n−1 operacji porównań na przeszukiwanym tekście t [2]. Istotnym zaznaczenia jest fakt, że wyliczana w złożoności czasowej O(|p|) pomocnicza tablica kmpNext pozwala na uzyskanie złożoności obliczeniowej O(|p|+|t|) głównego algorytmu wyszukującego, co umożliwia znaczne przyspieszenie procesu wyszukiwania w stosunku do metody BF o złożoności obliczeniowej O(|p|∗|T |). Dodatkowo na korzyść KMP przemawia fakt, że maksymalna liczba porównań dla pojedynczego symbolu tekstu jest

ograniczona przez wartość logΦ(|p|), gdzie Φ = 1+

5

2 [2], co czyni KMP szczególnie przydatnym w przetwarzaniu danych sekwencyjnych takich jak strumienie TCP/IP.

2.2.4 Algorytm Boyer'a-Moore'a

Zaproponowane przez D. Knuth'a usprawnienie procedury MP pozwala na szybkie przeszukiwanie tekstu pod względem zadanego wzorca co czyniło KMP efektywnym narzędziem w pracach nad przetwarzaniem tekstu. Dalszy rozwój prac badawczych nad technikami edycji i analizy tekstu doprowadził do opracowania i opublikowania w 1977 roku przez Robert S. Boyer'a i J. Strother Moore'a nowego mechanizmu nazwanego od nazwisk autorów algorytmem Boyer'a-Moore'a (BM) [7]. Opracowana procedura jest obecnie uważana za najszybszą praktyczną funkcję wyszukiwania wzorców i często stosowana w edytorach tekstu jako komenda „Znajdź/Zamień” [2].

Największą różnicą pomiędzy BM a omawianymi wcześniej algorytmami jest sposób w jaki schemat BM wykonuje operacje porównania symboli tekstu i wzorca. Wszystkie omówione do tej pory algorytmy wykonywały operacje porównywania tekstu ze wzorcem od lewej do prawej strony wzorca przesuwając wzorzec od lewej do prawej strony tekstu w przypadku wystąpienia niezgodności. Schemat BM operacje porównania zaczyna od ostatniego symbolu wzorca i kontynuuje dopasowanie od prawej do lewej strony wzorca przesuwając wzorzec od lewej do prawej strony tekstu w przypadku wystąpienia niezgodności. Możliwość operowania na tekście w dwóch kierunkach jest możliwa dzięki dwóm a nie jednej, jak w przypadku algorytmów MP i KMP, tablicom skoku – bmGs i bmBc, które operują na dwóch funkcjach przesunięcia/skoku. Indeksy przesunięcia są odczytywane z bmGs w przypadku skoku z pasującym sufiksem (ang. good suffix shift), indeksy z bmBc odczytywane są gdy występuje skok z błędnym znakiem (ang. bad character shift) [2]. Poglądowe działanie algorytmu z tablicami bmGs i bmBc zostanie zobrazowane na teoretycznym przypadku.

Przyjmijmy, że niedopasowanie wystąpiło w miejscu a = p[i] ≠ t [ j+i] = b, wtedy p[i+1:∣p∣−1] = t[i+ j+1 : j+∣p∣−1] = w. W takiej sytuacji mogą zajść dwa przypadki użycia tablicy bmGs:

1. Dopasowany łańcuch w występuje jako sufiks wzorca p i dodatkowo symbol poprzedzający sufiks w jest różny od p[i] = a. Wtedy proces przeszukiwania może być kontynuowany po przesunięciu wzorca p do pozycji dopasowania sufiksu w odczytanej z tablicy bmGs. Sytuację taką przedstawia Rys. 4,

Rys. 4: Wyliczenie pozycji wzorca p względem analizowanego tekstu t na podstawie wartości z tablicy bmGs w przypadku wystąpienia sufiksu w t: p: b a w w w c a w w c przesunięcie wzorca p: kierunek porównywania

2. Dopasowany łańcuch w nie występuje jako sufiks wzorca p ale istnieje pasujący łańcuch cc w łańcuchu w będący prefikso–sufiksem wzorca p. Wtedy proces przeszukiwania może być kontynuowany po przesunięciu wzorca p do pozycji dopasowania prefikso–sufiksu cc odczytanej z tablicy bmGs. Sytuację taką przedstawia poglądowo Rys. 5.

W przypadku gdy skorzystanie z tablicy bmGs nie przynosi oczekiwanych rezultatów [2], [7] wykorzystuje się tablicę bmBc, którą weryfikuje się pod kątem wystąpienia (z największym indeksem) w p[0 :∣p∣−2] symbolu aktualnego niedopasowania t [ j+i], wtedy przeszukiwanie może być kontynuowane po przesunięciu do pozycji odczytanej z tablicy bmBc (Rys. 6).

Rys. 5: Wyliczenie pozycji wzorca p względem analizowanego tekstu t na podstawie wartości z tablicy bmGs w przypadku

wystąpienia prefikso-sufiksu cc t: p: b a w w przesunięcie wzorca cc cc a w cc cc p: kierunek porównywania cc

Rys. 6: Wyliczenie pozycji wzorca p względem analizowanego tekstu t na podstawie wartości z tablicy bmBc w przypadku

wystąpienia we wzorcu p symbolu niedopasowania t: p: b a w w b a w b przesunięcie wzorca p: kierunek porównywania

Jeśli symbol niedopasowania t[ j+i] nie występuje we wzorcu p, wtedy bez straty jakiegokolwiek wystąpienia p, w aktualnym oknie przeszukiwania, wzorzec p zostanie przesunięty tak że, pozycja p[0] względem t będzie równa j+i+1 co poglądowo zostało przedstawione na Rys. 7.

Należy zaznaczyć, że wyliczane na podstawie tablicy bmBc przesunięcie wzorca

p (Rys. 6 strona 22) może posiadać wartość ujemną w przypadku gdy symbol

niedopasowania t[ j+i] znajduje się na prawo od aktualnie porównywanego symbolu p[i] [2], [7]. Dlatego też, algorytm BM wylicza przesunięcie analizując jednocześnie tablice bmGs oraz bmBc i na tej podstawie wyznacza wartość przesunięcia jako

max

{

bmGs ,bmBc

}

dla zadanych i , j , p[i], t [ j+i] . Formalny zapis algorytmu BM przedstawiono w pozycjach [2], [7].

Tablice bmGs oraz bmBc są wyliczane w procedurze preprocessingu przed wykonaniem głównego algorytmu wyszukiwania BM [2]. Złożoność obliczeniowa dla procedur preprocesingu wynosi O(∣p∣+∂) gdzie ∂=

|∑|

. Dodatkowo należy zaznaczyć, że zaproponowany przez Boyer'a-Moore'a schemat posiada następujące właściwości [2], [7]:

1. Pesymistyczna złożoność obliczeniowa postaci O(∣p∣∗∣t∣) , 2. Optymistyczna złożoność obliczeniowa postaci O

(

|t|

|p|

)

,

3. 3n porównań dla wzorców nie posiadających sufiksów (brak powtórzeń łańcuchów we wzorcu),

4. Kierunek porównywania od prawej do lewej strony wzorca. Rys. 7: Wyliczenie pozycji wzorca p względem analizowanego

tekstu t w przypadku braku wystąpienia we wzorcu p symbolu niedopasowania t: p: b a w w a w przesunięcie wzorca p: kierunek porównywania

Z punktu widzenia prowadzonej pracy determinująca dalsze wykorzystanie algorytmu jest właściwość 4. W przeciwieństwie do omówionych wcześniej procedur – AC (strona 15), MP (strona 17), KMP (strona 19) – schemat BM przetwarza wzorzec od prawej do lewej strony i wymaga by aktualnie dopasowywany łańcuch tekstu wejściowego był zbuforowany. Konsekwencją kierunku przeszukiwania wzorców przez algorytm BM jest brak bezpośredniej możliwości wykorzystania algorytmu w przetwarzaniu danych sekwencyjnych takich jak strumienie TCP/IP. Z drugiej strony, szybkość działania procedury BM w przypadku optymistycznym (właściwość 2) stanowi istotną cechę wyróżniającą schemat BM na tle innych algorytmów.

2.3 Podsumowanie algorytmów wyszukiwania wzorców

W poprzednich rozdziałach przedstawiono podstawowe pojęcia i definicje leżące u podstaw metod przetwarzania tekstu oraz wyszukiwania wzorców. Omówiono wybrane algorytmy istotne z punktu widzenia prowadzonej pracy oraz uszczegółowiono definicje wykorzystywanych przez autora. Tabela 1 na stronie 24 przedstawia podsumowanie omówionych procedur wraz z wyszczególnieniem najważniejszych parametrów.

Algorytm przeszukiwaniaKierunek dopasowaniaKierunek Złożoność obliczeniowa wyszukiwanie wieluJednoczesne wzorców

BF z lewej do prawej z lewej do prawej O(∣p∣∗∣t∣) NIE AC z lewej do prawej z lewej do prawej O(n+∣t∣) TAK MP z lewej do prawej z lewej do prawej O(∣p∣+∣t∣) NIE KMP z lewej do prawej z lewej do prawej O(∣p∣+∣t∣) NIE

BM z lewej do prawej z prawej do lewej

O(|p|∗|t|) pesymistyczna O

(

|t|

|p|

)

optymistyczna

NIE

Tabela 1: Podsumowanie przedstawionych algorytmów

W tabeli nie uwzględniono charakterystyk procedur preprocesingu, które są wykonywane przed głównym algorytmem wyszukiwania. Jest to powodowane faktem, jak będzie przedstawione w dalszych rozdziałach, że preprocesing nie jest wykonywany w środowisku pracy zaimplementowanych przez autora algorytmów a tym samym złożoność

obliczeniowa preprocesingu nie jest głównym kryterium decyzyjnym przy wyborze i adaptacji implementowanych przez autora algorytmów. Dodatkowo należy zwrócić uwagę na możliwość przeszukiwania przez omówione rozwiązania wielu wzorców jednocześnie. Tylko przedstawiony algorytm Aho-Corasic posiada tę właściwość co czyni go głównym kandydatem do adaptacji w implementacji mechanizmów wyszukujących wzorce do akceleracji przetwarzania pakietów w sieci Ethernet.

3. Systemy zabezpieczeń sieciowych

3.1 Wstęp

Autor pracy prowadził badania w oparciu o pakiety sieci Ethernet wraz z analizą protokółów TCP/IP. Istotnym jest zatem ustalenie uwagi na technologiach będących przedmiotem rozważań autora. W rozdziale przedstawiono podstawy sieci Ethernet wraz z wykorzystywanym obecne najpopularniejszym protokołem komunikacyjnym TCP/IP w wersji 4 z uwzględnieniem modelu TCP/IP. W dalszych podrozdziałach, omówione zostały podstawy systemu zabezpieczeń sieciowych typu firewall, wraz z wyszczególnioną klasyfikacją funkcjonalną i implementacyjną. W ostatnim podrozdziale przedstawiono podział (taksonomię) oraz wybrane algorytmy klasyfikatorów implementowanych dla potrzeb wyszukiwania wzorców pakietów sieciowych stosowanych w systemach firewall.

3.2 Podstawy sieci Ethernet

Najpopularniejszą obecnie fizyczną infrastrukturą sieci lokalnej (LAN (ang. Local

Area Network)) jest infrastruktura typu Ethernet. Standard zapoczątkowany został przez

amerykańskiego informatyka Roberta Metcalfe w ośrodku badawczym Xerox PARC w 1976 roku [8]. Idea zaproponowana przez Metcalfa inspirowana była na pomyśle sieci ALOHAnet (sięgającej początkami roku 1971) i bazowała na wspólnym dostępie stacji roboczych (komputerów, serwerów, stacji roboczych) do medium transmisyjnego. Stworzona w ten sposób infrastruktura LAN działała w oparciu o przesyłanie pomiędzy stacjami, poprzez medium dostępowe, ustandaryzowanych komunikatów w postaci ramek sieciowych (ang. frames). Każda stacja posiadała niepowtarzalny adres sieciowy MAC (ang. Media

Access Control) pozwalający na wymianę ramek pomiędzy stacją nadawczą i odbiorczą.

Standard Ethernet ewaluował na przestrzeni lat definiując standardy ramek różniące się między sobą długością nagłówków, maksymalną długością ramki (MTU (ang. Maximum

standardów jest zaproponowany w 1980 roku, a zdefiniowany przez IEEE w 1983 roku format IEEE 802.3 [9] bazujący na pierwowzorze Ethernet i wykorzystujący technikę CSMA/CD (ang. Carrier Sense Multiple Access/Collision Detection) – wielodostęp ze śledzeniem nośnej i wykrywaniem kolizji. Drugim, najczęściej obecnie spotykanym, jest zaproponowany przez konsorcjum firm DEC, Intel, Xerox w 1978 roku format Ethernet II. Oba standardy różnią się, między innymi, znaczeniem dwu bajtowego pola Length/Type.

Format ramki dla IEEE 802.3 przedstawiony został na rysunku Rys. 8.

Poszczególne pola ramki IEEE 802.3 posiadają następujące znaczenie [8], [9]:

1. Preambuła – (ang. Preamble) – Predefiniowane pole danych długości 7 bajtów i stałej wartości każdego bajtu wynoszącej 0xAA. Pole to służy do synchronizacji warstwy fizycznej i posiada wspólny format dla IEEE 802.3 i Ethernet II,

2. SFD – (ang. Start of Frame Delimiter) – Pole określające początek ramki. Wartość pola jest stała i wynosi 0xAB i posiada wspólny format dla IEEE 802.3 i Ethernet II, 3. MAC docelowy – (ang. MAC destination) – 6 bajtowy adres fizyczny karty sieciowej

stacji odbiorczej i posiada wspólny format dla IEEE 802.3 i Ethernet II (IEEE 802.3 dopuszcza adresacje 2 bajtową ale 6 bajtowa jest powszechnie spotykana [8]),

4. MAC źródłowy – (ang. MAC source) – 6 bajtowy adres fizyczny karty sieciowej stacji nadawczej i posiada wspólny format dla IEEE 802.3 i Ethernet II (IEEE 802.3 dopuszcza adresacje 2 bajtową ale 6 bajtowa jest powszechnie spotykana [8]),

5. Długość/Typ ramki (L/T) – (ang. Length (IEEE 802.3) lub Ethertype (Eternet II)): • Dla sieci IEEE 802.3 wartość wyraża długość Pola danych (ang. payload)

i zawiera się w przedziale 46–1500,

• Dla sieci Ethernet II wartość pola określa typ ramki (typ protokołu klienta MAC) i musi być niemniejsza niż 1536,

Przyjęcie powyższego rozwiązania przez projektantów pozwala na jednoczesne współdziałanie wymienionych powyżej standardów w obrębie pojedynczego medium

Rys. 8: Format ramki IEEE 802.3

Preambuła SFD MAC docelowy MAC źródłowy Długość ramki Pole danych Suma CRC

transmisyjnego, oraz jednoznaczne określenie typu protokołu w przypadku odebrania przez stacje ramki Ethernet II,

6. Pole danych – (ang. Payload) – Pole danych ramki zawierające dane stacji nadawczej, 7. Suma CRC (FCS) – (ang. Frame Check Sequence) – 32 bitowa suma kontrolna CRC

kodu cyklicznego wyliczana z pominięciem pól Preambuły i SFD. Do wyliczenia CRC wykorzystywany jest wielomian CRC-32 o następującej postaci [9], [8]:

G( x)=x32 + x26 + x23 + x22 + x16 + x12 +x11 +x10 + x8 + x7 + x5 + x4 +x2 + x+1 (3.1) Z powyższego zestawienia wynika, że całkowita liczba bajtów ramki dekodowana przez stacje zawiera się w przedziale 64–1518 bajtów. Wszystkie bajty ramki transmitowane są poprzez medium dostępowe w kolejności występowania w ramce, przy czym poszczególne bity bajtów ramki MAC (pola adresów MAC, L/T, pole danych) transmitowane są od bitu najmłodszego (LSB (ang. Least Significant Bit)) do bitu najstarszego (MSB (ang. Most

Significant Bit)) [9]. Rysunek Rys. 9 przedstawia przykładowe odwrócenie bajtu 0xAC

do postaci bajtu podczas transmisji ramki przez medium transmisyjne.

Gwałtowny postęp technologiczny przyczynił się do dynamicznego rozwoju omawianych standardów, a przede wszystkim umożliwił zwiększenia przepustowości sieci opartych o rodzinę standardów Ethernet do wartości 10Gb/s i więcej – opracowywany od 2007 roku standard IEEE P802.3ba przewiduje zwiększenie prędkości transmisji danych do 100Gb/s [10].

Zwiększanie prędkości przesyłania danych nie było jednym kierunkiem rozwoju sieci Ethernet. Powstało wiele rozszerzeń standardu IEEE 802.3, z których najważniejszym, z punktu prowadzonej pracy, jest opisany w dokumencie IEEE 802.1Q i definiujący działanie wirtualnych sieci LAN (ang. Virtual LANs) – VLAN [11], [12]. Standard definiuje, między

Rys. 9: Przykład odwrócenia kolejności bitów w bajcie podczas transmisji w sieciach Ethernet

MSB LSB 7 6 5 4 3 2 1 0 1 0 1 0 1 1 0 0 0 0 1 1 0 1 0 1 Numer bitu: Kolejność bitów

W dokumencie Index of /rozprawy2/11545 (Stron 12-177)

Powiązane dokumenty