SAMODZIELNY ZAKŁAD SIECI KOMPUTEROWYCH POLITECHNIKA Ł ÓDZKA 90-924 Łódź ul. Stefanowskiego 18/22 tel./fax. (42) 6 360 300 e-mail: szsk@zsk.p.lodz.pl Krzysztof Pijewski Kształtowanie ruchu w sieciach komputerowych Praca dyplomowa magisterska Promotor: dr inż. Michał Morawski Dyplomant: Krzysztof Pijewski nr albumu: 101074 Łódź, wrzesień 2004r.
Spis treści Spis treści... 2 Wprowadzenie... 4 Cel i zakres pracy... 6 Rozdział 1 QoS i kształtowanie ruchu w sieciach.... 7 1.1 Podstawowe parametry QoS... 7 1.2 Zakres zastosowania... 10 1.3 Mechanizmy Quality of Service... 11 1.3 Zalety i wady kształtowania ruchu... 14 Rozdział 2 Algorytmy kształtowania ruchu... 20 2.1 Algorytmy kolejkowania... 20 2.2 Manipulowanie rozmiarem okna TCP... 25 2.3 Idea cieknącego wiadra i wiadra z żetonami... 25 2.4 Hierarchiczne wiadro z żetonami... 31 Rozdział 3 Komercyjne rozwiązania kształtowania ruchu... 41 3.1 Przełączniki i routery z możliwością kształtowania ruchu... 41 3.2 Specjalistyczne urządzenia zarządzające przepustowością... 44 Rozdział 4 Biblioteka NDIS i sterowniki sieciowe... 48 4.1 Czym jest NDIS?... 48 4.2 Wersje biblioteki NDIS... 49 4.3 Rodzaje sterowników NDIS... 50 4.4 Struktura pakietu w bibliotece NDIS.... 53 4.5 Budowa sterownika pośredniego... 55 4.6 Sposoby komunikacji ze sterownikiem... 58 2
Podsumowanie... 61 Załącznik 1 Instrukcja użytkownika programu BandMan... 63 Przeznaczenie programu... 63 Wymagania... 64 Instalacja... 64 Polecenia menu... 68 Konfiguracja... 68 Usuwanie programu z systemu... 75 Załącznik 2 Dokumentacja techniczna programu... 77 Wprowadzenie... 77 Struktura projektu... 77 Budowa sterownika... 78 Budowa aplikacji użytkownika... 81 Zarządzanie pakietami... 82 Komunikacja sterownik program użytkownika... 85 Funkcja kształtowania ruchu... 89 Załącznik 3 Testy programu... 93 Wprowadzenie... 93 Test 1 Kształtowanie ruchu wychodzącego UDP... 93 Test 2 Ograniczanie ruchu wchodzącego TCP... 95 Test 3 Ograniczanie ruchu wchodzącego UDP... 97 Test 4 Znaczenie rozmiaru wiadra dla UDP i TCP... 98 Test 5 Pożyczanie przepustowości pomiędzy klasami... 103 Test 6 Wpływ priorytetu na pożyczanie przepustowości... 105 Test 7 Wpływ kwantu na pożyczanie przepustowości... 107 Podsumowanie... 110 Załącznik 4 Płyta CD-ROM... 111 Literatura... 112 3
Wprowadzenie W nowoczesnych sieciach komputerowych mamy do czynienia z wieloma rodzajami przepływów informacji o odrębnych charakterystykach i wymaganiach odnośnie zasobów sieciowych. Przykładowo, występują transmisje dźwięku i wideo, szczególnie przy przekazach na żywo, które muszą docierać do użytkowników w jak najkrótszym czasie, bez opóźnień, przy stałych, niezbyt dużych zapotrzebowaniach na przepustowość. W codziennej pracy z komputerem niejednokrotnie wysyłamy duże pliki, dla których czas przesłania poszczególnych pakietów nie jest aż tak istotny jak średnia prędkość transmisji. Jednak chcąc w tym samym czasie wysłać np. ważny email, który przecież zajmuje zaledwie kilka kilobajtów, lub połączyć się z serwerem poprzez Telnet, napotykamy na duże opóźnienia, co zmusza nas niejednokrotnie do przerwania innych, bardziej wymagających transmisji. Tego typu problemy są szczególnie odczuwalne gdy jesteśmy połączeni z Internetem za pośrednictwem wąskich łącz o przepustowości od kilkudziesięciu do kilkuset kilobitów na sekundę lub dzielimy nasze łącze z innymi użytkownikami. Jest to bardzo pospolite zjawisko. Powyższe przykłady stanowią tylko niezmiernie uproszczoną ilustrację problemu stale powiększającego się zapotrzebowania na przepustowość sieci i konieczności zagwarantowania pewnych parametrów łącza. Z zagadnieniem tym boryka się wiele firm i instytucji, a z pomocą przychodzą bardzo zaawansowane technologie i duże grona naukowców i specjalistów ds. sieci komputerowych na całym świecie. Mając na uwadze takie zagadnienia, ogół cech i mechanizmów jakie mają zapewnić pewną gwarantowaną jakość usług sieciowych zebrano pod wspólną nazwą Quality of Service (w skrócie QoS). Inaczej mówiąc QoS jest to charakterystyka sieci komputerowych, która pozwala w szczególny sposób traktować różne rodzaje ruchu dzieląc go na bardziej i mniej ważny, przy czym zapewniając jednym i drugim pewne określone ilości zasobów. Jednym z 4
mechanizmów gwarantowania jakości usług jest kształtowanie ruchu, czyli określanie jaki dostęp do przepustowości mają poszczególne grupy transmisji. 5
Cel i zakres pracy Główny cel pracy stanowi omówienie podstawowych mechanizmów kształtowania ruchu w sieciach komputerowych, a także praktyczna ich realizacja w środowisku Microsoft Windows przy użyciu specjalnie napisanego programu. W niniejszym opracowaniu przedstawiono najważniejsze informacje dotyczące standardów zarządzania przepustowością. Ukazano także ich powiązanie z gwarantowaną jakością usług Quality of Service. Ponadto omówione zostało komercyjne podejście czołowych producentów urządzeń sieciowych do tego zagadnienia. W pracy można także przeczytać, w jaki sposób praktycznie zrealizować kształtowanie ruchu we własnym zakresie. Zawarto w niej bowiem opis biblioteki NDIS, która pozwala na implementację omówionych mechanizmów. Cennej pomocy w tym zakresie udzieli dołączony program sterownik dla systemu Microsoft Windows XP napisany na potrzeby niniejszej pracy. 6
Rozdział 1 QoS i kształtowanie ruchu w sieciach. Quality of Service w skrócie QoS czyli gwarantowana jakość usług i kształtowanie ruchu w sieciach komputerowych są pojęciami nierozerwalnymi. Kształtowanie ruchu (ang. traffic shaping) jest bowiem jednym z podstawowych mechanizmów mających za zadanie poprawić działanie sieci. W tym rozdziale przedstawiono pokrótce podstawowe parametry służące do pomiaru poziomu dostarczanych usług, mechanizmy umożliwiające ich polepszenie, zakres zastosowania, a także zalety i wady wprowadzenia w sieci kształtowania ruchu. Główną specyfikację dotyczącą gwarantowanej jakości usług można odnaleźć w dokumencie [RFC-2212]. Dodatkowo pomocne opracowania znajdują się w [BCR] oraz [LINK]. 1.1 Podstawowe parametry QoS Mówiąc o Quality of Service ważne jest zdefiniowanie pewnych parametrów, dzięki którym możliwe będzie rozpoznanie, kiedy usługi oferowane przez daną sieć stoją na wysokim czy niskim poziomie i w konsekwencji czy daną sieć będzie można wykorzystać do pewnych szczególnych typów zastosowań. Jest to najbardziej istotne, gdy w grę wchodzą duże sumy jakie należy płacić usługodawcom internetowym, których obecnie na rynku jest bardzo wielu. Oczywiście zasięg, lokalizacja i to, przez kogo dana sieć jest posiadana powodują, że QoS oraz niżej wymienione współczynniki będą postrzegane przez różne kręgi zainteresowań w odmienny sposób. Przykładowo przedsiębiorstwo może wdrożyć gwarantowaną jakość usług w swojej sieci wewnętrznej, chcąc poprawić parametry transmisji multimedialnych. Również wielkości te pozwalają w łatwiejszy sposób tworzyć umowy dotyczące jakości usług 7
pomiędzy usługodawcami internetowymi a ich klientami. Warto w tym miejscu wspomnieć, że umowy tego typu nazywane są kontraktami SLA (service-level agreements) i mogą zawierać jeszcze dodatkowe parametry, takie jak np. gwarantowany procentowy czas funkcjonowania połączenia w skali pewnego przedziału czasu. Poniżej wymieniono najważniejsze spośród parametrów Quality of Service. Prędkość transmisji danych (ang. Throughput) Inaczej mówiąc przepustowość, oznacza ilość danych jakie można wysłać przez sieć pomiędzy dwoma jej punktami w jednostce czasu. Jest mierzona w bitach na sekundę, jednak w skali całego łącza można także posługiwać się wielkościami wyrażonymi w procentach, co jest użyteczne np. przy ustalaniu pewnych reguł na dostępność przepustowości. Parametr ten jest szczególnie istotny przy transmisjach dużych ilości danych takich jak transfer plików przez protokół FTP. Zagwarantowanie przepustowości jest łatwe do wprowadzenia w sieciach opartych o technologię ATM, jednak w sieciach pakietowych, a przecież Internet reprezentuje taką sieć, stanowi pewne wyzwanie dla osób zajmujących się zapewnianiem parametrów Quality of Service. Straty Pakietów (ang. Packet loss) Kiedy współdzielone łącze zostaje wykorzystane w coraz większym stopniu, kolejki w urządzeniach sieciowych zaczynają wypełniać się pakietami, a w konsekwencji nawet odrzucać kolejne pakiety. Stosując jednak odpowiednią strategię zarządzania buforami takiego urządzenia można zredukować liczbę straconych pakietów. Straty pakietów mogą być wyrażane procentową ilością zagubionych paczek danych w stosunku do łącznej liczby pakietów, przesłanych w pewnym przedziale czasu. Wzrost tego niekorzystnego zjawiska można szczególnie zauważyć, gdy pewien węzeł sieci łączy dwa jej segmenty o odmiennych prędkościach transmisji. Wtedy na interfejsie po stronie szybszego łącza pojawia się więcej pakietów niż może zostać wysłanych z drugiego interfejsu i w konsekwencji pewna ilość danych zostaje stracona. Takie krytyczne miejsca w sieci nazywa się często potocznie wąskimi gardłami a w literaturze anglojęzycznej bottleneck. 8
Opóźnienie (ang. Delay) Oznacza czas w jakim pakiety wędrują pomiędzy dwoma wyznaczonymi węzłami sieci, czyli czas przez jaki pakiet znajduje się w sieci zanim dotrze do punktu przeznaczenia. Parametr ten jest szczególnie istotny dla aplikacji interaktywnych taki jak Telnet, a także służących do transmisji głosu np. w telefonii IP czy wideokonferencjach. Opóźnienia pojawiają się przede wszystkim, gdy pakiety oczekują na obsługę wewnątrz kolejek napotykanych na swej drodze routerów. Polepszenie tego wskaźnika może być dość łatwo uzyskana w sieciach opartych o ATM, trudniej o nie w sieciach pakietowych. Zmienność opóźnienia (ang. Jitter) Ten parametr jest równie ważny jak samo opóźnienie szczególnie dla transmisji o charakterze izochronicznym czyli np. przekazach multimedialnych. Główną przyczyną powstawania zmienności opóźnień przy transmitowaniu pakietów jest przechowywanie ich w kolejkach routerów. Gdy kolejki te są puste wówczas router przesyła pakiety natychmiast. Przy zapełnianiu się kolejek opóźnienia rosną. Wzrosty opóźnień są szczególnie zauważalne dla długich kolejek, jednak ustalanie zbyt krótkich buforów może prowadzić do zwiększenia współczynnika gubienia pakietów. Zmienność opóźnienia jest też konsekwencją faktu, że pakiety mogą przechodzić przez sieć różnymi drogami, a tak zawsze może się zdarzyć gdy topologia sieci pozwala połączyć w niej dwa punkty różnymi ścieżkami. W konsekwencji istnieje możliwość, że w docelowym węźle sieci, paczki przesyłanych danych zostaną odebrane w innych odstępach czasu, niż zostały wysłane lub nawet w niewłaściwej kolejności. Częściowo tego typu niedogodność może zostać złagodzona poprzez stosowanie protokołów połączeniowych jak np. TCP, które naprawią wszelkie błędy transmisji wynikające z zaburzenia kolejności pakietów, ale niestety tego rodzaju połączeniowe rozwiązanie nie zdaje egzaminu przy transmisjach multimedialnych, które wymagają tylko aktualnych danych a wszelkie ponowienia transmisji są dla nich bezużyteczne. 9
1.2 Zakres zastosowania Największy stopień jakości usług otrzymuje się, gdy ma się do czynienia z niepodzielonym łączem komunikacyjnym, tzn. w przypadku gdy dwa komputery połączone są pojedynczym przewodem i tylko one dwa transmitują przez niego dane. Przykładowo sieć na bazie Ethernetu z przełącznikiem, w której do jednego portu tego przełącznika podłączony jest pojedynczy komputer, charakteryzuje się bardzo wysokim poziomem QoS. Tutaj sytuacja gdy dwa komputery konkurują ze sobą o dostęp do łącza występuje tylko przy wymianie informacji miedzy nimi dwoma, a gdy łącze jest typu Full Duplex, czyli dwukierunkowego, nie ma nawet takiej rywalizacji. Zagadnienie spadku jakości usług daje o sobie znać dopiero w momencie gdy dwóch lub więcej użytkowników musi dzielić ten sam kanał komunikacji. Może ono zostać dodatkowo spotęgowane niską wydajnością sprzętu sieciowego, który nie może obsłużyć zbyt nasilonego ruchu i wówczas pojawiają się opóźnienia, a także przekroczenia rozmiarów buforów. Akurat problem niewydajnego sprzętu w obecnych czasach nie jest bardzo trudny do rozwiązania ponieważ na rynku stale pojawiają się nowe urządzenia o coraz bardziej wyśrubowanych parametrach, a ich ceny ciągle maleją. Dużo poważniejsze przeszkody przy zapewnianiu gwarantowanej jakości usług pojawiają się gdy odległości pomiędzy komputerami osiągają rozmiary rzędu kilku tysięcy kilometrów jak np. przy łączach satelitarnych czy międzypaństwowych. Także i w krótszych połączeniach radiowych, dla których dużą rolę w jakości połączeń odgrywają warunki pogodowe nie są łatwym teatrem działań dla specjalistów od QoS. Parametry jakości transmisji danych obniżają się również w przypadku zatłoczenia sieci przez pakiety. W takich przypadkach protokoły, które prowadzą transmisję niejednokrotnie próbując ratować sytuację i ponawiając transmisje pakietów, dodatkowo pogarszają ten stan. Jako proste panaceum na wyżej wymienione problemy od razu na myśl przychodzi dołożenie dodatkowych mega- czy gigabitów przepustowości. Przeważnie jest to rozwiązanie dobre i tanie. Szczególnie tyczy się to poprawiania parametrów sieci lokalnych, których jesteśmy właścicielami. Jednak sytuacje, kiedy wymiana kabli jest dość kłopotliwa i wymaga przedsięwzięcia na wysoką skalę tak jest w przypadku sieci WAN lub gdy po prostu nie należą one do nas samych, są polem działania strategii Quality of Service. 10
Jednym słowem wszędzie tam gdzie polepszenie jakości połączenia nie jest proste do zapewnienia, przez oczywiste dokładanie przepustowości, implementacja mechanizmów QoS jest konieczna, a w miejscach, w których o dodatkową przepustowość jest łatwo, warto jednak zadbać o QoS. 1.3 Mechanizmy Quality of Service W celu zniwelowania spadku poziomu jakości usług dostarczanych przez sieć komputerową stosuje się kilka standardowych technik. Poniżej wymieniono najogólniejsze i najbardziej znane, które najczęściej pojawiają się w opracowaniach dotyczących gwarantowania jakości usług. Zapobieganie zatorom (ang. Congestion management) Jest kluczowym elementem QoS. Oznacza zbiór czynności jakie wykonuje węzeł sieci przy napotkaniu przeciążenia, a także umożliwiających jego uniknięcie. Podstawą radzenia sobie z przeciążeniami jest umiejętne i celowe odrzucanie pakietów pojawiających się na interfejsie wejściowym urządzenia przy wystąpieniu zatoru lub w chwili tuż przed utworzeniem się zatoru. Wówczas węzeł wysyłający pakiety może zwolnić trochę transmisję. W przypadku protokołu TCP, dodatkowo można oprócz gubienia pakietów, które jest dość nieefektywne, posłużyć się polem w pakiecie TCP określającym szerokość okna transmisji, czyli liczbę wysyłanych bez potwierdzenia pakietów. Taki mechanizm wymaga jednak współdziałania wszystkich węzłów sieci, w jakich istnieje potrzeba polepszenia parametrów przesyłania danych i jest możliwy do implementacji w sieciach, do których mamy pełen dostęp. Więcej o protokole TCP można przeczytać w dokumentach [RFC-0793], [RFC-1072], [RFC-1146], [RFC-1693] oraz późniejszych. Algorytmem, który usprawnia zapobieganie przeciążeniom jest RED (ang. Random Early Discard). Pozwala on na wcześniejsze odrzucanie pakietów, gdy bufory węzła sieci nie są jeszcze przepełnione, dzięki czemu statystycznie gubiona jest mniejsza ilość pakietów. Jednak główną zasadą zapobiegania przeciążeniu jest wciąż nieprzyjemne odrzucanie prawidłowych pakietów. Więcej o RED można przeczytać w [ICSI]. Radą dla tej przykrej konieczności może być algorytm ECN (ang. Explicit Congestion Notification), czyli mechanizm kontroli przeciążeń między dwoma punktami sieci, który w chwili napotkania przeciążenia znakuje przekazywane pakiety odpowiednim bitem. Bit ten 11
powoduje, że docelowy odbiorca pakietu nakazuje zwolnić nadajnikowi. Algorytm ECN wymaga jednak pewnego przystosowania urządzeń i protokołów sieciowych (np. IP). Dokładną specyfikacja tego mechanizmu znajduje się w dokumencie [RFC-3168]. Niestety wyżej opisany schemat postępowania nie jest wystarczający z punktu widzenia zapewniania jakości usług. Spowodowane jest to tym, że poprawę działania sieci osiągamy tylko do czasu wystąpienia następnego przeciążenia, ponieważ po pewnym czasie nadajnik zwiększy natężenie swojej transmisji i sytuacja będzie powtarzać się cyklicznie. Więcej o technikach zapobiegania zatorom można znaleźć w źródle [ICSI]. Kształtowanie ruchu (ang. Traffic shaping) Mechanizm kształtowania ruchu jest głównym tematem niniejszej pracy. Metoda ta również zapobiegającą powstawaniu zatorów. Jej zadanie opera się o wygładzanie ruchu, który wypływa z węzła do sieci, przez co odbiorca transmisji nie zostanie zalany zbyt dużą ilością docierających do niego pakietów. U podstaw kształtowania ruchu leży wykorzystanie kolejki, do której pakiety mogą napływać w dowolnej częstotliwości, jednak wyprowadzane są z niej w sposób równomierny, ze stałym natężeniem. Tworząc reguły kształtowania ruchu można także określać pewien nadmiar pakietów jakie są wysyłane z kolejki przez kilka początkowych chwil transmisji. Takie działanie jest szczególnie przydatne przy transmisjach krótkotrwałych o dużym nasileniu (ang. bursty), jak np. ruch generowany przez protokół HTTP. W protokole tym bowiem żądania i odpowiedzi pomiędzy komputerami wysyłane są stosunkowo rzadko ale niosą dość dużą ilość informacji. Na przykład otwierając jakąś stronę internetową zlecamy jej załadowanie do przeglądarki w naszym komputerze. Wtedy dane zostają przesyłane i proces ten zabiera pewną nadwyżkową część przepustowości. Następnie kiedy czytamy zawartość strony żadne informacje nie są przesyłane, a więc na korzyść naszej transmisji powstaje pewien deficyt przepustowości, który możemy po chwili znowu wykorzystać szybciej otwierając kolejną stronę. Poprawne ze względów QoS kształtowanie ruchu wiąże się także nierozerwalnie z doborem odpowiednich mechanizmów kolejkowania i klasyfikowania przepływów. 12
Klasyfikowanie i kolejkowanie (ang. Classification and queuing) Ten sposób implementacji Quality of Service grupuje pakiety w oparciu o różnego typu reguły i kryteria, którymi mogą być: adresy źródłowy i docelowy, numery portów itp.. Następnie każda z takich grup podlega pewnemu mechanizmowi ogólnie nazwanego kolejkowaniem, który zazwyczaj jest dużo bardziej wymyślną strukturą niż przychodząca od razu na myśl kolejka FIFO. W ostatnim etapie dane wybierane są z kolejek też w określonym porządku, którego głównym założeniem jest jak najbardziej sprawiedliwy przydział przepustowości łącza poszczególnym przepływom. Wszystkie tego typu sposoby postępowania z danymi oparte są o dwie podstawowe architektury: klasową i bezklasową. Kolejki bezklasowe czyli np. zwykła kolejka FIFO, kolejka priorytetowa, czy różnego typu kolejki sprawiedliwe: stochastyczne, ważone i karuzelowe w większości żądzą się własnymi regułami przyporządkowywania pakietów i nie mają zbyt wygórowanych wymagań jeśli chodzi o ich konfigurację. Taka prostota obsługi jest także poniekąd ich wadą. Niedogodności niskiej konfigurowalności nie posiadają natomiast kolejki klasowe. Są one dużo bardziej rozbudowane, ponieważ umożliwiają tworzenie hierarchii klas o różnych parametrach, z których głównym pozostaje przydzielona przepustowość. Klasowe wersje kolejek stanowią obecnie podstawę działanie wszelkich urządzeń mających zapewnić optymalne parametry jakości usług w sieciach. Dodatkowo tworzone klasy potrafią korzystać z mechanizmów bezklasowych, a więc mogą być użyte w sposób niezmiernie elastyczny. Ponieważ podstawowe mechanizmy kolejkowania łączą się nieodzownie z tematem tego opracowania czyli kształtowaniem ruchu w sieciach komputerowych, zostały omówione szczegółowo w osobnym rozdziale. Techniki rezerwowania łącza (ang. Bandwidth reservation) Techniki te są realizowane przez zastosowanie dodatkowych protokołów takich jak np. RSVP [RFC-2205], działający na routerach serwisów zintegrowanych (IntServ), omówionych w dokumencie [RFC-1633]. Protokoły te potrafią zamówić u poszczególnych węzłów sieci przez który ma być prowadzona transmisja pewne poziomy wymaganych parametrów łącza. Niestety technika ta jest trudna do zaimplementowana w sieci Internet, gdyż nie jest wiadome czy wszystkie węzły sieci zgodzą się dokonać taką rezerwację. 13
Znakowanie pakietów (ang. Packet tagging/label switching) Do pakietów dodawane są specjalne znaczniki, które pozwalają na określenie drogi pakietów w sieci pomiędzy poszczególnymi przełącznikami. Znaczniki takie mogą być umieszczane w ramkach protokołów warstwy drugiej jak w przypadku standardu IEEE 802.1p lub w warstwie trzeciej w polu Type of Service pakietu protokołu IP ([RFC-0791]) dla metody serwisów zróżnicowanych ([RFC-2475]). Metody tego typu definiują zazwyczaj priorytet i sposób w jakim urządzenia sieciowe mają traktować określoną paczkę z danymi. Kolejną technologią, o której warto w tym miejscu wspomnieć jest Multiprotocol Label Switching. Pozwala ona na dołączanie do pakietów w sieciach IP, ATM lub FrameRelay pewnych znaczników Label Switched Paths, pozwalających jednokrotnie i dokładnie określić ścieżkę, po jakiej dany pakiet będzie przesyłany poprzez sieć. Więcej informacji o protokole MPLS znajduje się w źródłach [RFC-3031] oraz [PROT]. Tego rodzaju postępowanie z pakietami w wymienionych przykładowych technikach pozwala poszczególnym węzłom sieci na łatwiejsze rozpoznawanie pakietów, bez wgłębiania się w inne ich parametry, a znakowanie pakietów odbywa się tylko jednokrotnie w obrębie danej sieci. 1.4 Zalety i wady kształtowania ruchu Poniżej przedstawiono najważniejsze wady i zalety kształtowania ruchu w sieciach komputerowych. Więcej informacji dotyczących tego podrozdziału można znaleźć na stronach firmy Packeteer [PACK] producenta urządzeń kształtujących ruch oraz stronie organizacji Bussines Communications Review [BCS] (szczególnie artykuł David a Passmore a The Big vs. Managed Bandwidth Debate z 1998r.). Zalety Oszczędności Wprowadzenie w sieci komputerowej kształtowania ruchu na dłuższą metę pozwala zaoszczędzić wydatki, które spowodowane byłyby inwestowaniem w zwiększenie dostępnej przepustowości. 14
Według badań organizacji Gartner [GART] ruch w cieciach komputerowych przedsiębiorstw do roku 2005 wzrośnie od 14 do 16 razy w stosunku do roku 2002. Dodatkowo koszty przepustowości podniosą się o 7 procent. Do roku 2010 koszty związane z rozbudową sieci wzrosną od 5 do 10 procent. Te dane jednoznacznie wskazują, że stosowanie tylko prostej metody dokładania przepustowości, jako środka zapobiegawczego na powstawanie zatorów w sieci nie jest rozsądną drogą. Zwiększenie wydajności sieci Ponieważ zastosowanie technik kształtowania ruchu zapobiega powstawaniu zatorów w sieci, to w konsekwencji daje wyraźną poprawę działania aplikacji. To stwierdzenie szczególnie dotyczy wrażliwych na opóźnienia transmisji multimedialnych. Bez stosowania tej techniki, bez względu na to jak dużo przepustowości byłoby dostępne w sieci, rywalizowanie poszczególnych transmisji o zasoby miałoby tylko charakter best efford czyli kto pierwszy ten lepszy. Takie podejście nie daje natomiast żadnych gwarancji, że usługi o specyficznych wymaganiach jak aplikacje interaktywne będą działały wydajnie. Dodatkowe możliwości kontroli Dzięki zastosowaniu kształtowania ruchu, organy zarządzające infrastrukturą sieci otrzymują nowe narządzie o dużych możliwościach, dzięki któremu możliwe jest odgórne i dokładne rozdysponowanie zasobów jakimi sieć dysponuje. Jest to szczególnie istotne gdy jedna sieć fizyczna jest współdzielona przez kilka pododdziałów o zróżnicowanym wpływie na prowadzoną działalność przedsiębiorstwa. Taka polityka umożliwia przeznaczenie większej części przepustowości sieci dla użytkowników, którym jest ona niezbędna. Bardziej sprawiedliwe rozdysponowanie zasobów W sytuacji kiedy wielu użytkowników współdzieli dane połączenie sieciowe, bardzo ważne jest zastosowanie reguł które umożliwią im równy dostęp do zasobów sieci. Nie może mieć miejsca okoliczność, gdy jedna osoba zajmuje całą dostępną przepustowość, która pierwotnie miała być rozdysponowana między większą ilość użytkowników sieci. 15
Przykładowo osoba taka może pobierać z Internetu duży plik, co utrudni lub w skrajnym przypadku uniemożliwi pozostałym prowadzenie nawet mało wymagających transmisji. Taka sytuacja jest niezmiernie prawdopodobna jeśli nie zostanie zastosowane kształtowanie ruchu. Poniższy przykład ilustruje jak pojedynczy użytkownik stosując aplikacje charakteryzujące się dużym zapotrzebowaniem na przepustowość zajmuje większą część łącza. Rysunek 1 Niesprawiedliwy dostęp do łącza. W powyższym przykładzie zastosowanie urządzenia kształtującego ruch zaraz za węzłem łączącym sieć lokalną z Internetem, pozwoliłoby na zapewnienie poszczególnym użytkownikom równego dostępu do łącza. Wzrost poziomu wiedzy o działaniu sieci Z zainstalowaniem urządzeń i oprogramowania związanych z kształtowaniem ruchu w sieci związane są też nierozłącznie narzędzia umożliwiające monitorowanie jej wydajności. Wielu producentów sprzętu do tego rodzaju zastosowań ma w swojej ofercie szeroki wachlarz aplikacji o dużych możliwościach administracyjnych i kontrolnych. Pozwala to spojrzeć na zagadnienia administracyjne i całą sieć pod trochę odmiennym kątem i poznać jej dodatkowe właściwości. Prowadzenie takiej diagnostyki pozwala także wyeliminować pewne aplikacje zakłócające pracę sieci lub obniżające jej wydajność. Bez takiej wiedzy osoba zarządzająca siecią mogłaby podejmować niewłaściwe decyzje np. o niepotrzebnej i kosztownej rozbudowie w przypadku częstego występowania zatorów. 16
Poprawa działania szczególnie ważnych aplikacji Stosowanie określonych algorytmów i reguł kształtowania ruchu umożliwia zagwarantowanie pewnych części dostępnego łącza dla aplikacji szczególnie ważnych dla misji przedsiębiorstwa. Jest to bardzo istotne zagadnienie w organizacji pracy wielu firm. Zdarza się bowiem bardzo często, że użytkownicy oprócz pracy z firmowymi aplikacjami, korzystają również z innych produktów, które zajmują dużą część przepustowości. Dotyczy to przede wszystkim aplikacji służących do słuchania muzyki przez Internet np. RealPlayer, czy też pobierania dużych plików jak Kazaa i Emule. Poniższy rysunek pokazuje jak kształtowanie ruchu może wpłynąć na proporcje w jakich poszczególnym grupom aplikacji przydzielona została przepustowość w skali całego łącza: Rysunek 2 Poprawa działania aplikacji kluczowych dla misji przedsiębiorstwa Większa wymierność finansowa poziomu usług Zarządzanie zasadami przydzielania użytkownikom przepustowości, w ogromnej mierze usprawnia sposób, w jakim można pobierać od nich opłaty za tego typu usługi. Umożliwia to wprowadzenie kilku poziomów usług o różnej dostępnej przepustowości i cenie. Ta cecha przydaje się przede wszystkim dostawcom internetowym i dzięki niej mogą oni zróżnicować swoją ofertę. Wady Większa złożoność sieci Zarządzanie siecią komputerową przy wprowadzeniu mechanizmów Quality of Service, a w szczególności kształtowania przepustowości wiąże się z pojawieniem się wielu dodatkowych 17
elementów, z którymi administrator sieci musi się zapoznać. Elementami tymi mogą być routery i przełączniki z możliwością zarządzania przepustowością lub specjalistyczne urządzenia przeznaczone wyłącznie do tego celu tzw. traffic shapers. Brak znajomości zasad ich działania, lub nie do końca dokładne zrozumienie mechanizmów rządzących kształtowaniem ruchu, może doprowadzić nawet do spadku wydajności sieci zamiast ją poprawić. Dodatkowe koszty Tą niekorzystną cechę wprowadzenia kształtowania ruchu w sieci komputerowej można podzielić na dwa zasadnicze aspekty. Pierwszy z nich wiąże się z koniecznością zakupu dodatkowych urządzeń i oprogramowania, które umożliwiają wprowadzenie tej technologii. Częstokroć oferowany przez dostawców sprzęt sieciowy wyposażony jest w funkcje, które działają dopiero jeśli cała sieć zbudowana jest tylko w oparciu o produkty tego jednego producenta. Drugi niekorzystny aspekt polega na potrzebie zatrudnienia wyspecjalizowanego personelu potrafiącego obsługiwać skomplikowane techniki kształtowania ruchu. Problemy organizacyjne Poza wzrostem kosztów lub problemami technicznymi zarządzanie przepustowością ciągle może powodować duże dylematy wśród osób zarządzających siecią z powodów organizacyjnych. W odróżnieniu od strategii stawiającej na proste zwiększanie przepustowości, przy zachowaniu dla wszystkich użytkowników równych praw w dostępie do łącza, techniki związane z kształtowaniem przepustowości wymagają jawnego przypisania użytkowników bądź aplikacji do pewnych grup o odmiennym traktowaniu. W jaki sposób administrator sieci czy ktokolwiek inny może określić kto zostanie bardziej lub mniej uprzywilejowany przy dostępie do łącza? Jak wiele klas usług należy utworzyć i jak przypisać do nich użytkowników i aplikacje? Poza tym z wprowadzeniem kształtowania ruchu w sieci wiąże się dodatkowa konieczność sprawdzania poprawności wprowadzonych konfiguracji i pomiarów wydajności. Firmy, które zdecydują się na wprowadzenie zarządzania przepustowością w swojej sieci, mogą w końcu dojść do wniosku, że wymaga to od nich wprowadzenia dodatkowych, często niechcianych przedsięwzięć. 18
Zwiększone ryzyko awarii Niejednokrotnie zaawansowane funkcje urządzeń, które nie zostaną do końca zrozumiane przez administratorów sieci, mogą pogorszyć funkcjonowanie aplikacji krytycznych dla działalności firmy. To stanowi duże ryzyko dla organów zarządzających firmą i musi zostać dokładnie rozważone przed decyzją o implementacji kształtowania przepustowości w sieci przedsiębiorstwa. Utrudnienia przy rozwiązywaniu problemów z siecią Uruchomienie kształtowania ruchu w sieci komputerowej jest dodatkowym potencjalnym czynnikiem, który może powodować jej złe działanie. Ten fakt prowadzi do spowolnienia czynności mających na celu znalezienie przyczyny niewłaściwego funkcjonowania sieci. Trudności z zastosowaniem w Internecie Mechanizm kształtowania ruchu jest trudny do wprowadzenia w sieciach, które wykorzystują Internet, jako ogniwo łączące pewne ich części. Jest to szczególnie widoczne, gdy ruch pakietów ma być prowadzony poprzez kilka węzłów należących do różnych dostawców. Żeby kształtowanie ruchu mogło poprawnie funkcjonować w takiej infrastrukturze konieczne jest porozumienie pomiędzy takimi dostawcami i podobna konfiguracja zaangażowanych w transmisję urządzeń. Obecnie jednak powstaje szereg rozwiązań pozwalających wyeliminować taką niedogodność o czym więcej w części trzeciej niniejszej pracy. Doświadczenia historyczne Powszechnie wiadomo, że najlepiej przyjmują się technologie proste, którymi łatwo zarządzać. Przedsiębiorstwa niechętnie podchodzą do sieci, które wymagają zwiększonych czynności administracyjnych. Istnieje wiele przykładów z historii sieci komputerowych jak technologia ATM, która mimo swoich wielu zalet i cech wspierających Quality of Service, nie zyskała tak dużej popularności wśród użytkowników jak produkty prostsze oparte np. na protokole Ethernet. 19
Rozdział 2 Algorytmy kształtowania ruchu 2.1 Algorytmy kolejkowania Algorytmy kolejkowania są podstawowymi mechanizmami kształtowania ruchu w sieciach komputerowych. Umożliwiają bowiem utworzenie pewnych kategorii przepływu danych, do których można zastosować określone reguły dostępu do łącza. Poniżej przedstawiono najważniejsze z algorytmów kolejkowania. Kolejkowanie priorytetowe Algorytmy kolejkowania priorytetowego tworzą wiele kolejek dla każdego interfejsu sieciowego i każdej z takich kolejek przypisują odpowiedni priorytet. Urządzenia korzystające z kolejek priorytetowych najpierw decydują, do których kolejek przypisać jaki rodzaj ruchu poprzez sprawdzanie pewnych reguł skonfigurowanych wcześniej. Następnie algorytm przepuszcza jako pierwsze pakiety pochodzące z kolejek o wysokim priorytecie, a dopiero kiedy kolejki te zostaną opróżnione, obsługuje kolejno bufory o niższych priorytetach. Oznacza to, że pewne przepływy będą lepiej traktowane od innych. Taki typ kolejkowania jest oczywiście lepszym rozwiązaniem przy zapewnianiu zróżnicowanego poziomu obsługi dla różnych typów ruchu niż zwykłe kolejki FIFO. Jednakże kolejkowanie priorytetowe przeznacza dla bufora, który aktualnie obsługuje, całą dostępną przepustowość łącza. Jest to oczywiście działanie niepożądane z punktu widzenia Quality of Service Potencjalnym rezultatem takiego postępowania jest to, że kolejkowanie priorytetowe może doprowadzić do całkowitego zatrzymania ruchu o niższym priorytecie. Taki scenariusz jest 20
szczególnie prawdopodobny gdy algorytm ten jest jedyną stosowaną metodą kolejkowania w danym urządzeniu. Nie jest zatem zaskakujące, że omawiany typ kolejkowania używany jest w połączeniu z innymi technikami jak: ważonym sprawiedliwym kolejkowaniem, czy sterowaniem szerokością okna transmisji w protokole TCP. Kolejkowanie sprawiedliwe SFQ (ang. Stochastic Fairness Queuing) Ten rodzaj sprawiedliwego kolejkowania tworzy po jednej kolejce FIFO dla każdego przepływu danych. Powstałe przepływy nazywane są konwersacjami i grupują pakiety ze względu na adresy źródłowe i docelowe oraz typy używanych protokołów. Proces grupowania odbywa się przy pomocy funkcji haszującej, która na podstawie wybranych parametrów pakietu generuje dla niego numer kolejki. Nadany w ten sposób identyfikator grupy powinien być w miarę możliwości unikalny, jednak ponieważ liczba kolejek jest skończona i relatywnie nieduża, to może się zdarzyć, że kilka konwersacji będzie dzielić tę samą kolejkę. Poszczególne kolejki przechowujące każdą z konwersacji obsługiwane są w porządku karuzelowym (ang. round robin) tzn. pakiety opuszczają bufory kolejno i cyklicznie. Oznacza to, że kolejkowanie stochastyczne jest sprawiedliwe, jedynie gdy wszystkie pakiety mają podobną długość. Sytuacja, w której dwa przepływy dzielą jedną kolejkę jest niepożądana, ponieważ zmniejszeniu ulega wówczas czas dostępu do łącza dla każdego z nich. Problem ten został rozwiązany poprzez losowe zmiany algorytmu funkcji haszującej co pewien okres, co zapewnia, że niekorzystne przypisywanie numerów kolejek do przepływów będzie miało miejsce przez krótką chwilę. Więcej o SFQ można przeczytać w artykule [SFQ91]. WFQ (ang. Weighted Fairness Queuing) Ważone sprawiedliwe kolejkowanie podobnie jak kolejkowanie priorytetowe tworzy wiele kolejek dla różnych typów ruchu. Powiązanie pomiędzy kolejkami i przepływami otrzymuje się poprzez zastosowanie pewnych ustalonych kryteriów. Również do każdej z kolejek przypisywana jest określona wartość priorytetu. 21
Oprócz tego każdej z kolejek nadawana jest też waga proporcjonalna to posiadanego priorytetu. Przeznaczeniem wspomnianej wagi jest ustalenie jaka część dostępnej przepustowości przypadnie dla danej kolejki. Inaczej mówiąc wagi kolejek gwarantują, że bufory o wyższych priorytetach będą mogły wykorzystać więcej przepustowości niż bufory o niskich priorytetach. Opróżnianie kolejek odbywa się przy zastosowaniu algorytmu Bit-by-bit Round-robin, który cyklicznie wybiera z każdej kolejki po jednym bicie. Pakiet zostaje wysłany gdy ostatni jego bit opuści bufor. Zapewnia to sprawiedliwość kolejki dla pakietów o różnych długościach. Dokładna ilość przepustowości jaką każda kolejka otrzymuje, jest jednak zależna od liczby kolejek, które w tym samym czasie korzystają z łącza i nie może być dokładnie określona. Przykładowo mając trzy kolejki o wysokim priorytecie i dwie o niskim, w sytuacji gdy pakiety oczekują na wysłanie w jednej kolejce o wysokim priorytecie i w dwóch o niskim, wówczas kolejka o wysokim priorytecie otrzyma połowę dostępnej przepustowości, a pozostałe dwa bufory po jednej czwartej. Jeśli zaś pakiety pojawią się tylko w trzech kolejkach o wysokim priorytecie, to każda z tych kolejek będzie mogła wykorzystać po jednej trzeciej dostępnej przepustowości. Powyższy przykład ilustruje, że ważone kolejkowanie priorytetowe zapewnia każdej klasie ruchu dostęp do łącza, ale nie gwarantuje określonej przepustowości. Algorytm Deficit Round Robin Algorytm Deficit Round Robin umożliwia sprawiedliwe kolejkowanie pakietów pochodzących z wielu różnych przepływów. Przepływy takie reprezentują kolejki FIFO, w których przechowywane są pakiety i mogą oznaczać np. klasy w algorytmie hierarchicznego wiadra z żetonami. Ponieważ DRR jest typem algorytmu karuzelowego, to poszczególne przepływy obsługiwane są cykliczne. Istotny jest jednak sposób, w jaki kolejne przepływy otrzymują prawo do wysyłania. Transmitowanie po jednym pakiecie z każdego przepływu mogłoby spowodować niesprawiedliwe zwiększenie się czasu oczekiwania na wysłanie w kolejkach przechowujących krótsze pakiety. Jest do zjawisko niepożądane z punktu widzenia Quality of Service. 22
Zmniejszenie takiego niekorzystnego efektu uzyskuje się, poprzez przyznanie każdemu przepływowi pewnej kumulującej się puli bajtów, które może on wysłać podczas jednego obiegu algorytmu. Za każdym razem kiedy algorytm wybiera następną kolejkę do wysyłania, otrzymuje ona dodatkową część tej puli, nazywaną kwantem. Dla poszczególnych kolejek kwanty mogą mieć różną wielkość zależną od charakteru danego przepływu. Po wysłaniu pakietu przeznaczona na ten cel część puli bajtów zostaje odebrana kolejce. Pozostała zaś część nazywana jest deficytem i pozostaje w kolejce do następnej wysyłki. Poniższy rysunek przedstawia przykład działania algorytmu DRR. Na rysunku widać, że z każdą kolejką powiązane są osobne liczniki deficytu oraz wartości kwantu. Zmienna DRRptr wskazuje na kolejkę, która aktualnie może wysyłać pakiety. Rysunek 3 Algorytm DRR krok 1 Na początku pojedynczego etapu wartość licznika deficytu inkrementowana jest o wartość kwantu. W zamieszczonym przykładzie jest to 500 bajtów. Następnie algorytm sprawdza czy wartość licznika deficytu jest większa od wielkości pakietu. W tym przypadku pakiet ma 200 bajtów, a więc może zostać wysłany. Jego długość odejmowana jest od licznika deficytu, który przyjmuje wartość 300. Wskaźnik DRRptr pozostaje nieruchomy. Kolejna próba wysłania pakietu z pierwszej kolejki kończy się jednak niepowodzeniem, gdyż rozmiar pakietu wynoszący 750 bajtów przekracza wielkość deficytu (300). Powoduje to, że wskaźnik DRRptr przechodzi do następnej kolejki. Ta sytuacja przedstawiona została na poniższym rysunku. 23
Rysunek 4 Algorytm DRR krok 2 Można tu zauważyć, że z kolejki drugiej w następnym kroku nie zostanie wysłany żaden pakiet. Nie pozwala na to bowiem zbyt niski poziom deficytu (400). Bufor ten będzie mógł zostać opróżniony dopiero gdy algorytm wykona pełny obieg po wszystkich kolejkach. Po obsłużeniu wszystkich kolejek, wskaźnik DRRptr przechodzi z powrotem do kolejki pierwszej. W omawianym algorytmie najistotniejszym faktem jest to, że wartość deficytu inkrementowana jest przy przechodzeniu pomiędzy kolejnymi kolejkami, tzn. gdy zostanie on wyczerpany, a nie przy próbie wysłania pakietu. Algorytm DRR został opisany w artykule [DRR95]. Kolejki klasowe Kolejki klasowe są najbardziej rozbudowanymi mechanizmami kolejkowania. Umożliwiają bowiem tworzenie pewnych klas ruchu, pomiędzy którymi istnieją zależności hierarchiczne. Poszczególne klasy grupują pakiety w oparciu o różnego typu kryteria, którymi mogą być adresy warstwy sieciowej, numery portów warstwy transportowej, typy aplikacji przez jakie zostały wygenerowane oraz inne. Każdej klasie przypisywana jest też przeznaczona dla niej przepustowość. Klasy potomne mogą dziedziczyć przepustowość od swoich przodków, a także pożyczać ją pomiędzy sobą. Dodatkowo każda klasa ruchu może posługiwać się własnym algorytmem kolejkowania bezklasowego, przykładowo którymś z wymienionych powyżej. Takie cechy kolejek klasowych zapewniają dużą elastyczność przy tworzeniu reguł na przydzielanie przepustowości. To sprawia, że obecnie stają się one największym obiektem zainteresowań producentów sprzętu potrafiącego zarządzać przepustowością. 24
Spośród kolejek klasowych należy wymienić przede wszystkim: CBQ (ang. Class Based Queuing), H-PFQ (ang. Hierarchical Packet Fair Queueing) omówiony w [HPFQ96] oraz HTB (ang. Hierarchical Token Bucket) opisany w [DEVIK]. Ponieważ do praktycznej realizacji kształtowania ruchu został wybrany algorytm HTB, to omówiono go dokładnie osobnym rozdziale Hierarchiczne wiadro z żetonami. Informacje dotyczące pozostałych algorytmów można znaleźć w źródłach: [HPFQ], [ICSI]. 2.2 Manipulowanie rozmiarem okna TCP Aby zrozumieć zasadę działanie tego mechanizmu, należy w pierwszej kolejności poznać kilka szczegółów dotyczących transmisji w protokole TCP. Urządzenia komunikujące się poprzez ten protokół wysyłają pakiety określane często skrótem ACK, które oznaczają potwierdzenie odebrania danych. Takie pakiety potwierdzające zawierają także wielkość nazywaną szerokością okna. Informuje ona nadajnik jaką ilość danych może wysłać zanim odbierze potwierdzenie ich otrzymania przez odbiornik. Przy wystąpieniu zatoru, kolejki urządzeń wypełniają się i odrzucają pakiety. To sprawia, że rozmiar okna zostaje automatycznie zmniejszony przez protokół i zator ustępuje. Problem pojawiają się jednak w momencie, gdy strony transmisji znowu zaczynają zwiększać rozmiar okna i wysyłać coraz to większe ilości danych. TCP wykorzystuje bowiem dostępną przepustowość dość agresywnie, co doprowadza do występowania kolejnych zatorów. Węzeł sieci, który znajduje się na drodze transmisji TCP może zwiększać lub zmniejszać rozmiar okna. Taka cecha sprawia, że można próbować unikać zapychania łącza. Urządzenia stosujące technikę dostosowywania rozmiaru okna przechwytują pakiety ACK i ustawiają w nich własne wielkości w polu window pakietu. Szczegóły mechanizmu potwierdzania i dostosowywania rozmiaru okna w protokole TCP można odnaleźć w dokumencie [RFC-0813]. 2.3 Idea cieknącego wiadra i wiadra z żetonami Algorytmy cieknącego wiadra oraz wiadra z żetonami używane są do kontroli zajętości przepustowości w sieci komputerowej. Umożliwiają nałożenie ograniczeń na prędkość z jaką pakiety są transmitowane w jednostkach danych na sekundę. 25
Stosuje się je przy wyprowadzaniu pakietów z kolejek. Oznacza to, że algorytmy te nie są same w sobie algorytmami kolejkowania, ale służą do pewnego zaplanowania procesu wysyłania pakietów. Pozwalają dokładnie określić jaką część łącza otrzyma dany przepływ informacji, do którego zostały zastosowane. Ich implementacjom przyświecają dwa nieco odmienne podejścia do ograniczania przepływów, co zostało dokładnie omówione poniżej. Przedstawiane algorytmy w poniższych opisach nazywane są także funkcjami kształtującymi przepływ. Cieknące wiadro (ang. Leaky bucket) Parametrami algorytmu są: wielkość bufora wiadra oraz liczba danych jakie opuszczają bufor w jednostce czasu podana w bajtach lub bitach na sekundę. Algorytm ten umożliwia dokładne określenie z jaką częstością dane będą pobierane z kolejek i przesyłane przez sieć. Natężenie przepływu danych objętego taką strategią charakteryzuje się płaskim przebiegiem. Gwarantuje to zabezpieczenie przed wystąpieniem przeciążenia w docelowym dla interfejsu który stosuje kształtowanie ruchu węźle sieci. Podstawę działania cieknącego wiadra stanowi pojedynczy bufor kolejka FIFO gromadząca pakiety. Posiada określoną maksymalną długość. Jednym z najistotniejszych faktów jest to, że elementami, które podlegają buforowaniu są właśnie pakiety, a nie żetony, jak w przypadku drugiego z omawianych algorytmów. Element algorytmu planujący wysyłanie pakietów wybiera je z kolejki przy zachowaniu zasady, że zawierana przez pakiety liczba bajtów, która została wysłana w jednostce czasu jest stała i ściśle zdefiniowana jako parametr całej procedury. Takie postępowanie gwarantuje, że chociaż na wejściu funkcji kształtującej przepływ pakiety pojawiają się w różnych odstępach czasu i czasami maksymalna przepustowość jest przekroczona, to wyjście ma stałe i określone natężenie. 26
Poniższy rysunek ilustruje w schematyczny sposób działanie algorytmu i jego analogię do rzeczywistego cieknącego wiadra. Rysunek 5 Algorytm cieknącego wiadra Dodatkowo należy wspomnieć, że pewne pakiety wchodzące do bufora mogą zostać odrzucane na skutek ich przedawnienia lub przekroczenia rozmiaru samej kolejki. Wówczas takie nadmiarowe pakiety muszą zostać odrzucone. Jednak zyskiwana jest pewność, że łącze, w którym zastosowano kształtowanie ruchu nie będzie przeciążone. Wadą tego algorytmu jest to, że nie pozwala on na chwilowe wzrosty natężenia ruchu zaraz po jego rozpoczęciu. Taka właściwość jest pożądana gdy istnieje potrzeba szybkiego przesłania większej liczby informacji, ale przez krótki okres czasu. Niedogodność tą niweluje omówiony dalej algorytm wiadra z żetonami. Wiadro z żetonami (ang. Token bucket) Parametrami algorytmu są: maksymalna wielkość bufora wiadra który przechowuje żetony oraz prędkość z jaką żetony są generowane. Dodatkowo przydatne jest określenie jakiej liczbie wysyłanych danych odpowiada pojedynczy żeton. Dla ułatwienia można przyjąć, że do wysłania pojedynczego bajta potrzebny jest jeden żeton. Algorytm ten podobnie jak cieknące wiadro również umożliwia określenie z jakim natężeniem dane będą wysyłane. Jednak w odróżnieniu od poprzednio omawianego, pozwala, aby ruch wychodzący zmieniał się częściowo w zależności od stopnia nasilenia żądań 27
wysyłania pakietów. Jest to szczególnie istotne np. dla protokołu HTTP, który ma dość duże zapotrzebowanie na przepustowość, jednak poszczególne transfery danych nie są bardzo częste i wówczas przepustowość nie jest wykorzystywana w ogóle. Na przykład podczas otwierania strony internetowej przesyłane są duże ilości informacji tekst, grafika, dane XML itp. co powoduje, że aby przesłać pakiety żetony wybierane są z wiadra. Po załadowaniu witryny użytkownik ją przegląda i w tym czasie nowe żetony z powrotem zapełniają bufor, ponieważ chwilowo nic nie trzeba przesyłać. Następnie cały proces się powtarza. Taki typ ruchu w sieci często nazywany jest w anglojęzycznej literaturze bursty czyli wybuchowy. Podstawą działania tego algorytmu jest bufor gromadzący żetony. Stanowi to również różnicę w stosunku do algorytmu cieknącego wiadra, ponieważ tam algorytm przechowywał pakiety. Każdy taki żeton może przypominać bilet umożliwiający przesłanie pewnej porcji danych (w najprostszym przypadku pojedynczego bajta). Po przesłaniu pakietu pewna ilość wykorzystanych do tego celu biletów ulega zniszczeniu. Efekt wygładzenia przepływu i ograniczenie wykorzystania przepustowości otrzymuje się przez stałe w czasie generowanie nowych żetonów. Liczba żetonów nie może jednak przekroczyć maksymalnej pojemności bufora czyli inaczej głębokości wiadra. Wielkość ta jest parametrem algorytmu. Gdy nie ma aktualnie danych do wysłania, żetony są gromadzone, aż wypełnią bufor i mogą zostać użyte do wysłania zwiększonej liczby pakietów i obsłużenia nagłych wzrostów natężenia ruchu (ang. burst rate). Warto jeszcze wspomnieć, że jedna z różnic pomiędzy algorytmem cieknącego wiadra i wiadra z żetonami polega na tym, iż w pierwszym z nich w przypadku przekroczenia rozmiaru bufora odrzucane są pakiety a nie żetony. Oczywiście stosując algorytm wiadra z żetonami również możemy napotkać zjawisko gubienia pakietów, jednak będzie ono spowodowane działaniem innego algorytmu, który zarządza samym buforem. Poniższy rysunek ilustruje w schematyczny sposób działanie algorytmu wiadra z żetonami. Na rysunku widać, że fakt zgromadzenia w buforze pewnej dodatkowej liczby żetonów pozwala na wysłanie pakietów pojawiających się na początku z taką prędkością w jakiej wchodzą one do kolejki. Uważny obserwator zauważy, że w przedstawionym przykładzie wszystkie pakiety mają tą samą wielkość i pojedynczy żeton pozwala na wysłanie jednego pakietu. Jest to dość idealna sytuacja i raczej niespotykana. Na poniższym rysunku można 28
także dostrzec, że od głębokości wiadra zależy jak długo będzie trwało zwiększone natężenie ruchu. Rysunek 6 Algorytm wiadra z żetonami Sposób implementacji algorytmu wiadra z żetonami. Jako praktyczną realizację algorytmu wiadra z żetonami stosuje się liczbę 32-bitową bez znaku, która odpowiada po prostu liczbie żetonów znajdujących się aktualnie w wiadrze. W chwili gdy pakiet ma zostać przesłany liczba ta jest inkrementowana o pewną wartość oznaczającą, ile żetonów powstało od czasu ostatniego wysyłania. Dla ułatwienia i przejrzystości można założyć, że bez względu na prędkość danego interfejsu w ciągu jednej milisekundy generowany jest pojedynczy żeton. Oznacza to, że w ciągu sekundy powstaje 1000 żetonów. Takie założenie umożliwia łatwo obliczyć wartość, o jaką należy zwiększyć liczbę żetonów w wiadrze, gdyż większość systemów operacyjnych jako jednostkę czasu stosuje właśnie jedną milisekundę. Największą granulację czasu można uzyskać odczytując czas procesorowy liczony w taktach zegara (ang. ticks), jednak częste stosowanie tego typu zabiegu niestety może zmniejszyć prędkość działania kodu i jest odradzane w dokumentacji Device Driver Kit [MSDN]. Sumaryczna wielkość liczby żetonów, które były w wiadrze i które zostały wygenerowane, nie może jednak przekroczyć pewnej wartości oznaczającej wielkość wiadra. 29
Następnie proces wysyłający sprawdza czy liczba żetonów znajdujących się obecnie w wiadrze (po inkrementacji), pozwala na to by kolejny pakiet mógł zostać przesłany. Należy tutaj zauważyć, że liczba bajtów pakietu odpowiadająca pojedynczemu żetonowi może być różna w zależności od częstości, z jaką dane mają być wysyłane. Znajomość współczynnika zamieniającego liczbę bajtów na liczbę żetonów jest kluczowa dla wykonania tej operacji. Do jego wyznaczenia można posłużyć się wzorem: b 2t = tps rate Wzór 1 W powyższym wzorze tps oznacza prędkość generowania żetonów wyrażoną w żetonach na sekundę, rate prędkość wysyłania danych w bajtach na sekundę, b2t jest wspomnianym współczynnikiem zamieniającym bajty na żetony. Przykładowo gdy żetony generowane są z prędkością 1000 żetonów na sekundę, a prędkość transmisji ma wynosić 2000 bajtów na sekundę, wówczas pojedynczy żeton będzie umożliwiał wysłanie 2 bajów. Po obliczeniu liczby żetonów potrzebnej do wysłania pakietu, jeśli jest ona wystarczająca można zdecydować o jego wysłaniu i wówczas zmniejszyć wykorzystaną liczbę żetonów w buforze. Jeśli liczba żetonów w buforze nie byłaby wystarczająca, należy wstrzymać proces wysyłający do czasu kiedy niezbędne żetony zostaną wygenerowane. Podwójne wiadro z żetonami Stosowanie jednego wiadra z żetonami jako sposobu kształtowania ruchu w sieci, nie jest zbyt mile widziane z punku widzenia Quality of Service. Jest to spowodowane faktem, że choć usługi, których charakter niemal wymaga zezwalania na chwilowe wzrosty zajętości przepustowości, są przez omawiany algorytm traktowane poprawnie, to jednak te nagłe skoki natężenia nie mogą być w żaden sposób kontrolowane. Określane są one jedynie poprzez wielkość wiadra, jednak w większości przypadków wiadro jest na tyle duże, aby możliwe było kształtowanie również wysokich przepustowości. Ta niedogodność niwelowana jest dzięki wprowadzeniu dodatkowego wiadra z żetonami, którego zadaniem jest kształtowanie tylko takiego gwałtownego zwiększenia natężenia ruchu. 30