IPv6

background image

Rok akademicki 2011/2012

POLITECHNIKA WARSZAWSKA

WYDZIAŁ ELEKTRONIKI I TECHNIK INFORMACYJNYCH

INSTYTUT INFORMATYKI

PRACA DYPLOMOWA MAGISTERSKA

Kamil Kukołowicz

WYKORZYSTANIE NAGŁÓWKA HOP-BY-HOP

PROTOKOŁU IPV6 DO TRANSPORTU WIADOMOŚCI

KONTROLNYCH W BEZPRZEWODOWYCH

SIECIACH AD-HOC

Opiekun pracy

mgr inż. Paweł Radziszewski

Ocena ………………………

……………………………...

Podpis Przewodniczącego

Komisji Egzaminu Dyplomowego

background image

STRESZCZENIE

Przedmiotem niniejszej pracy jest zbadanie możliwości wykorzystania nagłówka hop-by-hop

w sieciach IPv6 do przesyłania wiadomości sygnalizacyjnych i próba oceny przydatności

takiego rozwiązania. Przydatność jest oceniana z punktu widzenia wykorzystania

w środowisku bezprzewodowej sieci ad-hoc, do optymalizacji jej działania. Stworzono

środowisko testowe umożliwiające przesyłanie wiadomości w nagłówkach hop-by-hop

i przeprowadzono szereg testów. Przeprowadzony zbiór testów jest tylko małym krokiem do

zbadania rzeczywistej przydatności nagłówka hop-by-hop, jako sposobu przesyłania

wiadomości sygnalizacyjnych w bezprzewodowych sieciach ad-hoc.

Słowa kluczowe: IPv6, nagłówek rozszerzający, QoS, Linux, jądro

USAGE OF HOP-BY-HOP IPV6 HEADER FOR TRANSMISSION OF CONTROL

INFORMATION IN WIRELESS AD-HOC NETWORKS

SUMMARY

The scope of this thesis covers studies on usage of hop-by-hop header in IPv6 networks for

sending status information and evaluation of possible advantages of this type of

communication. A test environment that provides sending messages mechanism in hop-by-

hop header was created and several tests were proceeded. The results of tests are evaluated in

relation to ad-hoc wireless networks and network optimization in those networks. The group

of tests are only a small step to evaluate real advantages and disadvantages of using hop-by-

hop headers in ad-hoc networks.

Keywords: IPv6, Extension Headers, Quality of Service, QoS, Linux, kernel

background image

ŻYCIORYS

Urodziłem się 04 lutego 1986 roku w Warszawie. W roku 2005 ukończyłem XIV

liceum ogólnokształcące w Warszawie i rozpocząłem studia na Wydziale Elektroniki

i Technik Informacyjnych, na kierunku Elektronika, Informatyka i Telekomunikacja, na

Politechnice Warszawskiej. W roku 2009 uzyskałem dyplom inżyniera specjalności

teleinformatyki i zarządzania w telekomunikacji, z wynikiem bardzo dobrym. W tym samym

roku rozpocząłem stacjonarne studia drugiego stopnia na kierunku Informatyka, na

specjalności Inżynieria Systemów Informatycznych. Od końca roku 2009 pracuję w dużej

firmie telekomunikacyjnej, wykonując pracę analityka systemów informatycznych.

Kamil Kukołowicz

background image

SPIS TREŚCI

WYKAZ UŻYWANYCH SKRÓTÓW

.............................................................................

6

1. WSTĘP

................................................................................................................

7

1.1 CEL I ZAKRES PRACY

.....................................................................................

9

2. Protokół IPv6

.....................................................................................................

10

2.1 Adresacja IPv6

.............................................................................................

11

2.2 Struktura nagłówka IPv6

..............................................................................

13

2.3 Bezstanowa konfiguracja adresu IPv6

.........................................................

15

2.4 Nagłówek hop-by-hop i inne nagłówki rozszerzające

...................................

17

3. Implementacja protokołu IPv6 w systemie Linux

..............................................

23

3.1 Obsługa pakietów przychodzących i wychodzących.

...................................

24

3.2 Bufor na pakiet – skb_buff

...........................................................................

25

3.3 Pakiety – obsługa w warstwie łącza danych

................................................

27

3.4 Rodzina protokołów INET6

...........................................................................

28

3.5 Gniazdka sieciowe w IPv6

............................................................................

29

4. Przegląd możliwych implementacji programu.

.................................................

32

4.1 Implementacja w jądrze

..............................................................................

33

4.2 Implementacja z wykorzystaniem zaczepów

...............................................

38

4.3 Implementacja w przestrzeni użytkownika.

.................................................

43

4.4 Podsumowanie

............................................................................................

47

5. Środowisko stworzone do testownia wykorzystania nagłówka hop-by-hop, jako
kanału komunikacyjnego

......................................................................................

49

5.1 Wstęp do funkcjonalności stworzonego środowiska testowego.

..................

50

5.2 Program warstwy transportowej.

.................................................................

52

5.2.1 Funkcjonalność

......................................................................................

54

5.2.2 Implementacja

......................................................................................

58

5.3 Program klienta

...........................................................................................

63

5.3.1 Funkcjonalność

......................................................................................

63

5.3.2 Implementacja

......................................................................................

68

5.4 Pomiar opóźnienia przesyłania wiadomości

.................................................

69

6. Środowisko testowe

..........................................................................................

71

6.1 Schemat środowiska testowego

..................................................................

72

6.2 Program scp

................................................................................................

74

6.3 Program vlc

.................................................................................................

75

6.4 Mechanizm kształtowania ruchu

..................................................................

80

7. Testy akceptacyjne.

..........................................................................................

84

7.1 Środowisko testowe

.....................................................................................

85

7.2 Scenariusze testów akceptacyjnych.

...........................................................

85

4

background image

8. Testy wydajności i opóźnienia

...........................................................................

91

8.1 Test w. 1. Priorytet 3.

...................................................................................

92

8.2 Test w. 2. Priorytet 4. Typ potwierdzenia 2.

..................................................

93

8.3 Test w. 3. Priorytet 4. Typ potwierdzenia 1.

..................................................

94

8.4. Test o. 1. Priorytet 2. Syg. constant.

...........................................................

95

8.5 Test o. 2. Priorytet 3. Syg. constant.

............................................................

96

8.6 Test o. 3. Priorytet 4. Syg. const.

.................................................................

97

8.7 Test o. 4. Priorytet 2. Syg. random.

.............................................................

98

8.8 Test o. 5. Priorytet 2. Sygnał snmp-like.

.......................................................

99

8.9 Podsumowanie testów wydajności i opóźnienia.

........................................

100

9. Testy przesyłania danych.

...............................................................................

107

9.1 Test p. 1. Priorytet 1. Scp. Syg. random.

....................................................

109

9.2 Test p. 2. Priorytet 1. Scp. Syg. random rzadki.

.........................................

110

9.3 Test p. 3. Priorytet 2. Scp. Syg. const. Kier. przeciwny.

..............................

111

9.4 Test p. 4. Priorytet 2. Scp. Syg. const. Kier. zgodny.

..................................

113

9.5 Test p. 5. Priorytet 2. Scp. Syg. const. Kier. zgodny. Tc duże opóźnienie.

...

114

9.6 Test p. 6. Priorytet 4. Scp. Syg. const. Kier. zgodny. Tc duże opóźnienie.

...

116

9.7 Test p. 7. Priorytet 4. Scp. Syg. const. Kier. zgodny. Tc małe opóźnienie.

. .

117

9.8 Test p. 8. Priorytet 2. Vlc. Syg. const.

........................................................

119

9.9 Test p. 9. Priorytet 2 duży odstęp. Vlc. Syg. const.

....................................

120

9.10 Test p. 10. Priorytet 1. Vlc. Syg. const.

....................................................

122

9.11 Test p. 11. Priorytet 2. Vlc. Syg. snmp-like.

..............................................

123

9.12 Test p. 12. Priorytet 4. Vlc. Syg. snmp-like.

..............................................

125

9.13 Test p. 13. Priorytet 3. Vlc. Syg. snmp-like.

..............................................

126

9.14 Test p. 14. Priorytet 4. Vlc. Tc. Syg. snmp-like.

........................................

128

9.15 Test p. 15. Priorytet 3. Vlc. Tc. Syg. snmp-like.

........................................

130

9.16 Podsumowanie testów przesyłania danych

.............................................

142

10 Podsumowanie testów

...................................................................................

144

LITERATURA

........................................................................................................

145

Spis tabel.

...........................................................................................................

147

Spis rysunków.

....................................................................................................

150

Spis listingów.

.....................................................................................................

151

Załącznik A. Dokumentacja użytkowa programu testowego

...............................

152

Załącznik B. Zawartość płyty CD dołączonej do pracy.

.......................................

158

5

background image

WYKAZ UŻYWANYCH SKRÓTÓW

IPSec – ang. Internet Protocol Security; protokół który umożliwia bezpieczną komunikację za

pomocą protokołu IP; Bezpieczeństwo oznacza możliwość szyfrowania wiadomości oraz

zapewnienie identyfikacji nadawcy

AH – ang. Authentication Header; składnik protokołu IPSec, zapewnia integralność

przesyłanych danych oraz uwierzytelnienie nadawcy wiadomości

ESP – ang. Encapsulating Security Payload; składnik protokołu IPSec, zapewnia integralność

i poufność przesyłanych danych oraz uwierzytelnienie nadawcy wiadomości

AODV – ang. Ad hoc On-Demand Distance Vector, protokół routingu typu reaktywnego,

stosowany w bezprzewodowych sieciach ad-hoc

CSMA/CD – ang. Carrier Sense Multiple Access with Collision Detection; sposób dostępu do

pasma transmisyjnego, realizowany na zasadzie wielodostępu z badaniem stanu kanału

i wykrywaniem kolizji

TLV – ang. Type-Length-Value; uniwersalny sposób kodowania wiadomości, który składa się

z identyfikator typu wiadomości, długości wiadomości i zawartości wiadomości,

wykorzystywany jest m. in. w protokole IPv6 w nagłówku typu hop-by-hop i ang. destination

options

CDMA – ang. Code Division Multiple Access, sposób dostępu do wspólnego pasma

radiowego nazywany wielodostępem z podziałem kodowym, w którym użytkownicy

korzystają z tego samego pasma częstotliwości, a ich ich transmisje odróżniane są za pomocą

specjalnie przyznawanych kodów, w standardzie wykorzystywane są zawansowane techniki

sterowania mocą, które zmniejszają interferencje między użytkownikami

UMTS – ang. Universal Mobile Telecommunications Systemstandard, standard telefonii

komórkowej trzeciej generacji, od standardu GSM różni się głównie innym sposobem

wielodostępu do kanału radiowego; w UMTS jest wykorzystywany wielodostęp CDMA

6

background image

1. WSTĘP

W ostatnich latach sieć IP stała się coraz bardziej popularna w obszarach, w których nie

występowała powszechnie. Chodzi m. in. o wprowadzone na masową skalę bezprzewodowe

punkty dostępowe, do których łączą się komputery przenośne, a nawet aparaty telefonii

komórkowej i smartfony. Radiowy sposób przesyłania danych jest bardzo wygodny, gdyż nie

trzeba być podłączonym kablem do gniazdka, a także można zmieniać, w obszarze objętym

zasięgiem, swoje położenie. Oprócz klasycznych struktur bezprzewodowej sieci dostępowej,

z centralnie położonym routerem, tworzy się inne modele, które rezygnują z hierarchicznej

budowy. Taką strukturą jest sieć kratowa ang. ad-hoc, w której nie ma wyróżnionego jednego

punktu, zbierającego ruch od pozostałych członków. Pakiety przesyłane są między

sąsiadującymi komputerami, które są w odległości umożliwiającej transmisję pomiędzy nimi.

Przykładowym scenariuszem wykorzystania takiego sposobu funkcjonowania jest grupa

samochodów, stojących w korku, wyposażonych w urządzenia spełniające funkcję komputera

i wymieniających się miedzy sobą danymi. Zagadnieniem, które trzeba rozwiązać w sieciach

typu ang. ad-hoc, jest odpowiednie routowanie pakietów. Poszczególne komputery powinny

wiedzieć o swoim istnieniu i ścieżkach, po których są dla siebie osiągalne. Jeżeli

bezprzewodowa struktura ma połączenie z internetem, wtedy konieczna jest też wiedza,

w których miejscach sieci to połączenie zostało ustanowione. Należy pamiętać, że struktura

może ulec zmianie, spowodowanej wyłączeniem się któregoś komputera lub zerwaniem

połączenia, wynikającym ze zbyt dużej odległości między elementami. Jednym z protokołów

routingu stosowanym w sieciach typu ad-hoc jest ang. AODV. Charaketryzuje się on tym, że

poszukiwanie ścieżki prowadzącej do celu jest wykonywane dopiero w momencie pojawienia

się żądania przez jednen z komputerów. Oznacza to, że jeżeli pakiety nie są przesyłane

między sąsiednimi komputerami, wtedy nie są też wysyłane wiadomości tego protokołu.

Wiadomości routingowe są przesyłane najczęściej w postaci odrębnych pakietów IP.

W protokołach stosowanych w sieci internet, takich jak ang. OSPF, czy ang. RIP, informacje

są przesyłane w stałych odstępach czasu lub na żądanie. Ważne jest aby wiadomości

protokołu nie wykorzystywały zbyt dużo pasma transmisyjnego, chociaż przy obecnych

szybkościach transmisji staje się to coraz mniejszym problemem. Następca obecnie

wykorzystywanego protokołu IP [2], opisany w dokumencie [1] i określany nazwą IPv6,

zawiera ciekawe rozszerzenie, które może być wykorzystane do optymalizacji przesyłania

wiadomości routingowych. Jest to nagłówek rozszerzające (ang. Extension Headers) typu

ang. hop-by-hop, który umożliwia dołączanie do pakietów użytkowych dodatkowej informacji

7

background image

[1, 4.3 Hop-by-Hop Options Header]. Jeżeli będą w nim przesyłane wiadomości protokołu

AODV uzyska się dzięki temu oszczędność radiowego pasma transmisyjnego. Standardowo

wiadomości protokołu są przesyłane na żądanie, czyli w momencie gdy potrzebne jest

znalezienie ścieżki do przesłania danych. Jeżeli wykorzysta się nagłówek hop-by-hop, wtedy

będzie można na bieżąca aktualizować wiedzę o ścieżkach w sieci ad-hoc, co usprawni

transmisję. Komputery będą posiadały wiedzę na temat zmieniającej się struktury sieci, która

ze swojej natury nie jest trwała. Możliwość bardzo częstego przesyłania dodatkowych

wiadomości, razem z ruchem użytkowników, można wykorzystać też do drugiej optymalizacji

działania sieci bezprzewodowej. Chodzi o mechanizm sterowania mocą, który występuje

w telefonii komórkowej, w której występuje dostęp do pasma typu ang. CDMA (Code

Division Multiple Access), np. w sieciach ang. UMTS. W tej technologii precyzyjne

kontrolowanie siłą sygnału jest bardzo ważne, gdyż użytkownicy nadają na tych samych

częstotliwościach, a rozróżnienie ich transmisji odbywa się z użyciem specjalnych kodów.

Jeżeli podobny mechanizm, kontrolowania siłą nadawania, zastosuje się w sieciach ad-hoc,

wtedy zmniejszą się zakłócenia i efektywność wykorzystania pasma transmisyjnego może

wzrosnąć.

8

background image

1.1 CEL I ZAKRES PRACY

Celem pracy jest stworzenie programu testowego, który wykorzystuje nagłówki hop-by-hop

występujące w protokole IPv6, do przesyłania dodatkowych wiadomości, które mogą być

dołączane do każdego pakietu. Stworzona warstwa transportowa ma umożliwiać

przekazywanie wiadomości generowanych przez aplikacje klienckie, które z niej korzystają.

Ten sposób transportu mógłby być wykorzystany do wysyłania wiadomości sterujących,

takich jak pakiety routingowe czy informacje kontrolujące pracę urządzeń radiowych

w sieciach ad-hoc. Badania przeprowadzone na aplikacji testowej, mają na celu sprawdzić

możliwość implementacji takiego rozwiązania oraz zweryfikać, czy przesyłanie wiadomości

w nagłówku hop-by-hop ma zalety w porównaniu z wysyłaniem ich w oddzielnych pakietach.

Przewidywanymi zaletami jest lepsze wykorzystanie łącza transmisyjnego.

Praca składa się z części teoretycznej i praktycznej. W rozdziale 2 przedstawiono podstawowe

wiadomości o protokole IPv6, które są przydatne z punktu widzenia realizacji

bezprzewodowych sieci ad-hoc. Zaprezentowano nie tylko nagłówek hop-by-hop, ale także

mechanizm bezstanowego przydzielania adresu (ang. stateless autoconfiguration) oraz

protokół mobilności. W rozdziale 3 przeprowadzono analizę implementacji protokołu IPv6

w jądrze systemu Linux. Analiza jest wstępem do zaproponowania realizacji programu, który

wykorzystuje nagłówek hop-by-hop jako środek transportowy. W rozdziale 4 zaprezentowano

możliwe typy implementacji, która może być wykonana w przestrzeni jądra, w przestrzeni

użytkownika, oraz z wykorzystaniem różnych bibliotek. W rozdziale 5 przedstawiono kod

źródłowy stworzonego programu, która jest realizacją jednego z możliwych sposobów

przedstawionych w rozdziale 4. Rozdziały 6, 7, 8 i 9 zawierają testy funkcjonalności aplikacji.

Ich celem jest stwierdzenie, czy wykorzystanie nagłówków hop-by-hop ma zalety

w porównaniu z wysyłaniem odzielnych pakietów, w kontekście wykorzystania

w bezprzewodowych sieciach ad-hoc.

9

background image

2. Protokół IPv6

W rozdziale tym opisano podstawowe różnice pomiędzy protokołem IPv6 i obecnie

wykorzystywanym protokołem IP, który jest też nazywany jako wersja 4 (IPv4). Należą do

nich budowa podstawowego nagłówka pakietu i format adresacji. Po wprowadzeniu opisano

kolejne cechy protokołu w wersji 6, które mogą być wartościowe w wykorzystaniu

w bezprzewodowych sieciach ang. ad-hoc. Zostało omówione, z jakich powodów dane cechy

mogą być korzystne. Opisano proces bezstanowej konfiguracji adresu IP, rozbudowany

mechanizm mobilności, nagłówek hop-by-hop. Opisowi nagłówka hop-by-hop towarzyszy

opis wszystkich nagłówków rozszerzających, gdyż przedstawienie ich pozwoli lepiej

zrozumieć możliwości tych rozszerzeń.

10

background image

2.1 Adresacja IPv6

Protokół IPv6 jest następcą protkołu IP, w obecnej wersji 4. Głównym powodem stworzenia

nowej wersji protokołu IP jest wyczerpywanie się wolnych pul adresów publicznych. Jeżeli

dostępne do przydzielenia adresy się skończą, to rozwój Internetu będzie bardzo ograniczony.

Adres w nowej wersji protkołu ma 128 bitów, a w wersji 4 są to 32 bity. Adres zapisany na

128 bitach daje 3,4 x 10

38

adresów, co jest ogromną liczbą. 32 bity umożliwiają stworzenie

4,3 x 10

9

unikalnych identyfikatorów. Wyjaśnienia wymaga, dlaczego kończy się pula

adresów, mimo że teoretycznie można utworzyć ponad 4 miliardy adresów. Wynikło to

z faktu, że na samym początku rozwoju Internetu nie przewidziano jak bardzo rozwinie się

sieć i podjęto błędne decyzje w alokacji ogromnych pul adresów do małych organizacji, oraz

standard nie przewidywał wykorzystania części z dostępnych adresów, jako możliwych do

routowania.

W protokole IPv6 odpowiednikiem adresu publicznego jest adres Global Unicast.

Odpowiednikiem adresu prywatnego jest adres Link Local. Był zdefiniowany także trzeci typ

adresu Site-Local, który miał być adresem do stosowania wewnątrz pojedynczej organizacji.

Jednak z powodu wielu kontrowersji został on uznany jako nieaktualny, w dokumencie RFC

3879 [18].

Jednym z problemów, który występuje w obecnej sieci Internet są duże tablice routingowe.

W standardzie IPv6 postanowiono rozwiązać ten problem definiując strukturę adresów

publicznych, składającą się z prefiksu i adresu interfejsu. Prefiks jest zależny od

geograficznego położenia węzła i dzięki temu adresy o podobnym prefiksie znajdują się

w tym samym obszarze sieci. Routery mogą rozpoznać po nim, w którą część Internetu

powinny przekazać pakiet.

Struktura adresu typu Link Local przedstawiona jest na Rys. 1. Początek adresu to prefiks

FE80 w zapisie heksadecymalnym. Kolejne 48 bitów mają wartość 0. Ostatnie 64 bity są

adresem interfejsu.

16 bits

48 bits

64 bits

FE80

0

Interface ID

Rys. 1: Adres IPv6 Link-local

64 bitowy identyfikator interfejsu Interface ID jest zmodyfikowaną wersją adresu EUI-64

i tworzony jest z 48 bitowego adresu MAC. Pierwsze 24 bity IF-ID są pierwszymi 24 bitami

11

background image

adresu MAC. Dodatkowo 7 bit jest zamieniany na wartość 1, która oznacza, że adres jest

unikalny globalnie. Kolejne 16 bitów jest stałe i w zapisie szesnastkowym jest to ciąg znaków

FFFE. Ostatnie 24 bity są ostatnimi 24 bitami adresu MAC. Budowa identyfikatora interfejsu

jest przedstawiona na Rys. 2.

Rys. 2: Adres interfejsu IF-ID

Z adresu MAC 00:16:D4:CC:65:90 powstanie IF-ID 02:16:D4:FF:FE:CC:65:90. Cały adres

Link-local będzie miał postać fe80::216:d4ff:fecc:6590.

Adres typu Global Unicast jest odpowiednikiem adresu publicznego w IPv4. Budowę adresu

przedstawiono na Rys. 3. Składa się on z następujących części:

48 bitów które wynikają z położenia geograficznego podsieci; jedną z części 48

bitowego adresu jest między innymi kod kraju,

16 bitów identyfikujących podsieć, której adres jest określany przez dostawcę

dostępu do Internetu,

ostatnie 64 bity są identyfikatorem interfejsu; adres Global Unicast jest publicznym

adresem umożliwiający komunikację węzłów znajdujących się w Internecie

w różnych podsieciach.

48 bits

16 bits

64 bits

Public Net-id

Subnet ID

Interface ID

Rys. 3: Adres IPv6 Global Unicast

W protokole IPv6 interfejs może mieć równocześnie adres Link Local i Global Unicast.

W protokole IPv4 urządzenie sieciowe może mieć albo adres prywatny, albo adres publiczny.

12

24 bits

24 bits

24 bits

24 bits (7 – inv)

FFFE

MAC

IF-ID

background image

2.2 Struktura nagłówka IPv6

Podstawowy nagłówek IPv6 składa się z 40 bajtów i przedstawiony jest na Rys. 5. Nagłówek

składa się z następujących pól (nazwy angielskie) [1]:

Version – 4 bitowy numer wersji protokołu IP, w wersji IPv6 przyjmuje wartość 6.

Class – 8 bitowy identyfikator klasy ruchu, umożliwiający rozróżnienie różnych

priorytetów i wprowadzenie różnych typów jakości przesyłania danych QoS.

Flow Label – 20 bitowa etykieta przepływu, używana do zapewnienia QoS dla

strumienia powiązanych ze sobą pakietów

Payload Length – 16 bitowa liczba oznaczająca długość pakietu bez podstawowego

nagłówka o długości 40 bajtów, ale wliczając nagłówki rozszerzające

Next Header – pole identyfikuje typ kolejnego nagłówka; może to być nagłówek

rozszerzający lub nagłówek wyższej warstwy, np. TCP lub UDP

Hop Limit – liczba przeskoków pakietu między węzłami, po której pakiet zostanie

skasowany

Source Address – 128 bitowy adres źródłowy pakietu

Destination Address – 128 bitowy adres docelowy pakietu

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Rys. 4: Nagłówek IPv4

13

background image

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Traffic Class | Flow Label |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Length | Next Header | Hop Limit |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Source Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Rys. 5: Nagłówek IPv6

Porównując nagłówek IPv4, przedstawiony na Rys. 4 z nagłówkiem IPv6 można stwierdzić,

że budowa obu jest bardzo podobna. Nagłówek w wersji 6 ma trochę prostszą budowę. Nie

występuje w nim odpowiednik pól obecnych w nagłówku w wersji 4 o nazwach angielskich:

IHL, Identification, Flags, Header Checksum, Options. Pozostałe pola występujące w wersji 4

mają swoje odpowiedniki. W Tab. 1 zestawiono nazwy odpowiadających sobie pól, pod

względem ich znaczenia w nagłówku IPv4 i IPv6. Nowym polem w nagłówku IPv6 jest pole

Flow Label.

Tab. 1: Odpowiadające sobie pole w nagłówkach IPv4 i IPv6

Pole nagłówka w IPv4

Odpowiadające pole w IPv6

Version

Version

Type of Service

Traffic Class

Total Length

Payload Length

Time To Live

Hop Limit

Protocol

Next Header

Source Address

Source Address

Destination Address

Destination Address

14

background image

Z punktu widzenia pracy ważny jest fakt, że pole Options, które zostało zarezerwowane

w nagłówku IPv4 do tworzenia rozszerzeń, nie występuje w podstawowym nagłówku IPv6.

W wersji 6 możliwość dodawania nowej zawartości nagłówka IP wyniesiono z podstawowego

nagłówka do nagłówków rozszerzających. Ma to dwojakie zalety. Po pierwsze nagłówek

podstawowy ma stałą długość, co umożliwia wprowadzenie optymalizacji w sprzętowym

przetwarzaniu pakietów. Po drugie takie rozwiązanie jest bardziej elastyczne. Jeżeli

dodatkowa informacja nie jest potrzebna, wtedy nagłówek rozszerzający nie występuje

w ogóle. Możliwe jest przesyłanie kilku nagłówków rozszerzających w jednym pakiecie.

2.3 Bezstanowa konfiguracja adresu IPv6

Bezstanowa (ang. stateless) konfiguracja adresu IP urządzenia włączającego się do sieci może

być szczególnie przydatna w sieciach typu ad-hoc. Ten typ przydzielenia adresu jest

domyślnym trybem w protokole IP w wersji 6 i nie występuje w ogóle w IP w wersji 4

Urządzenie włączające się do sieci generuje własny adres typu Link Local i wysyła zapytanie,

czy w sieci istnieje jakiś router. Jeżeli tak, to prosi go o przydzielenie adresu typu Global

Unicast. Autokonfiguracja bezstanowa wymaga minimalnej konfiguracji routera oraz nie

wymaga konfiguracji maszyny podłączającej się do sieci. Router przechowuje globalny

prefiks sieci, który odsyła maszynie proszącej o przydzielenie go. Ewentualna możliwość

wystąpienia duplikatu adresu w sieci lokalnej jest rozwiązywana przez mechanizm

zdefiniowany w protokole ICMPv6 i nie wymaga zaangażowania routera. W przypadku, gdy

w sieci lokalnej nie ma routera, wtedy adres Link Local jest wystarczający do komunikacji

między komputerami. Mechanizm stanowej konfiguracji adresu IP (ang. stateful), wymaga,

aby w sieci był zainstalowany sewer DHCP. Serwer ten przechowuje informacje na temat

przydzielonych adresów IP i zarządza nimi. Protokół DHCP występuje zarówno w protokole

IP w wersji 4 jak i 6. Zaletą konfiguracji stanowej jest to, że serwer DHCP dystrybuuje adresy

DNS, co nie jest robione przy konfiguracji bezstanowej. Między innymi dlatego oba typy

konfiguracji uzupełniają się i mogą być stosowane równocześnie.

15

background image

Rys. 6: Bezstanowa konfiguracja adresu IPv6

Proces autokonfiguracji bezstanowej wykorzystuje komunikaty protokołu ICMPv6.

Przedstawiony jest na Rys. 6 i składa się z następujących kroków:

1. Komputer generuje adres IPv6 Link Local. Adres ten składa się z prefiksu FE80 i 64-

bitowego adresu interfejsu wygenerowanego z adresu MAC karty sieciowej.

Komputer wysyła do wszystkich sąsiadów wygenerowany adres w wiadomości

Neighbour Solicitation w celu sprawdzenia jego unikalności. Jeżeli adres jest

unikalny, to komputer nie otrzymuje żadnej wiadomości zwrotnej typu Neighbour

Advertisement.

2. Komputer wysyła prośbę o przydzielenie prefiksu adresu i innych parametrów

podłączenia do sieci, za pomocą wiadomości Router Solicitation .

3. Jeżeli w sieci, w której znajduje się komputer istnieje router , to odsyła mu odpowiedź

z prefiksem sieci, w wiadomości Router Advertisement. Komputer tworzy globalny

adres IPv6 łącząc prefiks sieci i wygenerowany z adresu MAC adres interfejsu.

W Tab. 2 przedstawiono jaki adres Global Unicast uzyska komputera o podanym adresie

MAC i prefiksie sieci, w której się łączy.

Tab. 2: Bezstanowa konfiguracja adresu IPv6. Przykład.

MAC

Link Local

Router prefix Global Unicast

00:16:D4:CC:65:90

fe80::216:d4ff:fecc:6590 fec0::0

fec0::216:d4ff:fecc:6590

16

Neighbor solicitation

Router solicitation

Router advertisement

Komputer

Router

background image

2.4 Nagłówek hop-by-hop i inne nagłówki rozszerzające

Nagłówki rozszerzające (ang. Extension Headers) są nowym rozwiązaniem, które

wprowadzono w protokole IPv6. Funkcjonalności, które są zrealizowane za pomocą

nagłówków rozszerzających, mogą mieć zastosowanie w bezprzewodowych sieciach ad-hoc.

Są to: mobilność, bezpieczne przesyłanie danych, czy mechanizm sterowania routowaniem

pakietów, czyli tzw. source routing. Wykorzystanie jednego z nagłówków rozszerzających,

nagłówka hop-by-hop, jest celem pracy. W podrozdziale zostały opisane krótko wszystkie

nagłówki rozszerzające oraz sposób ich dołączania do pakietu.

W Tab. 3 przedstawiono listę nagłówków rozszerzających protokołu IPv6 z informacją, które

węzły analizują ich zawartość. W jednym pakiecie może występować wiele nagłówków

rozszerzających. Ich obecność jest wskazywana przez pole Next Header występujące

w podstawowym nagłówku IPv6 i w każdym nagłówku rozszerzającym. Wskazuje ono typ

następnego nagłówka lub protokół wyższej warstwy, jeżeli jest to ostatni nagłówek

rozszerzający w pakiecie. Protokołem wyższej warstwy może być np. protokół TCP lub UDP.

Każdy typ nagłówka może występować w pakiecie tylko raz. Wyjątkiem jest typ Destination

Options który może występować dwa razy. Nagłówki rozszerzające muszą być odczytywane

przez węzeł w kolejności, w której występują. Na Rys. 7 przedstawiono strukturę pakietu

zawierającego maksymalną sekwencję nagłówków rozszerzających.

Tab. 3: Nagłówki rozszerzające IPv6.

Numer typu

Nazwa (angielska)

Procesowanie

0

Hop-by-Hop Options

każdy węzeł

60

Destination Options header
for routers

routery i węzeł docelowy

43

Routing header

routery

44

Fragmentation header

węzeł docelowy

50

Authentication header

węzeł docelowy

51

Encapsulation

security

payload header

węzeł docelowy

135

Mobility header

węzeł docelowy

17

background image

IPv6 header
Next header: 0

Header type: Hop-by-Hop Options (0)
Next header: 60

Header type: Destination Options (60)
Next header: 43

Header type: Routing header (43)
Next header: 44

Header type: Fragmentation header (44)
Next header: 50

Header type: Authentication header (50)
Next header: 51

Header type: Encapsulation security payload
header (51)
Next header: 60

Header type: Destination Options (60)
Next header: 6

TCP

Rys. 7: Sekwencja nagłówków rozszerzających

Nagłówek typu Routing Header (o numerze 43) służy do wskazania węzłów pośredniczących,

przez które powinien być przesyłany pakiet. Jest to mechanizm zwany source routing. Pakiet

zawiera listę routerów pośredniczących. Każdy kolejny router zmienia w nagłówku Routing

Header listę węzłów, które muszą być jeszcze odwiedzone oraz zamienia zawartość pola

Destination Address w nagłówku podstawowym IPv6.

Nagłówek typu Fragment Header (o numerze 44) służy do przesłania wiadomości większej

niż minimalna wartość MTU na trasie od nadawcy do odbiorcy. W protokole IPv6 podział

pakietu na części może wykonywać tylko węzeł źródłowy. Węzły pośredniczące nie mogą

dokonać podziału pakietu. W przypadku gdy węzeł pośredniczący nie może przesłać dalej

pakietu, bo pakiet jest większy niż MTU kolejnego odcinka na trasie, wtedy do węzła

źródłowego przesyłana jest wiadomość o błędzie, w pakiecie ICMPv6 Packet too big o

numerze 2. Brak możliwości podziału pakietu na części jest ważną różnicą w stosunku do

protokołu IPv4, w którym możliwy był podział pakietu przez routery przekazujące pakiety

(tzw. fragmentacja).

Nagłówek typu Destination Options Header (o numerze 60) może wystąpić dwa razy.

Pierwszy raz przed nagłówkiem typu Routing Header, który jest odczytywany przez routery

pośredniczące w przesyłaniu pakietu. Drugi raz nagłówek występuje przed wyższą warstwą

18

background image

sieciową i jest przeznaczony dla komputera docelowego. Zawartość może spowodować, że

pakiet będzie specjalnie potraktowany.

Nagłówek typu Mobility Header (o numerze 135) jest wykorzystywany do zestawiania,

utrzymywania i kończenia połączenia z węzłem mobilnym. Protokół IPv6 zapewnia obsługę

mobilności [12]. W protokole IPv4 była ona wspierana częściowo. Mobilność ma zapewnić

poruszającemu się węzłowi bezproblemowy i najlepiej ciągły dostęp do sieci, także bez

zerwania nawiązanych sesji. Taka funkcjonalność będzie miała coraz szersze zastosowania,

gdyż nowe urządzenia przenośne, np. telefony, są przystosowana do podłączania się do sieci

Internet.

Implementacja mobilności w protokole IPv6 jest związana z budową adresu IP. Adres składa

się z prefiksu sieci, w której znajduje się węzeł i identyfikatora interfejsu. Taka budowa

adresu powoduje, że rzeczywisty adres komputera nie może być zachowany w przypadku

przemieszczenia się do podsieci o innym prefiksie. Z drugiej strony dla aplikacji

komunikujących się z mobilnym węzłem (ang. Mobile) nie powinna być widoczna zmiana

rzeczywistego adresu IP. Problem ze zmianą adresu IP poruszającego się węzła rozwiązany

jest poprzez wykorzystanie pośrednika (ang. Home Agent), który zna pierwotny adres IP

węzła i przekierowuje ruch na nowy adres IP.

Rys. 8: Bezpośrednia komunikacja z węzłem mobilnym

Rys. 9: Komunikacja z węzłem mobilnym; Wykorzystanie pośrednika

19

Mobile (Home Link)

Home addre ss

Corre sponde nt

Correspondent

Home Agent (Home Link)

Mobile (Foreign Link)

Home addre ss

Corre sponde nt

Care -of addre ss

Home Age nt

Correspondent

background image

Na Rys. 8 i 9 przedstawiono schemat komunikacji ]węzła, który ma skonfigurowaną obsługę

mobilności (ang. Mobile) z węzłem, znajdującym w się w odległym miejscu sieci (ang.

Correspondent). Jeżeli węzeł mobilny znajduje się w swojej sieci domowej (ang. Home Link),

wtedy komunikuje się z innym węzłem z sieci Internet przy wykorzystaniu swojego

rzeczywistego adresu, przydzielonego mu w sieci domowej (ang. Home Address) (Rys. 8). Po

przemieszczeniu się węzła mobilnego do obcej sieci (ang. Foreign Link) zostaje mu

przydzielony nowy adres globalny (ang. Care-of Address) (Rys. 8). Węzeł mobilny informuje

pośrednika, znajdującego się w sieci domowej, o jego nowym adresie. Komputery z sieci

Internet, z którymi się komunikował przed przemieszczeniem, nie wiedzą, że zmienił się jego

adres i wysyłają pakiety na adres z sieci domowej. Pośrednik przekierowuje te pakiety do

węzła mobilnego, na jego nowy adres w obcej sieci. Węzeł mobilny odsyła pakiety również

przez pośrednika. Taki sposób routowania pakietów występuje w momencie, gdy węzeł

komunikujący się z węzłem, który zmienił położenie nie wspiera optymalizacji

przekazywania pakietów. Jeżeli węzeł umie wprowadzić optymalizację, wtedy komunikacja

będzie odbywała się bezpośrednio pomiędzy węzłami bez przesyłania pakietów przez

pośrednika.

Nagłówki Authentication Header (AH) i Encapsulation Security Payload Header (ESP) służą

do zabezpieczania transmisji. Nagłówek Authentication Header umożliwia uwierzytelnienie

nadawcy, integralność danych oraz uodpornienie się na atak polegający na przejęciu pakietu

przez atakującego i podszyciu pod nadającego pakiet w późniejszym momencie. Nagłówek

ESP zapewnia szyfrowanie przesyłanych danych i opcjonalnie funkcjonalność oferowaną

przez nagłówek AH, czyli uwierzytelnienie nadawcy, integralność i obronę przed atakiem

polegającym na ponownym użyciu przejętego pakietu.

Nagłówek hop-by-hop różni się od pozostałych nagłówków rozszerzających z dwóch

powodów. Po pierwsze musi być przetwarzany przez każdy komputer, który przetwarza

pakiet. Po drugie jego zawartość nie jest sztywno określona w standardzie. Jednym

z opisanych zastosowań jest przesyłanie pakietów, których długość, nie wliczając

podstawowego 40 bajtowego nagłówka, jest większa niż 65 535 bajtów. Tak zwane

jumbograms są możliwe do przesłania przy wykorzystaniu nagłówka hop-by-hop [15].

Nagłówek hop-by-hop zawiera pola:

Next Header – identyfikator kolejnego nagłówka

20

background image

Hdr Ext Len – długość nagłówka hop-by-hop, liczona jako wielokrotność 8 oktetów,

bez pierwszych 8 oktetów. Na przykład jeżeli w polu jest wartość 0 oznacza to, że

długość całego nagłówka hop-by-hop wynosi 8 oktetów, jeżeli w polu jest wartość 1 to

długość całego nagłówka wynosi 16 oktetów

Options – jest to zawartość nagłówka hop-by-hop, zawiera opcje - dane zakodowane

w formacie indetyfikator, długość, zawartość (ang. TLV, Type-Length-Value); Pole

Options jest wypełniane tak, że cały nagłówek hop-by-hop jest wielokrotnością

8 oktetów

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
. .
. Options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Rys. 10: Nagłówek hop-by-hop

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
| Option Type | Opt Data Len | Option Data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -

Rys. 11: Struktura opcji nagłówka hop-by-hop

Sposób kodowania opcji jest przedstawiony na Rys. 11. Poszczególne pola oznaczają:

Option Type – identyfikator, typ

Opt Data Len – długość pola Option Data

Option Data – pole będące zawartością opcji

Option Type - identyfikator opcji; dwa najstarsze bity to informacja o zachowaniu

komputera nie rozpoznającego identyfikatora:

00 – opcja będzie zignorowana

01 – pakiet będzie skasowany

10 – pakiet będzie skasowany, do nadawcy będzie odesłana wiadomość ICMPv6

ze wskaźnikiem na nierozpoznaną opcję

11 - pakiet będzie skasowany, do nadawcy będzie odesłana wiadomość ICMPv6

ze wskaźnikiem na nierozpoznaną opcję, jeżeli adresat nie był typu multicast

Dzięki takiemu oznaczeniu, wybrane komputery w sieci mogą zdefiniować swoje własne

wiadomości przesyłane w nagłówku hop-by-hop, rozpoznawane tylko przez niektóre węzły.

Mimo to, węzły nie rozpoznające numerów opcji, w nagłówku hop-by-hop, nie porzucą

21

background image

pakietu, ale prześlą go dalej. Jedynym warunkiem koniecznym jest, aby dwa najstarsze bity

numeru opcji miały wartość 00. Taka możliwość oferuje elastyczność w projektowaniu

rozszerzeń do protokołu IPv6.

W nagłówku hop-by-hop zdefiniowano także specjalny format wypełnień, które mogą być

użyte jako przerwa między opcjami lub do dopełnienia zawartości nagłówka, tak żeby jego

długość była wielokrotnością 8 oktetów. Zdefiniowano dwa typy opcji wypełniających.

Pierwszy typ, przedstawiony na Rys. 12, jest pojedynczym bajtem o wartości 0. Drugi typ

(Rys. 13) jest zakodowany w formacie TLV. Numer opcji ma wartość 1. W polu Opt Data Len

jest długość pola Option Data. Bajty Option Data powinny mieć wartość zero. Minimalna

długość wypełnienia drugiego typu wynosi 2. Wtedy drugie pole Opt Data Len ma wartość 0

a pole Option Data nie występuje.

+-+-+-+-+-+-+-+-+
| 0 |
+-+-+-+-+-+-+-+-+

Rys. 12: Padding 0

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
| 1 | Opt Data Len | Option Data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -

Rys. 13: Padding n bajtów

22

background image

3. Implementacja protokołu IPv6 w systemie Linux

W tym rozdziale przedstawiono analizę wybranych fragmentów implementacji protokołu

IPv6 w jądrze systemu Linux [14], w wersji numer 2.6.37 bez rozszerzeń. Kod źródłowy jądra

dołaczony jest do pracy i występuje w Załączniku B. Analiza ma pomóc w zrozumieniu, w

jaki sposób pakiety są przetwarzane. Uwaga skupiona jest na strukturach danych i funkcjach

dotyczących przetwarzania nagłówka IPv6 i nagłówków rozszerzających, w tym nagłówka

hop-by-hop. Dzięki analizie będzie można lepiej zrozumieć sposób implementacji warstwy

sieciowej w systemie Linux. Analiza będzie też punktem wyjścia do opisu, w jaki sposób

zaimplementować przesyłanie wiadmości w nagłówkach hop-by-hop w przestrzeni jądra.

23

background image

3.1 Obsługa pakietów przychodzących i wychodzących.

Obsługa pakietów przychodzących pokazana jest na Rys. 14. Odebrany pakiet, w warstwie

łącza danych, jest rozpoznawany jako pakiet IPv6 i przekazywany do funkcji odbierającej

ipv6_rcv,

zadeklarowanej w pliku

net/ipv6/ip6_input.c

. Dalej funkcja

ip6_input

przejmuje wskaźnik do fragmentu pamięci, w którym znajduje się pakiet i są przeprowadzane

testy zgodności sumy kontrolnej i inne testy poprawności pakietu. Potem pakiet trafia do

funkcji

ip6_input_finish

, w której parsowane są nagłówki rozszerzające. Następnie

funkcja ta przekazuje pakiet do odpowiedniego protokołu wyższej warstwy, np. protokołu

TCP.

Rys. 14: Obsługa pakietów przychodzących

Pakiety wychodzące z wyższej warstwy przekazywane są do

funkcji ip6_xmit w pliku

net/ipv6/ip6_output.c

, która dodaje nagłówek IPv6. Jeżeli pakiet należy wysłać do

innego komputera trafia on ostatecznie do funkcji

ip6_output_finish2

, która przekazuje go

do sterownika urządzenia sieciowego. Schemat obsługi pokazany jest na Rys. 15.

24

ipv6_rcv

ip6_input

ip6_input_finish

Urządzenie sieciowe

Wyższa warstwa sieciowa,

np. TCP lub UDP

background image

Rys. 15: Obsługa pakietów wychodzących

3.2 Bufor na pakiet – skb_buff

Bufory na pakiety są to struktury używane w jądrze do przechowywania zawartości pakietów

wraz z wszystkimi nagłówkami. Kolejne pakiety są połączone wskaźnikami, tworząc listę

dwukierunkową. Struktury te umożliwiają dostęp do zawartości poszczególnym protokołom

i uzpełnienie, bądź odczytanie wybranych fragmentów pakietu. Struktura

sk_buff

(ang.

socket buffer) jest używana jako nośnik danych pomiędzy warstwą protokołów i warstwą

urządzeń sieciowych. W implementacji struktura bufora ma nazwę

sk_buff

, często

oznaczana jest też symbolem

skb

. Na Listingu 1 przedstawiony jest fragment deklaracji

struktury

sk_buff

. Struktura jest zaimplementowana jako lista dwukierunkowa.

Listing 1: Struktura bufora sk_buff (include/linux/sk_buff.h)

struct sk_buff {

/* These two members must be first. */

struct sk_buff *next;

25

ip6_xmit

ip6_dev_loopback_xmit

ip6_finish_output

Wyższa warstwa sieciowa,

np. TCP lub UDP

Urządzenie sieciowe

ip6_finish_output2

ip6_output

Pętla zwrotna

Pakiety do wysłania

background image

struct sk_buff *prev;

struct sk_buff_head *list;

struct sock *sk;

struct timeval stamp;

struct net_device *dev;

Protokoły TCP, UDP, nagłówki rozszerzające IPv6, ICMP korzystają z wskaźników do

miejsc, w których zaczynają się interesujące dla nich fragmenty pakietu. Wskaźniki do tych

miejsc są również przechowywane w strukturze

sk_buff

. Wskaźnik

h

pokazuje na nagłówek

transportowy TCP, UDP, ICMP lub IP. Wskaźnik

nh

wskazuje na początek nagłówka

sieciowego, czyli w przypadku IPv6 jest to nagłówek IP.

Listing 2: Struktura wskaźników do nagłówków (include/linux/sk_buff.h)

union {

struct tcphdr *th;

struct udphdr *uh;

struct icmphdr *icmph;

struct igmphdr *igmph;

struct iphdr *ipiph;

unsigned char *raw;

} h;

union {

struct iphdr *iph;

struct ipv6hdr *ipv6h;

struct arphdr *arph;

unsigned char *raw;

} nh;

union {

struct ethhdr *ethernet;

unsigned char *raw;

} mac;

Struktura

sk_buff

zawiera bufor

cb

,wykorzystywany przez protokoły do przechowywania

danych przydatnych przy przetwarzaniu. Protokół IPv6 przechowuje tam przesunięcie

nagłówka rozszerzającego liczone od początku nagłówka. W zmiennych

pkt_type

26

background image

i

protocol

przechowywana jest informacja, który protokół będzie operował na buforze.

Deklaracja wybranych składowych struktury

sk_buff

przedstawiona jest na Listingu 3.

Listing 3: Dane tymczasowe protokołów obsługujących include/linux/sk_buff.h

char cb[48];

...

unsigned int len,

data_len,

...

unsigned char pkt_type,

...

unsigned short protocol,

...

unsigned char *head,

*data,

*tail,

*end;

3.3 Pakiety – obsługa w warstwie łącza danych

Pakiet odebrany w warstwie łącza danych jest przekazywany warstwie wyższej. Decyzja

o tym, któremu protokołowi warstwy wyższej będzie przekazany pakiet, jest podejmowana na

podstawie zawartości struktury

packet_type

, przedstawionej na Listingu 4. Pakiety

protokołu IPv6 w nagłówku MAC są identyfikowane za pomocą kodu 0x86DD. Ten typ

pakietu ma swoją strukturę, dla której definicja jest przedstawiona na Listingu 5.

Najważniejsza jest zmienna wskazująca funkcję, której będzie przekazany pakiet.

W przypadku IPv6 jest to funkcja

ipv6_rcv

znajdująca się w pliku

net/ipv6/ip6_input.c

Listing 4: Struktura packet_type (include/linux/netdevice.h)

struct packet_type

{

unsigned short type; /* This is really htons(ether_type) */

struct net_device *dev; /* Device on which packet can be recieved

NULL is a wildcard here */

int (*func) (struct sk_buff *, struct net_device *,

27

background image

struct packet_type *);

/* Packet Type Handler. */

void *data;

/* Private to the packet type */

struct packet_type *next;

};

Listing 5: Struktura ipv6_packet_type (net/ipv6/ipv6_sockglue.c)

static struct packet_type ipv6_packet_type =

{

.type = __constant_htons(ETH_P_IPV6),

.dev = NULL, /* All devices */

.func = ipv6_rcv,

.data = (void*)1,

};

3.4 Rodzina protokołów INET6

W systemie Linux grupa protokołów wykorzystująca protokół IPv6, a także niektóre jego

rozszerzenia tworzą rodzinę protokołów INET6 [17]. Grupa ta obejmuje m. in. protokoły:

IPv6, ICMPv6, TCPv6, UDPv6. Nagłówki rozszerzające są również zarejestrowane jako

oddzielne protokoły. Rodzina protokołów INET6 została stworzona jako odpowiednik

rodziny protokołów INET dla IPv4. Funkcjonalności protokołów IPv4 i IPv6 pogrupowane

w rodziny oferują podobny interfejs do wykorzystania. Tab. 4 pokazuje protokoły INET6

wraz z plikami, w których są one zaimplementowane.

Tab. 4: Protokoły Inet6

Inet6_protocol

file

destopt_protocol

net/ipv6/exthdrs.c

rthdr_protocol

net/ipv6/exthdrs.c

icmpv6

net/ipv6/icmp.c

frag

net/ipv6/reassembly.c

tcpv6

net/ipv6/tcp_ipv6.c

esp6

net/ipv6/esp6.c

udpv6

net/ipv6/udp.c

ah6

net/ipv6/ah6.c

28

background image

Każdy protokół musi mieć zdefiniowaną strukturę pokazaną na Listingu 6. Struktura

inet6_protocol

musi być zarejestrowana za pomocą funkcji

INET6_REGISTER_PROTOSW

.

Najważniejszym składnikiem struktury jest funkcja

handler

, której przekazywana jest

obsługa pakietu.

Listing 6: Struktura Inet6_protocol (include/net/protocol.h)

struct inet6_protocol

{

int (*handler)(struct sk_buff **skb, unsigned int *nhoffp);

void (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt,

int type, int code, int offset, __u32 info);

unsigned int flags; /* INET6_PROTO_xxx */

};

3.5 Gniazdka sieciowe w IPv6

Do przesyłania wiadomości za pomocą protokołu IP wykorzystywane są, w systemie Linux,

gniazdka sieciowe (ang. sockets). Gniazdka sieciowe oferują prosty interfejs, który posiada

m. in. funkcje, które umożliwiają wysłanie i odebranie bufora bajtów. Dla IPv6, podobnie jak

IPv4, występują 3 typy gniazdek sieciowych. Gniazdko strumieniowe (ang. stream) jest

wykorzystuje protokół TCPv6 do transportu wiadomości pomiędzy komputerami. Gniazdko

pakietowe (ang. datagram) wykorzystuje protokół UDPv6 do przesyłania wiadomosci.

Trzecim typem gniazdka jest gniazdko RAW. Jest to gniazdko czyste, które umozliwia

projektowanie własnych protokołów transportowych. Gniazdka sieciowe, podobnie jak

protokoły, są zarejestrowane w rodzine protokołów INET6. Gniazdko musi mieć

zdefiniowaną strukturę

proto_ops

, zawierającą referencje do funkcji, które muszą być

zdefiniowane. Fragment definicji struktury

proto_ops

pokazany jest na Listingu 7. Dla

gniazd strumieniowych zdefiniowana jest struktura pokazana na Listingu 8. Dla gniazd

pakietowych zdefiniowana jest struktura pokazana na Listingu 9.

Listing 7: Struktura proto_ops (include/linux/net.h)

struct proto_ops {

int family;

...

29

background image

int (*sendmsg) (struct kiocb *iocb, struct socket *sock,

struct msghdr *m, int total_len);

int (*recvmsg) (struct kiocb *iocb, struct socket *sock,

...

};

Listing 8: Struktura Inet6_stream_ops (net/ipv6/af_inet6.c)

struct proto_ops inet6_stream_ops = {

.family = PF_INET6,

.release = inet6_release,

.bind = inet6_bind,

.connect = inet_stream_connect, /* ok */

.socketpair = sock_no_socketpair, /* a do nothing */

.accept = inet_accept, /* ok */

.getname = inet6_getname,

.poll = tcp_poll, /* ok */

.ioctl = inet6_ioctl, /* must change */

.listen = inet_listen, /* ok */

.shutdown = inet_shutdown, /* ok */

.setsockopt = inet_setsockopt, /* ok */

.getsockopt = inet_getsockopt, /* ok */

.sendmsg = inet_sendmsg, /* ok */

.recvmsg = inet_recvmsg, /* ok */

.mmap = sock_no_mmap,

.sendpage = tcp_sendpage

};

Listing 9: Struktura Inet6_dgram_ops (net/ipv6/af_inet6.c)

Struct proto_ops inet6_dgram_ops = {

.family = PF_INET6,

.release = inet6_release,

.bind = inet6_bind,

.connect = inet_dgram_connect, /* ok */

.socketpair = sock_no_socketpair, /* a do nothing */

.accept = sock_no_accept, /* a do nothing */

.getname = inet6_getname,

30

background image

.poll = datagram_poll, /* ok */

.ioctl = inet6_ioctl, /* must change */

.listen = sock_no_listen, /* ok */

.shutdown = inet_shutdown, /* ok */

.setsockopt = inet_setsockopt, /* ok */

.getsockopt = inet_getsockopt, /* ok */

.sendmsg = inet_sendmsg, /* ok */

.recvmsg = inet_recvmsg, /* ok */

.mmap = sock_no_mmap,

.sendpage = sock_no_sendpage,

};

31

background image

4. Przegląd możliwych implementacji programu.

Rozdział ten prezentuje cztery zaproponowane sposoby napisania programu, który wysyła

i odbiera wiadomości za pomocą nagłówków hop-by-hop protokołu IPv6. Przedstawione

sposoby były albo przetestowane w ramach pracy albo, jak zaczepy najprawdopodobniej

użyte w projekcie EFIPSANS[19, rozdział 4 WARF], co wynika z analizy fragmentu wstępnej

wersji kodu źródłowego programu, dołączonej do Załącznika B. Przedstawiono dwa sposoby

implementacji w jądrze systemu Linux oraz dwa sposoby implementacji w przestrzeni

użytkownika. W podsumowaniu przedstawiono porównanie przedstawionych możliwości

wskazując ich wady i zalety. Pierwszy z przedstawionych typów implementacji (rozdział 4.1)

zrealizowano w jądrze systemu Linux o numerze 2.6.X. Realizacja opisana w rozdziałach 4.3

i 4.4 została wykonana dla systemu pracującego z jądrem o numerze 2.6.37. Kod

wykorzystujący zaczepy, przedstawiony w rodziale 4.2, nie był wykonany samodzielnie, ale

przeznaczony był także dla jąder z rodziny 2.6.

32

background image

4.1 Implementacja w jądrze

Jedną z możliwych implementacji warstwy transportowej wykorzystującej nagłówki hop-by-

hop protkołu IPv6 jest umieszczenie jej w jądrze. Taki typ implementacji został wykonany

w ramach studium wykonalności aplikacji. Zrealizowana implementacja zostanie omówiona.

Zmiana w kodzie jądra po stronie komputera wysyłającego wiadomość została wykonana

w pliku

net/ipv6/ip6_output.c

w funkcji:

ip6_xmit()

. Polega na uzupełnieniu struktury

zawierającej dane, które należy umieścić w nagłówkach rozszerzających. Struktury, które

zostały utworzone w przedstawionym fragmencie to:

ipv6_txoptions - struktura z zawartością nagłówków rozszerzających

hopopt - zawartość nagłówka typu hop-by-hop

Na obie struktury alokowana jest pamięć poleceniem

kmalloc()

. Dla struktury hopopt

zarezerwowano 16 bajtów. W przedstawionym fragmencie kodu wypełniono zawartość

nagłówka hop-by-hop, bez dwóch pierwszych bajtów, czyli pól Next Header i Hdr Ext Len.

Pola te są wypełniane automatycznie przez funkcje jądra w zależności od długości nagłówka

hop-by-hop i protokołu wyższej warstwy, czyli na przykład TCP lub UDP. W przedstawionym

fragmencie zawartość nagłówka hop-by-hop stanowi jedna opcja zakodowana w formacie

TLV. Jej numer, pole Option Type, ustawiony jest na arbitralnie dobraną wartość 6. Długość

zawartości opcji, czyli pole Opt Data Len ma wartość 12. Wartość 12 jest to długość bez pól

Option Type i Opt Data Len. Zawartość opcji, czyli pole Option Data wypełnione jest 4

znakami tworzącymi napis test. Pozostałe 8 znaków ma losową zawartość. Po wypełnieniu

danymi wskaźnik do struktury

hopopt

jest ustawiany jako atrybut

hopopt

w strukturze

ipv6_txoptions

.

Listing 10: Uzupełnianie strukty ipv6_txoptions

printk(KERN_INFO "build_hop_opt()\n");

hopopt = kmalloc(16,GFP_ATOMIC);

hopopt->nexthdr = NEXTHDR_TCP;

hopopt->hdrlen = 1; //bo 1*8 oktetow bez pierwszych 8 oktetow, czyli 64

len=hopopt->hdrlen;

printk(KERN_INFO "hopopt->hdrlen %d\n",len);

ptr=hopopt;

33

background image

/* zapisz tekst w kolejnych bajtach

*/

strcpy(s,"test");

printk(KERN_INFO "string: %s \n",s);

ptr[2]=6; // Option Type

ptr[3]=12; // Opt Data Length

for(i=4,k=0;i<8;i++,k++)

{

ptr[i]=s[k];

}

for(i=4;i<8;i++)

{

printk(KERN_INFO "value: %c\n",ptr[i]);

}

tx = kmalloc(sizeof(struct ipv6_txoptions),GFP_ATOMIC);

printk(KERN_INFO "sizeof(struct ipv6_txoptions) %u\n", sizeof(struct

ipv6_txoptions));

tx->tot_len=(int) sizeof(struct ipv6_txoptions);

tx->opt_nflen=16; //liczba bajtow zajetych przez naglowki hop-by-hop,

source routing destination options

tx->opt_flen=0; //liczba bajtow zajetych przez naglowek destination

options

tx->hopopt= hopopt;

//ipv6_hopopt_hdr null_opt_hdr;

tx->dst0opt=NULL;

tx->srcrt=NULL;

tx->dst1opt=NULL;

/*koniec tworzenia*/

opt_save=opt; //zapamietaj miejsce w pamieci

34

background image

opt=tx; //wskaz na utworzona strukture

Zmiana w kodzie jądra po stronie komputera odbierającego wiadomość z nagłówka hop-by-

hop została wykonana w plikach:

include/net/ipv6.h

,

net/ipv6/sysctl_net_ipv6.c

i

net/ipv6/exthdrs.c

. Dane są odczytywane z nagłówka hop-by-hop i zapisywane do

zmiennej w przestrzeni jądra, której wartość można odczytać z pliku znajdującego się na

dysku. Mechanizm zapisu i odczytu zmiennych do pliku na dysku jest standardowym

mechanizmem używanym do sterowania pracą jądra i modułów. Fragment z pliku

net/ipv6/sysctl_net_ipv6.c

, w którym zdefiniowana jest nowa zmienna przedstawiono

na Listingu 11. Zdefiniowano dwie zmienne typu znakowego o długości 128 znaków. Po

zdefiniowaniu dwóch zmiennych, struktura z tymi zmiennymi musi być zarejestrowana

z użyciem funkcji

register_sysctl_table().

Listing 11: Rejestracja nowej zmiennej w przestrzeni jądra

static int busy_ontime = 0; /*zmienna nie wykorzystywana*/

static struct ctl_table_header *ip6_header;

/*zmienne systemowe, ktore zostana podpiete do struktury ctl_table*/

char ipv6_exthdrs_my_hopbyhop_buf[128];

char ipv6_exthdrs_my_hopbyhop_buf_rec[128];

/*definicja dwoch zmiennych systemowych typu bufor znakow char

static ctl_table my_hopbyhop_table[] = {

/*zmienna zapasowa, nie wykorzystywana*/

{

.ctl_name = CTL_UNNUMBERED,

.procname = "exthdrs_my_hopbyhop_buf",

.data = ipv6_exthdrs_my_hopbyhop_buf,

.maxlen = sizeof(char) * 128,

.mode = 0666,

.proc_handler = proc_dostring,

},

/*zmienna wykorzystywana*/

{

.ctl_name = CTL_UNNUMBERED,

.procname = "exthdrs_my_hopbyhop_buf_rec",

.data = ipv6_exthdrs_my_hopbyhop_buf_rec,

35

background image

.maxlen = sizeof(char) * 128,

.mode = 0666,

.proc_handler = proc_dostring,

},

{}

};

/*glowna struktura zdefiniowanej zmiennej systemowej*/

static struct ctl_table my_hopbyhop_root_table[] = {

{

.ctl_name = CTL_UNNUMBERED,

.procname = "my_hopbyhop", /*nazwa funkcji*/

.maxlen = 0,

.mode = 0555,

.child = my_hopbyhop_table, /*odnosnik do struktury definiujacej zmienna*/

},

{}

};

[...]

static int ipv6_sysctl_net_init(struct net *net)

{

struct ctl_table *ipv6_table;

struct ctl_table *ipv6_route_table;

struct ctl_table *ipv6_icmp_table;

int err;

// my_hopbyhop

printk(KERN_INFO "Ladowanie rozszerzenia sysctl my_hopbyhop\n");

ip6_header

=

register_sysctl_table(my_hopbyhop_root_table);

//zarejestruj strukture definiujace nowa zmienna systemowa

[...]

Po zarejestrowaniu zmiennej w jądrze jest ona dostępna zarówno przez plik, a także

z poziomu jądra. Na Listingu 12 przedstawiono fragment zmodyfikowanego pliku

net/ipv6/exthdrs.c

, w którym funkcja

ipv6_my_hopbyhop()

odczytuje zawartość

nagłówka hop-by-hop i kopiuje ją do zmiennej

ipv6_exthdrs_my_hopbyhop_buf_rec

.

Użycie tej metody występuje w funkcji

ip6_parse_tlv()

w pliku

net/ipv6/exthdrs.c

,

która jest uruchamiana, jeżeli jądro znajdzie nagłówek hop-by-hop z opcjami zakodowanymi

w formacie TLV.

36

background image

Listing 12: Odczytanie nagłówka hop-by-hop

/* Parse tlv encoded option header (hop-by-hop or destination) */

/* oryginalna funkcja z jądra */

static int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff *skb)

{

struct tlvtype_proc *curr;

const unsigned char *nh = skb_network_header(skb);

int off = skb_network_header_len(skb);

int len = (skb_transport_header(skb)[1] + 1) << 3;

printk(KERN_INFO "funkcja ip6_parse_tlv");

if (skb_transport_offset(skb) + len > skb_headlen(skb))

goto bad;

off += 2;

len -= 2;

while (len > 0) {

int optlen = nh[off + 1] + 2;

ipv6_my_hopbyhop(nh,off);

[...]

/* funkcja uruchamiana w funkcji ip6_parse_tlv dla parsowanej zawartosci
naglowka hop-by-hop */

int ipv6_my_hopbyhop(unsigned char *nh, int optoff)

{

int i;

int opttype = nh[optoff];

int optlen = nh[optoff + 1] + 2;

printk(KERN_INFO "funkcja ip6_efip");

/* przekopiuj zawartosc naglowka hop-by-hop do zmiennej */

for(i=0;i<optlen;i++)

{

printk(KERN_INFO "bufor, %d char: %c \n",i,nh[optoff+i]);

if(i>1){

printk(KERN_INFO "i: %d",i-2);

ipv6_exthdrs_efipsans_buf_rec[i-2]=nh[optoff+i];

}

}

printk(KERN_INFO "dopisanie 0");

printk(KERN_INFO "i: %d",i-2);

37

background image

ipv6_exthdrs_my_hopbyhop_buf_rec[i-2]=0;

/* wypisz zawartosc zmiennej */

for(i=0;i<optlen-1;i++)

{

printk(KERN_INFO "my_hopbyhop_buf_rec,int: %d char: %c

\n",ipv6_exthdrs_my_hopbyhop_buf_rec[i]);

}

return 0;

}

Przedstawiona implementacja w plikach jądra została zrealizowana i przetestowana. Udało się

wysłać wybrany ciąg znaków z jednego komputera i odebrać go na drugim komputerze,

odczytując go z pliku na dysku.

4.2 Implementacja z wykorzystaniem zaczepów

Kolejną z możliwych implementacji warstwy transportowej wykorzystującej nagłówki hop-

by-hop protokołu IPv6 jest umieszczenie jej w jądrze i wykorzystanie makrodefinicji

tworzącej zaczep - NF_HOOK. Taki typ implementacji został najprawdopodobniej użyty w

projekcie EFIPSANS, którego kod źródłowy we wczesnej wersji o numerze 0.1 był

przeglądany.

Zaczep (ang. hook) to miejsce w jądrze, w którym pakiet może być przekazany do

zarejestrowanej funkcji. Może to być moduł, który weryfikuje lub modyfikuje pakiet. Funkcja

podejmuje decyzję, czy pakiet ma być dalej przetwarzany w jądrze, czy będzie skasowany.

38

background image

Rys. 16: Zaczepy

Na Rys. 16 przedstawiono schemat przetwarzania pakietu w jądrze systemu Linux,

z zaznaczonymi miejscami, w których można zarejestrować zaczepy:

NF_INET_PRE_ROUTING – gdy pakiet zostanie odebrany przez kartę sieciową i nie

ma jeszcze decyzji co do jego dalszego routingu: czy będzie on przekazywany do

innego komputera, czy też jest adresowany do gniazdka sieciowego na komputerze,

w którym jest przetwarzany

NF_INET_FORWARD – gdy pakiet został odebrany przez kartę sieciową i podjęto

decyzję, że pakiet będzie przekazany do innego komputera; pakiet jest kierowany na

wybrany interfejs wyjściowy

NF_INET_POST_ROUTING – gdy pakiet został wysłany do karty sieciowej w celu

wysłania do innego komputera

NF_INET_LOCAL_IN – gdy pakiet został przetworzony przez warstwę IP i jest

przekazywany wyższej warstwie, gdyż jest adresowany do gniazdka sieciowego na

komputerze, w którym jest przetwarzany

NF_INET_LOCAL_OUT – gdy pakiet został przekazany przez aplikację kliencką do

warstwy IP, w celu wysłania na wybrany adres IP

39

Urz ądzenie sieciowe

Routing

NF_INET_PRE_ROUTING

NF_INET_FORWARD

NF_INET_LOCAL_IN

NF_INET_LOCAL_OUT

NF_INET_POST_ROUTING

Urządz enie sieciowe

Routing

Wyższ e warstwy sieciowe

Pakiety przekazywane dalej

Pakiety adresowane do komputera

Pakiety wysyłane z komputera

background image

Na Listingu 13 przedstawiono fragmenty z pliku

net/ipv6/ip6_output.c

z jądra o numerze

2.6.37. W pliku tym występuje uruchomienie niektórych z omówionych makrodefinicji

NF_HOOK.

Listing 13: Fragmenty jądra, w których zarejestrowano zaczepy. Plik net/ipv6/ip6_output.c

static int ip6_finish_output2(struct sk_buff *skb)

{

[...]

if (newskb)

NF_HOOK(NFPROTO_IPV6, NF_INET_POST_ROUTING,newskb, NULL, newskb-

>dev,ip6_dev_loopback_xmit);

[...]

int ip6_output(struct sk_buff *skb)

{

[...]

return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, skb, NULL,

dev,ip6_finish_output,!(IP6CB(skb)->flags & IP6SKB_REROUTED));

[...]

int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,struct
ipv6_txoptions *opt)

{

[...]

return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL,dst->dev,
dst_output);

[...]

int ip6_forward(struct sk_buff *skb)

{

[...]

return NF_HOOK(NFPROTO_IPV6, NF_INET_FORWARD, skb, skb->dev, dst-
>dev,ip6_forward_finish);

Na kolejnym Listingu 14 przedstawiono fragmenty z pliku

net/ipv6/ip6_input.c

. W pliku

tym występują kolejne uruchomienia makrodefinicji NF_HOOK. Występują tu symbole

zaczepów NF_INET_PRE_ROUTING i NF_INET_LOCAL_IN. Są to brakujące dwa miejsca

widoczne na Rys. 16, które nie występują w pliku

net/ipv6/ip6_output.c

.

Listing 14: Fragmenty jądra, w których zarejestrowano zaczepy. Plik net/ipv6/ip6_input.c

net/ipv6/ip6_input.c

int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct

40

background image

packet_type *pt, struct net_device *orig_dev)

{

[...]

return NF_HOOK(NFPROTO_IPV6,NF_INET_PRE_ROUTING,skb,dev,NULL,
ip6_rcv_finish);

[...]

}

int ip6_input(struct sk_buff *skb)

{

[...]

return NF_HOOK(NFPROTO_IPV6,NF_INET_LOCAL_IN,skb,skb->dev,NULL,

ip6_input_finish);

[...]

}

W momencie uruchomienia makra NF_HOOK sprawdzane jest, czy nie są zarejestrowane

funkcje, które chcą przejąć i przetworzyć pakiet. Jeżeli nie ma żadnej w danym zaczepie lub

wszystkie zwrócą wartość NF_ACCEPT, wykonywana jest funkcja podana jako ostatni

parametr makra, czyli np.

ip6_rcv_finish()

czy

ip6_input_finish()

.

W celu zarejestrowania funkcji, która przejmie przetwarzanie pakietu, należy zdefiniować

strukturę

nf_hook_ops

, pokazaną na Listingu 15. Funkcja ta jest wskazywana przez argument

hook

. Atrybut

hooknum

jest wybranym zaczepem, określającym miejsce w którym pakiet

zostanie przekazany funkcji. Kolejny atrybut

pf

jest typem protokołu, dla którego zaczep

będzie uruchamiany. Może to być protkół IPv4 lub IPv6. Ostatnim atrybutem struktury jest

priorytet, który określa, w jakiej kolejności zarejestrowane w tym samym zaczepie funkcje

będą wykonywane.

W dalszym fragmencie Listingu 15 przedstawiono przykładowy kod definiujący strukturę

nf_hook_ops

. Funkcja, która będzie uruchamiana to

hook_fun()

. Pakiety protokołu IPv6

będa przekazywane tej funkcji. Moment, w którym funkcja będzie uruchamiana to miejsce

w kodzie tuż przed przekazaniem pakietu do urządzenia sieciowego, czyli

NF_IP_POST_ROUTING. Priorytet tej funkcji jest utawiony na najwyższy. Na Listingu 15

przedstawiono też zarejestrowanie i wyrejestrowanie struktury

nf_hook_ops

.

Listing 15: Użycie zaczepów. Przykład

static struct nf_hook_ops nfho = {

41

background image

.hook = hook_func,

.hooknum = NF_IP_PRE_ROUTING,

.pf = NFPROTO_IPV4,

.priority = NF_IP_PRI_FIRST,

};

static struct nf_hook_ops netfnetfer_ops_in;

netfilter_ops_in.hook = hook_fun;

netfilter_ops_in.pf = PF_INET6;

netfilter_ops_in.hooknum = NF_IP_POST_ROUTING;

netfilter_ops_in.priority = NF_IP_PRI_FIRST;

nf_register_hook(&netfilter_ops_in);

nf_unregister_hook(&netfilter_ops_in);

Każda funkcja przetwarzającej pakiety i zarejestrowana jako zaczep zwraca informację,

ukrytą pod symbolicznymi nazwami, co zrobić z pakietem:

NF_ACCEPT – pakiet ma być dalej przetwarzany przez jądro

NF_DROP – pakiet powinien zostać skasowany przez jądro

NF_REPEAT – pakiet powinien zostać ponownie przekazany funkcji, która go przed

chwilą przetworzyła

NF_STOLEN – pakiet powinien zostać skasowany przez jądro

NF_QUEUE – pakiet powinien zostać przekazany do przestrzeni użytkownika

Jeżeli funkcja ma za zadanie filtrować pakiety, będzie zwracała wartość NF_ACCEPT, gdy

pakiet nie ma być skasowany lub NF_DROP, gdy pakiet ma zostać skasowany. Jeżeli funkcja

modyfikuje pakiet, będzie zwracać wartość NF_ACCEPT, a w ciele funkcji będzie

wykonywana modyfikacja bufora, który reprezentuje pakiet.

Implementacja warstwy tranportowej w nagłówkach hop-by-hop protokołu IPv6 przy

wykorzystaniu zaczepów została wykonana w ramach europejskiego projektu EFIPSANS

[12, rozdział 4 WARF]. Zaproponowano dwa zastosowania takiego sposobu przesyłania

wiadomości. Pierwsze to routing wielościeżkowy, a drugi to autokonfiguracja kanałów

radiowych (skrót i nazwa WARF). Routing wielościeżkowy ma polegać na dynamicznym

kierowaniu ruchem, na podstawie chwilowej wiedzy o obciążeniu różnych ścieżek routingu,

prowadzących do sieci Internet. W projekcie WARF zaproponowano wymianę chwilowych

42

background image

danych o parametrach fizycznych kanałów radiowych, dla komputerów kontaktujących się

między sobą za pomocą interfejsów radiowych. Na podstawie aktualnych, chwilowych

danych o stosunku sygnału do szumu, karty sieciowe mogą sterować parametrami pracy,

w celu podniesienia jakości i wydajności połączenia radiowego.

4.3 Implementacja w przestrzeni użytkownika

.

Pakiety w systemie Linux mogą być filtrowane i modyfikowane nie tylko w jądrze [5]. Są

dostępne specjalne funkcjonalności, które umożliwiają przekazanie pakietu z przestrzeni jądra

do przestrzeni użytkownika i wykonanie na nim operacji. Funkcjonalności te wykorzystują

część jądra o nazwie Netfilter [14].

Filtrowanie pakietów, tak aby zostały przekazane do przestrzeni użytkownika jest

wykonywane poleceniem iptables dla protokołu IP lub ip6tables dla protkołu IPv6. Na

Listingu 16 przedstawiono przykładowe polecenie, które przekazuje pakiety wychodzące

z komputera do kolejki o numerze 1. W przestrzeni użytkownika należy uruchomić proces,

który będzie oczekiwał na pakiety z tej kolejki. Funkcja, która otrzyma pakiet, będzie mogła

go zmodyfikować lub nie i przekazać do jądra informację zwrotną, czy pakiet ma zostać

skasowany, czy dalej przetwarzany.

Ograniczeniem polecenia ip6tables w porównaniu z mechanizmem zaczepów jest możliwość

wyboru jedynie trzech miejsc przechwycenia pakietu. Są to miejsca o nazwach INPUT,

OUTPUT i FORWARD. Tym trzem miejscom odpowiadają miejsca, zdefiniowane przy

mechanizmie zaczepów o nazwach NF_INET_LOCAL_IN, NF_INET_LOCAL_OUT

i NF_INET_FORWARD. Oznacza to, że nie można przekazać pakietów do kolejki

w przestrzeni

użytkownika

w

miejscach

NF_INET_PRE_ROUTING

i NF_INET_POST_ROUTING.

Listing 16: Stworzenie filtra pakietów. Polecenie ip6tables. Przykład 1

ip6tables -A OUTPUT -d "fec0::1:2/64" -j NFQUEUE --queue-num 0

Biblioteką oferującą możliwość przetwarzania pakietów w przestrzeni użytkownika jest

libnetfilter_queue [5]. Jest ona częścią projektu, w ramach którego rozwijane jest polecenie

iptables. Jest przeznaczona dla programów napisanych w języku C++. Na Listingu 17

przedstawiono fragment kodu programu napisanego w C++, który odbiera pakiet z kolejki

NFQUEUE o numerze 0 i przekazuje go do funkcji

cb

. W funkcji tej pakiet jest przetwarzany,

43

background image

może być zmieniona jego zawartość i jest ponownie odsyłany do przestrzeni jądra za pomocą

funkcji

nfq_set_verdict

, która jako parametr otrzymuje bufor zawierający zmodyfikowany

pakiet i wartość NF_ACCEPT, oznaczającą że pakiet ma być dalej przetwarzany.

Listing 17: Przetwarzanie pakietów w przestrzeni użytkownika. Język C++

#include <linux/netfilter.h>

/* for NF_ACCEPT */

#include <libnetfilter_queue/libnetfilter_queue.h>

int main(int argc, char **argv)

{

struct nfq_handle *h;

struct nfq_q_handle *qh;

struct nfnl_handle *nh;

int fd;

int rv;

char buf[4096] __attribute__ ((aligned));

printf("opening library handle\n");

h = nfq_open();

if (!h) {

fprintf(stderr, "error during nfq_open()\n");

exit(1);

}

printf("binding nfnetlink_queue as nf_queue handler for AF_INET\n");

if (nfq_bind_pf(h, AF_INET6) < 0) {

fprintf(stderr, "error during nfq_bind_pf()\n");

exit(1);

}

printf("binding this socket to queue '0'\n");

qh = nfq_create_queue(h, 0, &cb, NULL);

if (!qh) {

fprintf(stderr, "error during nfq_create_queue()\n");

exit(1);

}

44

background image

printf("setting copy_packet mode\n");

if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) {

fprintf(stderr, "can't set packet_copy mode\n");

exit(1);

}

[...]

static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,

struct nfq_data *nfa, void *data)

{

[...]

printf("Sending buffer copied from original and with modified

payload, size %d\n",new_ip_total_length);

//printf("Sending original buffer\n");

return_value

=

nfq_set_verdict(qh,

id,

NF_ACCEPT,

new_ip_total_length, new_buffer);

return return_value;

}

W ramach niniejszej pracy stworzono prosty program, dołączający do wiadomości

wychodzących nagłówek hop-by-hop przy użyciu biblioteki libnetfilter_queue oraz

odczytujący zawartość nagłówka hop-by-hop w wiadomościach przychodzących. Kod

źródłowy programu został załączony do pracy. Odnośnik do niego znajduje się w Załączniku

D.

Biblioteka libnetfilter_queue ma dopisany interfejs, który umożliwia wykorzystanie jej

funkcjonalności przy użyciu języka Python [6]. Funkcjonalność ta zawarta jest w bibliotece

nfqueue-bindings. Interfejs biblioteki nfqueue-bindings w języku Python jest bardzo podobny

do interfejsu biblioteki libnetfilter_queue dla języka C++. Tak samo jak w przypadku

implementacji w języku C++ trzeba za pomocą polecenia ip6tables przekierować pakiety do

kolejki NFQUEUE, co pokazane jest na Listingu 18.

Listing 18: Utworzenie filtra pakietów. Polecenie ip6tables. Przykład 2

ip6tables -A OUTPUT -d "fec0::1:2/64" -j NFQUEUE --queue-num 1

45

background image

Fragment implementacji, która odbiera pakiety IPv6 z kolejki NFQUEUE o numerze 1

i przekazuje pakiet do przetworzenia w funkcji o nazwie

cb

przedstawiono na Listingu 19.

Listing 19: Przetwarzanie pakietów w przestrzeni użytkownika. Język Python

q1 = nfqueue.queue(1)

q1.open()

q1.unbind(AF_INET6)

q1.bind(AF_INET6);

q1.set_callback(cb)

print "creating queue"

q1.create_queue(1)

q1.set_queue_maxlen(5000)

try:

q1.try_run()

except KeyboardInterrupt, e:

print "interrupted"

q1.unbind(AF_INET6)

q1.close()

Na Listingu 20 pokazano strukturę funkcji

cb

, w której przetwarzany jest pakiet. Pakiet jest

reprezentowany jako ciąg znaków, tworzących obiekt typu string. Każdy znak reprezentuje

jeden bajt pakietu. Analogicznie do implementacji w języku C++ w ciele funkcji musi

wystąpić wywołanie funkcji, która zwraca ponownie do jądra zmodyfikowany lub oryginalny

pakiet z symboliczną wartością, decydującą o dalszym przetwarzaniu.. Znacznik

NF_ACCEPT oznacza, że pakiet ma być dalej obsługiwany przez jądro.

46

background image

Listing 20: Funkcja przetwarzająca pakiety. Język Python

#uruchamiana funkcja

def cb(i,payload):

data = payload.get_data()

#modyfikacja bajtów pakietu ip

[...]

ret

=

payload.set_verdict_modified(nfqueue.NF_ACCEPT,new_payload,len(new_payload
)) # pakiet ze zmieniona dlugoscia

return 1

4.4

Podsumowanie

Przedstawiono 4 możliwe rodzaje implementacji dodawania i odczytywania nagłówków hop-

by-hop. Dwa pierwsze sposoby są realizowane w przestrzeni jądra, jako modyfikacja

istniejących fragmentów jądra lub jako oddzielne moduły. Pierwszy rodzaj implementacji

polega na zmodyfikowaniu plików, w których przetwarzane są pakiety przechodzące przez

jądro. Taki sposób implementacji umożliwia przechwycenie i przetwarzanie pakietu

w dowolnym momencie, podczas przetwarzania go przez protkół IPv6. Rozwiązanie to choć

bardzo elastyczne, jest też najbardziej ryzykowne, gdyż trzeba uważać, żeby nie zepsuć

implementacji protokołu IPv6.

Drugi sposób jest również realizowany w przestrzeni jądra, ale z wykorzystaniem

funkcjonalności zaczepów (HOOKS), która umożliwia rejestrowanie funkcji, które przejmą

przetwarzanie pakietu w wybranych miejscach w jądrze. W jądrze jest zdefiniowanych

5 miejsc, w których pakiet może być przekazany do funkcji zarejestrowanej

z wykorzystaniem mechanizmu zaczepów. Jest to ograniczenie w stosunku do implementacji

bezpośrednio w plikach jądra. Ma to jednak taką zaletę, że implementację tworzy się

w oddzielnym module, który nie modyfikuje bezpośrednio protkołu IPv6 w jądrze.

Sposób trzeci i czwarty jest realizowany w przestrzeni użytkownika. Sposób trzeci

wykorzystuje bibliotekę libnetfilter_queue, która umożliwia przetwarzanie pakietu

w przestrzeni użytkownika. Ograniczeniem w stosunku do mechanizmu zaczepów jest

wolniejsze działanie, gdyż trzeba przekazać pakiet do przestrzeni użytkownika i potem

47

background image

z powrotem do jądra, oraz ograniczenie do tylko trzech miejsc, z których pakiet może być

przekazany do przetworzenia. Zaletą tego typu rozwiązania jest implementacja w języku C++

i brak ingerencji w jądro. Nie jest też konieczne pisanie modułów do jądra. Implementacja

w przestrzeni użytkownika jest prostsza i szybsza.

Czwarty sposób implementacji jest bardzo podobny do trzeciego. Różni się językiem

programowania. Wykorzystuje bibliotekę nfqueue-bindings, która umożliwia korzystanie

z biblioteki libnetfiletr_queue, z poziomu języka Python. Upraszacza i przyspiesza to

implementację w stosunku do implementacji w języku C++. Jednak wykonanie takiego

programu będzie wolniejsze, gdyż język Python jest językiem interpretowalnym. W Tab. 5

zestawiono razem główne cechy, czterech przedstawionych sposobów implementacji

programu.

Tab. 5: Porównanie cech sposobó implementacji.

sposób implementacji

pliki jądra jądro-

nf_hooks

libnetfilter
_queue

nfqueue-
bindings

cechy

szybkość pisania programu

mała

średnia

duża

bardzo
duża

negatywne skutki błędów w implementacji

bardzo
duże

duże

małe

małe

wydajność gotowego rozwiązania

bardzo
duża

duża

średnia

średnia/
mała

48

background image

5. Środowisko stworzone do testownia wykorzystania nagłówka hop-by-hop,
jako kanału komunikacyjnego

Rozdział zawiera opis implementacji środowiska, stworzonego w celu przetestowania kanału

transportowego, opartego na nagłówkach hop-by-hop, protokołu IPv6. Docelowe miejsce

wykorzytania proponowanego sposobu komunikacji, to bezprzewodowe sieci kratowe (ad-

hoc), w których pożądanymi cechami jest oszczędność pasma transmisyjnego i odpowiednia

wydajność. Program wykonano w systmie Linux, w przestrzeni użytkownika, w języku

Python. Aplikacja umożliwia mierzenie ważnych z punktu widzenia komunikacji cech, takich

jak opóźnienie w przesyłaniu wiadomości pomiędzy komputerami i wydajność. Dla

porównania komunikacji opartej o nagłówek hop-by-hop, warstwa transportowa umożliwia

też wykorzystanie pakietów UDP do przesyłania wiadomości.

49

background image

5.1 Wstęp do funkcjonalności stworzonego środowiska testowego.

Wytworzone i skonfigurowane środowisko testowe (Rys. 24) podzielone jest na dwie

warstwy: warstwę transportową, umożliwiającą komunikację między komputerami i program

klienta, wykorzystującego jej interfejs. Razem tworzą aplikację, która umożliwia testowanie

przesyłania różnych sekwencji wiadomości, między dwoma komputerami, z wykorzystaniem

nagłówka hop-by-hop. Charakterystyka czasowa strumienia przesyłanych danych ma

symulować przesyłanie różnego typu ruchu, który może być potencjalnie transportowany.

Manipulowanie charakterystyką czasową strumienia ma na celu zbadanie wydajności,

pewności dostarczenia i opóźnienie jakie charakteryzuje stworzony kanał transmisyjny.

W celu porównania ze standardowym mechanizmem wysyłania wiadomości, warstwa

transportowa umożliwia wysyłanie danych w pakietach UDP.

Funkcjonalność zrealizowanej aplikacji można opisać poprzez przypadki użycia.

Zdefiniowano następujące podstawowe przypadki użycia:

1. Przesłanie wiadomości przez warstwę trasportową z priorytetem N

2. Odebranie wiadomości z warstwy transportowej

3. Zmierzenienie opóźnienia warstwy transportowej

4. Przesłanie ruchu o charakterze N przez warstwę transportową

5. Wybór konfigurowalnych parametrów warstwy transportowej

6. Wybór charakteru przesyłanego ruchu w warstwie klienckiej

7. Wybór konfigurowalnych parametrów przesyłanego ruchu w warstwie klienckiej

Opis przypadków użycia:

1. Przesłanie wiadomości przez warstwę trasportową z priorytetem N

Przesłanie wiadomości pomiędzy aplikacjami klienckimi na różnych komputerach

z wykorzystaniem warstwy transportowej znajdującej się na obu komputerach.

Wiadomości są przesyłane w określony sposób, charakterystyczny dla danego

priorytetu ruchu, charakteryzowanych polityką wysyłania. Zdefiniowano 4 polityki:

priorytet 1 – pakiet jest doklejany w nagłówku hop-by-hop pakietów IPv6

wychodzących z komputera, dodatkowe pakiety nie są generowane

priorytet 2 – co określony okres czasu sprawdzana jest kolejka wiadomości

oczekujących na wysłanie i generowana jest taka liczba dodatkowych pakietów

50

background image

IPv6, do których wiadomości będą mogły być doklejone w nagłówku hop-by-

hop

priorytet 3 - dla każdej wiadomości generowany jest dodatkowy pakiet IPv6,

wiadomość jest przesyłana w nagłówku hop-by-hop pakietu

priorytet 4 – wiadomość jest przesyłana nie w nagłówku hop-by-hop, ale

w pakiecie UDP za pomocą protokołu IPv6.

Szczegółowy opis dostępnych priorytetów przedstawiony jest w rodziale 4.2.1

2. Odebranie wiadomości z warstwy transportowej

Odebranie przez aplikację kliencką jednej lub wielu wiadomości z warstwy

transportowej.

3. Zmierzenienie opóźnienia warstwy transportowej

Przesłanie jednej lub wielu wiadomości pomiędzy aplikacjami klienckimi

znajdującymi się na różnych komputerach, wykorzystując warstwę transportową,

która przesyła wiadomości w nagłówku hop-by-hop protokołu IPv6. Moment wysłania

i odebrania wiadomości w aplikacjach klienckich jest logowany i umożliwia

obliczenia czasu, jaki upłynął pomiędzy wysłaniem i odebraniem wiadomości.

4. Przesłanie ruchu o charakterze N przez warstwę transportową

Wygenerowanie w aplikacji klienckiej wielu wiadomości, które składają się na ruch

o określonym rozkładzie czasowym. Aplikacja umożliwia generowanie 3 typów

sygnału:

constant – o stałych odstępach między wiadomościami

random – o losowych odstępach czasu między wiadomościami

snmp-like – symulacja komunikacji generowanej przez protokół snmp.

Szczegółowy opis możliwych do wygenerowania typów ruchu jest przedstawiony

w rodziale 5.3.1. Ruch jest przesłany do drugiego komputera za pomocą warstwy

transportowej.

5. Wybór konfigurowalnych parametrów warstwy transportowej

51

background image

Wybranie konfigurowalnych parametrów warstwy transportowej. Wybór dotyczy

priorytetów o numerze 2 i 4. Dla priorytetu 2, wysyłającego wiadomości

z dopuszczalnym maksymalnym opóźnieniem możliwe jest określenie tego

opóźnienia. W przypadku priorytetu 4 można wybrać jaki typ potwierdzenia wysłania

wiadomości będzie wykorzystany. Szczegółowy opis przedstawiony jest w rozdziale

5.2.1. Po wybraniu parametrów danego priorytetu warstwa transportowa jest

testowana przy użyciu aplikacji klienckich. Pomiędzy komputerami przesyłany jest

ruch, składający się z wielu wiadomości.

6. Wybór charakteru przesyłanego ruchu w warstwie klienckiej

Wybranie jednego z 3 typów generowanego sygnału: constant, random, snmp-like. Po

wybraniu jednego z 3 typów sygnału i dowolnego priorytetu jest on wysyłany do

warstwy transportowej.

7. Wybór konfigurowalnych parametrów przesyłanego ruchu w warstwie klienckiej

Wybranie konfigurowalnych parametrów charakteru przesyłanego ruchu w aplikacji

klienckiej i przesłanie go do aplikacji klienckiej na drugim komputerze. Są to dla

poszczególnych sygnałów:

constant - odstęp czasu między wiadomościami.

random – wartość minimalna i maksymalna między którymi losowany jest

odstęp czasu między wiadomościami

snmp-like – wartość minimalna i maksymalna między którymi losowany jest

długi odstęp czasu między wiadomościami, liczba wiadomości w serii, odstęp

czasu między wiadomościami w serii

5.2 Program warstwy transportowej.

Implementację warstwy transportowej zrealizowano wykorzystując czwarty wariant,

z przedstawionych w rozdziale 4, czyli implementację w przestrzeni użytkownika

z wykorzystaniem bibliotek libnetfilter_queue i nfqueue_bindings. W tym wariancie językiem

programowania jest język Python.

52

background image

Warstwa transportowa otrzymuje, z przestrzeni jądra, pakiety IPv6. Do pakietów

wychodzących może dołączyć nagłówek rozszerzający hop-by-hop, a z pakietów

przychodzących, może odczytać zawartość takiego nagłówka. Z warstwą transportową

komunikuje się aplikacja kliencka. Przekazuje wiadomości do wysłania oraz odbiera

wiadomości, które zostały odczytane przez warstwę transportową.

Na Rys. 17 przedstawiono architekturę aplikacji. Przedstawione są dwa komputery, które

mogą komunikować się przy wykorzystaniu warstwy tranportowej. Stworzona aplikacja

składa się z warstwy transportowej i aplikacji klienckiej. Warstwa tranportowa komunikuje

się z przestrzenią jądra, w celu wysłania lub odebrania pakietów. Poszczególne numery

kanałów komunikacyjnych zaznaczone na rysunku mają następujące znaczenie:

1, 1' – komunikacja pomiędzy klientem i warstwą transportową zrealizowana poprzez

gniazdko sieciowe; klient przesyła wiadomości do warstwy tranportowej w celu

wysłania ich do drugiego komputera

2, 2' – komunikacja pomiędzy warstwą transportową i klientem zrealizowana poprzez

gniazdko sieciowe; warstwa transportowa przesyła klientowi wiadomości, które

zostały odebrane przez warstwę tranportową

3, 3' – komunikacja pomiędzy przestrzenią jądra i warstwą transportową zrealizowana

z wykorzystaniem biblioteki nfqueue_bindings; kanałem tym pakiety wychodzące

z komputera są przekazywane do warstwy tranportowej; warstwa tranportowa może

zmodyfikować pakiet dołączając wiadomość w nagłówku hop-by-hop

4, 4' – komunikacja pomiędzy przestrzenią jądra i warstwą transportową zrealizowana

z wykorzystaniem biblioteki nfqueue_bindings; kanałem tym pakiety przychodzące

do komputera są przekazywane do warstwy tranportowej; warstwa tranportowa może

odczytać, jeżeli występuje, zawartość nagłówka hop-by-hop pakietu IPv6

6 – komunikacja pomiędzy komputerami protokołem IPv6; przesyłane pakiety mogą

zawierać nagłówki hop-by-hop, dołączone przez warstwę transportową

5, 5' – bezpośrednia komunikacja pomiędzy warstwami transportowymi

z wykorzystaniem protokołu UDP i protokołu IPv6; tryb bezpośredniej komunikacji

jest dodatkowym trybem, w którym może pracować warstwa transportowa

53

background image

Rys. 17: Architektura aplikacji: warstwa transportowa i aplikacja kliencka

Standardowy scenariusz wykorzystania aplikacji wygląda następująco. Aplikacja kliencka

wysyła wiadomość do warstwy transportowej (1). Warstwa tranportowa może wykorzystać

nagłówki hop-by-hop (3) lub bezpośrednio protokół UDP (5) do przesłania wiadomości do

warstwy transportowej na drugim komputerze (6). Warstwa tranportowa na drugim

komputerze przekazuje odebraną wiadomość do aplikacji klienckiej na tym komputerze

(4' i 2').

5.2.1 Funkcjonalność

Zaimplementowany program warstwy transportowej umożliwia komunikację z klientem, oraz

wysyłanie wiadomości w nagłówkach hop-by-hop, lub bezpośrednio w protokole UDP

w pakietach IPv6. Dla przypadku wysyłania wiadomości w nagłówkach hop-by-hop

zdefiniowano i zrealizowano kilka typów transportu, nazwanych priorytetami. Warstwa

transportowa oferuje 4 typy priorytetów. Każdy z priorytetów charakteryzuje się innymi

parametrami opóźnienia w przesyłaniu wiadomości i wykorzystuje nagłówki rozszerzające

hop-by-hop lub protokół UDPv6. Każdy z priorytetów warstwy transportowej posiada

mechanizm potwierdzenia, że warstwa transportowa przyjęła wiadomość do wysłania. Klient

oczekuje na to potwierdzenie przed przekazaniem kolejnej wiadomości. Warstwa

transportowa, dla poszczególnych priorytetów, w różnym momencie wysyła takie

potwierdzenie. Ma to duży wpływ na możliwy charakter generowanego ruchu przez klienta

jak też na opóźnienie w dostarczeniu wiadomości do odbiorcy.

Priorytet 1

54

klient

warstwa transportowa

jądro (stos IP)

klient

warstwa transportowa

jądro (stos IP)

Komputer 1

Komputer 2

1

2

2'

1'

3

4

5

5'

4'

3'

6

background image

Wykorzystuje przesyłany ruch. Dołącza do niego nagłówki hop-by-hop z wiadomościami do

przesłania.

Warstwa transportowa potwierdza klientowi, że przyjęła wiadomość do wysłania,

w momencie, gdy skopiuje wiadomość do odpowiedniej kolejki.

Priorytet 2

Wykorzystuje przesyłany ruch, ale także generuje dodatkowe pakiety, aby zapewnić

dopuszczalne maksymalne opóźnienie w przesyłaniu wiadomości. Mechanizm został

zaimplementowany tak, że cyklicznie co określony jako parametr okres czasu sprawdzana jest

zawartość kolejki wiadomości oczekujących na wysłanie. Generowanych jest tyle

dodatkowych pakietów, ile wynosi długość kolejki. Szczegółowy opis w jaki sposób ustawić

parametr czasowy maksymalnego opóźnienia, znajduje się w Załączniku A.

Na zbiorczym Rys. 18 dla priorytetów 2, 3 i 4 przedstawiono histogramy opóźnienia warstw

transportowych. Na wykresie „Priorytet 2” pokazano historgramy opóźnienia dla warstwy

transportowej o priorytecie 2. Parametr maksymalnego, dopuszczalnego opóźnienia

ustawiony był na 20 ms. Większość pakietów została dostarczona z opóźnieniem

nieprzekraczającym 30 ms.

Warstwa transportowa potwierdza klientowi, że przyjęła wiadomość do wysłania

w momencie, gdy skopiuje wiadomość do odpowiedniej kolejki.

Priorytet 3

Od razu po odebraniu wiadomości od klienta, generuje dodatkowy pakiet IPv6 na adres

ustawiony jako parametr warstwy transportowej. Ma to zapewnić minimalne opóźnienie

przesyłania wiadomości. Następnie wiadomość jest dołączana do pakietu wychodzącego

w nagłówku hop-by-hop.

Na Rys. 18 na wykresie „Priorytet 3”, przedstawiono histogram opóźnienia warstwy

transportowej dla priorytetu 3. Łącze było nie obciążone. Warstwa transportowa zapewniła

opóźnienie pomiędzy 4 ms i 6 ms dla większości pakietów.

Warstwa transportowa potwierdza klientowi, że przyjęła wiadomość do wysłania

w momencie, gdy wiadomość zostanie dołączona w nagłówku hop-by-hop do pakietu

wychodzącego. Takie rozwiązanie wprowadza możliwe do wystąpienia opóźnienie,

w generowaniu wiadomości przez klienta, ale zapewnia małe opóźnienie w dostarczeniu

wiadomości do odbiorcy.

55

background image

Priorytet 4

Jako jedyny nie wykorzystuje nagłówków hop-by-hop do przesyłania wiadomości.

Wiadomości są przesyłane bezpośrednio w protkole UDP w pakietach IPv6. Ten typ

przesyłania wiadomości współpracuje z mechanizmem kształtowania ruchu, który umożliwia

retransmisję pakietów. Dzięki temu wiadomości nie są tracone, ale wprowadzane jest duże

opóźnienie w sytuacjach, gdy interfejs jest wysycony ruchem. Szczegółowy opis w jaki

sposób ustawić tryb potwierdzenia dla priorytetu 4 znajduje się w Załączniku A.

Na Rys. 18 na wykresie „Priorytet 4”, przedstawiono histogram opóźnienia warstwy

transportowej dla priorytetu 4. Łącze było nieobciążone. Warstwa transportowa zapewniła

opóźnienie pomiędzy 3 ms i 6 ms dla większości pakietów.

Możliwa jest praca w dwóch trybach potwierdzenia klientowi, że wiadomość została przyjęta

do wysłania. W pierwszym z nich warstwa transportowa wysyła wiadomość do odbiorcy.

Odbiorca odsyła potwierdzenie w pakiecie UDP. Dopiero po odebraniu potwierdzenia

warstwa transportowa nadawcy potwierdza przyjęcie wiadomości klientowi warstwy

transportowej. Zaletą takiego rozwiązania jest uniknięcie sytuacji, gdy w warstwie

transportowej odbiorcy nagromadzą się komunikaty do przetworzenia. Wadą jest mniejsza

wydajność w przesyłaniu wiadomości.

W drugim trybie pracy potwierdzenie do klienta o wysłaniu wiadomości jest generowane

w momencie, gdy funkcja

sendto

operująca na gniazdku zakończy swoje działanie. Warstwa

transportowa nie oczekuje na potwierdzenie od warstwy transportowej odbiorcy. Warstwa

transportowa odbiorcy wiadomości nie generuje takiego potwierdzenia. Rozwiązanie to jest

bardziej wydajne, ale może wystąpić problem z przetwarzaniem dużej liczby komunikatów po

stronie odbiorcy, co wprowadzi opóźnienie w dostarczaniu wiadomości do aplikacji klienta na

drugim komputerze.

56

background image

Priorytet 2

Priorytet 3

Priorytet 4

Rys. 18: Przykładowe histogramy opóźnienia dla priorytetów 2, 3, 4.
legenda wykresów: oś pionowa – liczba wiadomości, oś pozioma – opóźnienie dostarczenia
wiadomości [s]

57

background image

5.2.2 Implementacja

Implementacja warstwy transportowej zrealizowana jest w języku Python. Program

komunikuje się z aplikacją kliencką przy wykorzystaniu gniazdek sieciowych, oraz

komunikuje się z przestrzenią jądra z wykorzystaniem biblioteki nfqueue_bindings. Warstwa

transportowa oferuje kilka priorytetów przesyłania ruchu, które działają równolegle.

Stworzona architektura, która umożliwia pracę w wielu trybach jednocześnie, składa się

z wielu wątków i kolejek. Kolejki umożliwiają bezpieczne działanie wsytuacji, w której kilka

wątków pisze do kolejki lub z niej czyta. W kolejnych fragmentach pracy zostanie omówiona

struktura kolejek i wątków tworzących aplikację oraz fragmenty implementacji warstwy

transportowej.

Rys. 19: Warstwa transportowa; Część wysyłająca; Logowanie zdarzeń

Część wysyłająca.

58

Direct Sender

Priority Queue

Generate HopByHop

Socket Server

Delay Queue

Delay Sender

cb_output

klient

Q10

Q9

Q0

Q2

Q3

Q12

Q7

Q4

Q5

Q6

Q11

Q8

p1 p2 p3 p4

p1 p2 p3 p4

p1 p2 p3

p4

p4

p4

p1 p2 p3

p2

p2

p2

p3

p3

p3

p1

p2

p3

p1

p2

p3

p3

server3.txt

server1.txt

server2.txt

server4.txt

server8.txt

background image

Na Rys. 19 przedstawiono strukturę części wysyłającej, aplikacji warstwy transportowej.

Składa sie ona z kilku wątków i kolejek. Elementy diagramu zawierają etykiety priorytetów

(p1, p2, p3, p4). Etykieta oznacza, że dany element aplikacji jest wykorzystywany do

przetwarzania wiadomości o podanym priorytecie.

Opis wątków.

W kolejnych akapitach zostało opisane funkcjonowanie wątków i funkcja

cb_output

, które

tworzą strukturę przetwarzania pakietów o różnych priorytetach z Rys. 19. W dalszej części

będzie jeszcze przedstawiony inny typ opisu programu, polegający na prześledzeniu, w jaki

sposób przetwarzany jest wiadomość o wybranym priorytecie.

Wątek o nazwie SocketServer służy do odbierania wiadomości od klienta i wstawiania jej do

wybranej kolejki w zależności od priorytetu, z jaką wiadomość ma zostać wysłana.

Wiadomości o priorytecie 1 są wstawiane do kolejki Q0. Wiadomości o priorytecie 2 są

wstawiane do kolejki Q2. Wiadomości o priorytecie 3 - do kolejki Q3. Po wstawieniu

wiadomości o priorytecie 3 do kolejki Q3, wątek SocketServer czeka na potwierdzenie

wysłania wiadomości, które jest wstawione do kolejki Q8 przez funkcję, która wstawiła

wiadomość do nagłówka hop-by-hop. Skutkuje to tym, że warstwa transportowa potwierdzi

klientowi, że przyjęła wiadomość o priorytecie 3 do wysłania, dopiero w momencie, gdy

wiadomość zostanie doklejona do pakietu wychodzącego. Wiadomości o priorytecie 4

wstawiane są do kolejki Q9. Dla wiadomości o priorytecie 4 wątek czeka na potwierdzenie,

że wiadomość została wysłana. Potwierdzenie jest wstawione do kolejki numer Q10 przez

wątek DirectSender. Dopiero po odebraniu potwierdzenia, wątek potwierdzi klientowi, że

wiadomość została przyjęta do wysłania i pobierze kolejną wiadomość do wysłania od

klienta.

Wątek GenerateHopByHop pobiera wiadomości z kolejek Q0, Q2 i Q3, konwertuje je na

gotowy nagłówek hop-by-hop i wstawia do kolejek Q5, Q6 lub Q11. Wiadomości pobrane

z kolejki Q0, czyli te o priorytecie 1, są wstawiane po przetworzeniu do kolejki Q6.

Wiadomości pobrane z kolejki Q2, czyli te o priorytecie 2, są wstawiane po przetworzeniu do

kolejki Q11. Wiadomości pobrane z kolejki Q3, czyli te o priorytecie 3, są wstawiane po

przetworzeniu do kolejki Q5. Dodatkowo dla tego priorytetu wątek wstawia symboliczną

wiadomość do kolejki Q4. Jest to informacja dla wątku PriorityQueue, żeby wygenerować

dodatkowy pakiet IPv6, do którego zostanie dołączona wiadomość właśnie wstawiona do

kolejki Q5.

59

background image

Kolejnym ważnym fragmentem implementacji jest funkcja

cb_output

, która jest

wywoływana asynchronicznie, dla każdego pakietu wychodzącego spełniającego regułę,

utworzoną przez polecenie ip6tables. Argument funkcji

cb_output

jest buforem,

zawierającym pakiet IPv6. Algorytm dołączania wiadomości do pakietu jest następujący.

Sprawdzane jest, czy jest wiadomość w kolejkace Q5, czyli o priorytecie 3. Jeżeli kolejka jest

pusta, sprawdzane jest, czy nie ma wiadomości o priorytecie 2 w kolejce Q11. Jeżeli kolejka

Q11 jest pusta, sprawdzana jest jeszcze kolejka Q6, która zawiera wiadomości o priorytecie 1.

Dzięki temu wprowadzono zasadę, że wiadomości o wyższym priorytecie są najpierw

wysłane w nagłówku rozszerzającym. Pobrany z kolejki Q5, Q6 lub Q11 nagłówek hop-by-

hop, zawierający wiadomość odebraną od klienta, jest dołączany do nagłówka IPv6. Pakiet po

przetworzeniu jest przekazywany do jądra systemu, w celu wysłania go przez interfejs

sieciowy komputera. Jeżeli doklejono wiadomość z kolejki Q5, czyli o priorytecie 3,

wstawiana jest do kolejki Q7 i Q8 wiadomość, będąca symbolicznym potwierdzeniem

wysłania.

Wątek PriorityQueue pobiera symboliczne wiadomości z kolejki Q4. Każda wiadomość jest

informacją, że przyjęto do wysłania wiadomość o priorytecie 3. Generowany jest dodatkowy

pakiet do którego może być doklejony nagłówek hop-by-hop z wiadomością oczekującą na

wysłanie w funkcji

cb_output

.

Wątek Delay Queue co określony odstęp czasu sprawdza długość kolejki Q11. Długość tej

kolejki jest liczbą wiadomości o priorytecie 2, które oczekują na wysłanie. Tę wartość wątek

wstawia do kolejki Q12.

Wątek DelaySender z kolejki Q12 pobiera wstawioną wartość i generuje taką liczbę

dodatkowych pakietów. W ten sposób zapewniona jest cecha priorytetu 2, czyli

gwarantowanie maksymalnego dopuszczalnego opóźnienia wysłania wiadomości.

Wątek DirectSender pobiera wiadomości o priorytecie 4 z kolejki Q9. Wątek ten wysyła

wiadomość do warstwy transportowej na drugim komputerze w pakiecie UDP protokołem

IPv6. Priorytet 4 może pracować w dwóch trybach potwierdzenia wysłania. Tryb pracy musi

być zgodnie ustawiony na obu komputerach. W pierwszym trybie wątek oczekuje na

odebranie wiadomości UDP z drugiego komputera, będącą potwierdzeniem, że wiadomość

została odebrana. Dopiero po otrzymaniu takiego potwierdzenia wątek wstawia potwierdzenie

wysłania do kolejki Q10. W drugim trybie wątek wysyła wiadomość w pakiecie UDP i od

razu wstawia potwierdzenie do kolejki Q10, że pakiet został wysłany. Praca w drugim trybie

60

background image

umożliwia osiągnięcie większej wydajności w przesyłaniu wiadomości, ale może wystąpić

opóźnienie w odbieraniu wiadomości na drugim komputerze, jeżeli wydajność odbierania

będzie mniejsza niż wysyłania. Praca w pierwszym trybie spowoduje zmniejszenie

wydajności połączenia, ale zapewniony zostanie mały czas pomiędzy nadaniem wiadomości i

odebraniem na drugim komputerze.

Opis przetwarzania priorytetów.

Powyżej zostały opisane wątki, które tworzą strukturę przetwarzania pakietów o różnych

priorytetach. Innym sposobem opisu architektury jest prześledzenie drogi, jaką przechodzą

pakiety o poszczególnych priorytetach. Taki opis jest zaprezentowany poniżej.

Priorytet 1 oznacza, że wiadomość będzie wysłana w nagłówku hop-by-hop pakietu IPv6

wychodzącego z komputera. Wiadomość będzie oczekiwała do czasu pojawienia się pakietu

IPv6. Może to być dowolnie długi czas.

Wiadomość o priorytecie 1 jest odbierana od klienta przez wątek SocketServer. Wiadomość ta

jest wstawiana do kolejki Q0. Z kolejki Q0 jest pobierana przez wątek GenerateHopByHop

i konwertowana do gotowej postaci nagłówka hop-by-hop. Następnie wątek

GenerateHopByHop wstawia gotowy nagłówek do kolejki Q6. Gdy funkcja

cb_ouput

jest

wywołana przez jądro i nie ma oczekujących na wysłanie wiadomości o priorytecie 2 lub 3,

wtedy nagłówek jest pobierany z kolejki Q6 i dołączany do pakietu. Wiadomość została

wysłana do drugiego komputera.

Wiadomość o priorytecie 2 jest odbierana od klienta przez wątek SocketServer. Wiadomość ta

jest wstawiana do kolejki Q2. Z kolejki Q1 jest pobierana przez wątek GenerateHopByHop

i konwertowana do postaci gotowego nagłówka hop-by-hop. Następnie wątek

GenerateHopByHop wstawia gotowy nagłówek do kolejki Q11. Co określony odstęp czasu

wątek DelayQueue sprawdza długość kolejki Q11. Jeżeli kolejka Q11 nie jest pusta to

wstawia liczbę określającą jej długość do kolejki Q12. Z kolejki Q12 wstawioną wartość

pobiera wątek DelaySender. Wątek DelaySender generuje dodatkową liczbę pakietów. Gdy

funkcja

cb_ouput

jest wywołana przez jądro i nie ma oczekujących na wysłanie wiadomości

o priorytecie 3, wtedy nagłówek z wiadomością o priorytecie 2 jest pobierany z kolejki Q11

i dołączany do pakietu. Wiadomość została wysłana do drugiego komputera.

Wiadomość o priorytecie 3 jest odbierana od klienta przez wątek SocketServer. Wiadomość ta

jest wstawiana do kolejki Q3. Z kolejki Q3 jest pobierana przez wątek GenerateHopByHop

61

background image

i konwertowana do gotowej postaci nagłówka hop-by-hop. Następnie wątek

GenerateHopByHop wstawia gotowy nagłówek do kolejki Q5 i wiadomość znacznik do

kolejki Q4. Z kolejki Q4 wątek PriorityQueue pobiera wiadomość i generuje od razu pakiet

IPv6 do drugiego komputera. Gdy ten lub inny przypadkowy pakiet jest przetwarzany przez

jądro, jest wywoływana funkcja

cb_ouput

. Nagłówek z wiadomością jest pobierany z kolejki

Q5 i dołączany do pakietu. Wiadomość została wysłana do drugiego komputera.

Potwierdzenie o wysłaniu jest wstawiane do kolejki Q8. Dopiero po otrzymaniu tego

potwierdzenia, wątek SocketServer pobierze kolejną wiadomość o tym priorytecie do

wysłania.

Wiadomość o priorytecie 4 jest odbierana od klienta przez wątek SocketServer. Jest ona

wstawiana do kolejki Q9. Z kolejki Q9 jest pobierana przez wątek DirectSender. Wątek

DirectSender wysyła tę wiadomość do wartwy transportowej na drugim komputerze i,

w zależności od trybu, w którym działa albo od razu wstawia potwierdzenie do kolejki Q10

(drugi tryb pracy), albo czeka na pakiet UDP od odbiorcy (pierwszy tryb). Po wstawieniu

potwierdzenia do kolejki Q10 wątek SocketServer potwierdzi klientowi, że wiadomość została

przyjęta do wysłania i pobierze kolejną wiadomość do wysłania od klienta.

Część odbierająca.

Kolejna część warstwy transportowej odpowiada za odbieranie wiadomości i przekazywanie

ich klientom. Jest ona mniej skomplikowana od części wysyłającej, gdyż składa się tylko

z dwóch typów kanałów. Schemat tej części aplikacji jest przedstawiony na Rys. 20.

Pierwszy kanał to wiadomości odebrane bezpośrednio w pakiecie UDP przez wątek

DirectReceiver. Dotyczy to wiadomości wysłanych z priorytetem 4. Wątek może pracować

w dwóch trybach. W pierwszym trybie po odebraniu wiadomości odsyłana jest wiadomość

UDP protokołem IPv6, jako potwierdzenie odebrania. W drugim trybie nie jest odsyłane

żadne potwierdzenie. Wiadomość odebrana tym kanałem jest wstawiana do kolejki QIN2.

Wiadomości z pozostałymi priorytetami, czyli 1, 2 i 3, są przesyłane w nagłówku hop-by-hop.

Gdy pakiet jest odebrany w komputerze, jest przekazywany do funkcji

cb_input

w przestrzeni użytkownika. Funkcja ta sprawdza, czy występuje w nim nagłówek hop-by-hop

i jeżeli tak, to kopiuje ten nagłówek do kolejki QIN1. Z kolejki tej wątek ReadHopByHop

odczytuje nagłówek i konwertuje go do postaci pojedynczej wiadomości, pozbywając się

zbędnych pól, takich jak długość wiadomości. Po przekonwertowaniu wiadomość jest

62

background image

wstawiana do kolejki QIN2. Z kolejki QIN2 wątek SocketServerRecevier pobiera wiadomości

i przekazuje je do klienta.

Rys. 20: Architektura warstwy transportowej; część odbierająca

5.3 Program klienta

Aplikacja kliencka zrealizowana w języku Python posiada graficzny interfejs użytkownika.

Program komunikuje się z warstwą transportową przy użyciu gniazdek sieciowych.

W programie można wygenerować różne typy sygnałów, różniące się rozkładem czasu

pomiędzy wiadomościami. Aplikacja służy też do odbierania wiadomości z warstwy

transportowej.

5.3.1 Funkcjonalność

Głównym zadaniem aplikacji klienckiej jest wysyłanie i odbieranie wiadomości do warstwy

transportowej. Komunikacja z warstwą transportową jest zrealizowana przy użyciu gniazdek

63

Direct Receiver

Socket Server Receiver

klient

QIN2

QIN1

cb_input

Read HopByHop

server7.txt

server9.txt

server6.txt

server5.txt

background image

sieciowych. Aplikacja generuje kilka typów sygnałów składających się z wielu wiadomości.

Sygnały różnią się między sobą rozkładem czasowym pomiędzy kolejnymi wiadomościami.

Na Rys. 21 przestawiono wykresy histogramów odstępu czasu między wiadomościami, dla

trzech typów sygnałów. Na Rys. 22 przedstawiono także wykres czasu, dla sygnału snmp-like,

w którym odstęp między sygnałami składa się z bardzo małych i dużych przerwach, co dobrze

widać na tego rodzaju wykresie.

Sygnał no-delay

Sygnał ten charakteryzuje się pracą w pętli bez dodatkowego opóźnienia czasowego.

Szybkość generowania nowych wiadomości jest ograniczona tylko szybkością odsyłania

przez warstwę transportową potwierdzeń, że wiadomość została przyjęta do przesłania.

W scenariuszu, w którym warstwa transportowa nie wykonuje dodatkowych czynności poza

skopiowaniem wiadomości, opóźnienie generowania kolejnych wiadomości przez klienta

może wynosić około 1ms, co widać na wykresie histogramu odstępu czasu między

wiadomościami na Rys. 21, na wykresie „Sygnał no-delay. Test 1”. Jeżeli warstwa

transportowa czeka na rzeczywiste wysłanie wiadomości, zanim potwierdzi klientowi

odebranie wiadomości, to w konsekwencji moment wygenerowania kolejnego sygnału może

być dowolnie duży. Na Rys. 21, na wykresie „Sygnał no-delay. Test 2”, przedstawiono

histogram odstępu czasu między wiadomościami, dla sygnału generowanego przez klienta,

gdy warstwa transportowa wprowadza opóźnienie przy potwierdzaniu klientowi, że przyjęła

wiadomość do wysłania.

Sygnał constant

Sygnał ten generuje wiadomości w regularnych odstępach czasu. Odstęp czasu jest

parametryzowany. Szybkość generowania nowych wiadomości jest jednak ograniczona przez

warstwę transportową. Warstwa transportowa musi potwierdzić, że przyjęła wiadomość do

wysłania. W konsekwencji moment wygenerowania kolejnego sygnału może być dowolnie

duży. Na Rys. 21 na wykresie „Sygnał constant” przedstawiono histogram odstępu czasu

między wiadomościami, dla sygnału typu constant. Parametr odstępu czasu był ustawiony na

50 ms. Szczegółowy opis w jaki sposób ustawić parametr czasowy znajduje się

w Załączniku A.

Sygnał random

Sygnał ten charakteryzuje się losowymi odstępami czasu pomiędzy kolejnymi

wiadomościami. Zakres losowanych odstępów czasu jest ustawiany jako parametr przez

64

background image

podanie najmniejszej i największej wartości. Rozkład w tym obszarze jest równomierny.

Szybkość generowania nowych wiadomości jest jednak ograniczona przez warstwę

transportową. Warstwa transportowa musi potwierdzić, że przyjęła wiadomość do wysłania.

Na Rys. 21 na wykresie „Sygnał random” przedstawiono histogram odstępu czasu między

wiadomościami, dla sygnału typu random, przy ustawionym zakresie losowania odstępu

czasu pomiędzy 16 ms i 26 ms. Szczegółowy opis w jaki sposób ustawić parametry czasowe

sygnału znajduje się w Załączniku A.

Sygnał snmp-like

Sygnał ten ma symulować ruch generowany przez protokół SNMP. Składa się z dłuższych

przerw o losowej długości i szybkich serii, o losowej liczności i stałym odstępie pomiędzy

wiadomościami w serii. Stały odstęp pomiędzy wiadomościami w serii jest podawany jako

parametr. Zakres losowania dłuższego odstępu czasu też jest podawany jako parametr.

Szybkość generowania nowych wiadomości jest ograniczona także przez warstwę

transportową. Warstwa transportowa musi potwierdzić, że przyjęła wiadomość do wysłania.

Na Rys. 21 na wykresie „Sygnał snmp-like” i Rys. 22 przedstawiono histogram odstępu czasu

między wiadomościami i wykres czasu. Długie przerwy pomiędzy seriami dobrze widać na

Rys. 22, na wykresie „Sygnał snmp-like”. Parametry sygnału były następujące: odstęp czasu

pomiędzy seriami pomiędzy 0,5 s i 5 s, liczba wiadomości w serii pomiędzy 1 i 100, odstęp

czasu pomiędzy wiadomościami w serii 6 ms. Szczegółowy opis w jaki sposób ustawić

parametry czasowe sygnału znajduje się w Załączniku A.

65

background image

Sygnał no-delay. Test 1

Sygnał no-delay. Test 2

Sygnał constant

Sygnał random

Sygnał snmp-like

Rys. 21: Histogramy sygnałów – prezentacja sygnałów
legenda wykresów: oś pionowa – liczba wiadomości, oś pozioma – odstęp czasu pomiędzy
kolejnymi wiadomościami [s]

66

background image

Sygnał snmp-like

Rys. 22: Wykres sygnału – prezentacja sygnałów
legenda wykresu: oś pionowa – odstęp pomiędzy kolejnymi wiadomościami [s], oś pozioma
– numer wiadomości

67

background image

5.3.2 Implementacja

Implementacja aplikacji klienckiej została zrealizowana w języku Python. Program

komunikuje się z warstwą transportową przez gniazdka sieciowe. Aplikacja ma graficzny

interfejs użytkownika. Konfigurowalne parametry są ładowane podczas startu aplikacji.

Szczegółowy opis w jaki sposób ustawić parametry startowe znajduje się w Załączniku A.

Na Rys. 23 przedstawiono architekturę aplikacji klienckiej. Aplikacja zawiera GUI –

graficzny interfejs do sterowania aplikacją. Z poziomu GUI można uruchomić 3 wątki. Wątek

o nazwie SocketClient podłącza się do warstwy tranportowej za pomocą gniazdka sieciowego,

w celu wysyłania wiadomości do warstwy tranpsportowej. Wiadomość, która pojawi się

w kolejce Q, jest pobierana przez ten wątek i wysyłana do warstwy transportowej. Warstwa

transportowa odpowiada potwierdzeniem, że pakiet został przyjęty do wysłania. Po tym

potwierdzeniu wątek SocketClient wstawia do kolejki Qack potwierdzenie, że wiadomość

została wysyłana. Wątek SignalGenerator generuje wiadomości, których rozkład czasowy ma

określony charakter. Dostępne są 4 typy sygnałów o różnym rozkładzie czasowym odstępu

pomiędzy kolejnymi wiadomościami. Trzecim wątkiem jest wątek SocketClientListener, który

łączy się z warstwą transportową przez gniazdko sieciowe i oczekuje na wiadomości, które

odebrała warstwa transportowa.

68

background image

Rys. 23: Aplikacja kliencka. Logowanie zdarzeń

5.4 Pomiar opóźnienia przesyłania wiadomości

Aplikacja kliencka i warstwa transportowa ma wbudowany mechanizm raportowania czasu

przetworzenia wiadomości. Podczas przetwarzania wiadomości jest zapisywany do pliku

moment czasu przetworzenia wiadomości i sama wiadomość. Dzięki temu mechanizmowi

można mierzyć i badać, które fragmenty przetwarzania pakietu są najbardziej czasochłonne.

W aplikacji klienckiej raportowane są dwa miejsca. Wątek SocketClient zapisuje do pliku

o nazwie

client1.txt

moment wysłania do warstwy transportowej wiadomości. Wątek

SocketClientListener zapisuje do pliku o nazwie

client2.txt

moment odebrania wiadomości

od warstwy transportowej. Na Rys. 23 przedstawiono miejsca w aplikacji klienckiej, w której

występuje logowanie zdarzeń do plików.

W warstwie transportowej także zastosowano logowanie przetwarzania wiadomości. Miejsca

logowania zaznaczone są na Rys. 19 i 20. Rys. 19 dotyczy części wysyłącej, a Rys. 20

odbierającej. Do pliku

server3.txt

funkcja cb_output zapisuje moment doklejenia

wiadomości w nagłówku hop-by-hop do wychodzącego pakietu IPv6. Do pliku

server5.txt

69

Socket Client Listener

Socket Server Receiver

GUI

Qack

Q

warstwa transportowa

Socket Client

client1.txt

client2.txt

background image

funkcja cb_input loguje moment odebrania nagłówka hop-by-hop. Wątek SocketServer

zapisuje do pliku

server1.txt

moment odebrania wiadomości od klienta. Wątek

GenerateHopByHopThread zapisuje do pliku

server2.txt

moment przekonwertowania

wiadomości na nagłówek hop-by-hop. Wątek PriorityQueueThread loguje do pliku

server4.txt

moment odebrania potwierdzenia od funkcji cb_output, że nagłówek hop-by-

hop został doklejony do wychodzącego pakietu. Wątek ReadHopByHopThread loguje do

pliku

server6.txt

moment odczytania wiadomości z nagłowka hop-by-hop pakietu

przychodzącego do komputera. Wątek SocketServerReceiver loguje do pliku

server7.txt

moment wysłania wiadomości do klienta. Wątek DirectSenderThread loguje do pliku

server8.txt

moment wysłania wiadomości bezpośrednio do drugiej warstwy transportowej

w pakiecie UDP. Wątek DirectReceiverThread loguje do pliku

server9.txt

moment

odebrania od wątku DirectSender na drugim komputerze wiadomości w pakiecie UDP.

Opóźnienie warstwy transportowej było mierzone z wykorzystaniem plików

client1.txt

i

client2.txt

. Obliczana była różnica w czasie pomiędzy nadaniem wiadomości przez

klienta na jednym komputerze i odebraniem wiadomości przez klienta na drugim komputerze.

Przed obliczaniem faktycznych wartości zapewniono, za pomocą protokołu NTP, że zegary na

obu komputerach są zsynchronizowane.

70

background image

6. Środowisko testowe

W rozdziale przedstawiono schemat środowiska testowego użytego do przeprowadzenia

testów akceptacyjnych oraz badań, z wykorzystaniem stworzonego programu. Na środowisko

składają się dwa komputery połączone przez sieć, wykonany program, aplikacje generujące

ruch testowy oraz mechanizm kształtowania ruchu dostępny w systemie Linux. Generowany

ruch oraz użycie mechanizmu kształtowania, mają na celu próbę zasymulowania

rzeczywistych warunków, w jakich stworzona aplikacja może być wykorzystywana,

i w których jej zastosowanie będzie przynosiło wymierne korzyści.

71

background image

6.1 Schemat środowiska testowego

Rys. 24: Środowisko testowe

Środowisko do testów przedstawione jest na Rys. 24. Składa się z dwóch komputerów

połączonych przez router. Komputer 1 jest podłączony do routera przez kabel sieciowy.

Komputer 2 jest podłączony do routera przez bezprzewodową kartę sieciową, pracującą

w standardzie 802.11b/g. Z powodu bardzo bliskiej odległości między interfejsami

radiowymi, która wynosi około 1 metra, założono, że nie występują zakłócenia transmisji

wynikające ze słabej jakości sygnału. Różnica między połączeniem radiowym, a połączeniem

po kablu jest taka, że w kablu transmisja jest dwukierunkowa. Wykorzystując łączność

radiową, transmisja jest możliwa tylko w jednym kierunku w danym momencie.

W komputerze 1 i komputerze 2 uruchamiana jest warstwa transportowa, z której korzystają

po jednym kliencie na każdym komputerze. Klient warstwy transportowej może wysyłać

wiadomości do drugiego klienta i odbierać wybrane wiadomości od klienta z drugiego

komputera. W przeprowadzonych scenariuszach testowych klienci realizowali jedną z funkcji,

72

Komputer 1

Komputer 2

Warstwa
transportowa

Warstwa
transportowa

traffic control

vlc/scp

wlan0

eth0

traffic control

vlc/scp

router wifi

background image

wysyłanie lub odbieranie wiadomości. Klient może zadecydować w jaki sposób wiadomości

będą przesłane do drugiego klienta poprzez podanie priorytetu wiadomości.

Oprócz wiadomości przesyłanych między klientami, może być dodatkowo wygenerowany

ruch podkładowy między komputerami, za pomocą uruchomionych aplikacji vlc lub scp. Oba

typy ruchu opisane są w kolejnych podrozdziałach.

Ruch podkładowy i sygnał generowany przez klienta jest wspólnie kolejkowany

w mechanizmie kształtowania ruchu (ang. traffic control). Mechanizm ten umożliwia

określenie maksymalnej przepływności ruchu wychodzącego przez interfejs i innych

parametrów związanych z kształtowaniem ruchu, np. maksymalnej długości bufora.

Mechanizm kształtowania ruchu może być też wyłączony. Wtedy pakiety kolejkowane są

w kolejce typu fifo o bardzo dużej długości. Mechanizm kształtowania ruchu jest

szczegółowo opisany w dalszym podrozdziale.

73

background image

6.2 Program scp

Przygotowano dwa rodzaje ruchu podkładowego. Jeden generowany przez przesyłanie

poleceniem scp dużego pliku, drugi polega na strumieniowaniu transmisji wideo. Ruch

podkładowy ma symulować rzeczywistą sytuację, w której różne aplikacje generują pakiety

wysyłane i odbierane przez protokół IPv6. Typy ruchu wybrano tak, że są do siebie mało

podobne, jeżeli chodzi o charakterystykę wielkości pakietów i odstępów czasowych między

nimi. Transmisja pakietów nie jest symetryczna, czyli innej wielkości i w innej częstotliwości

wysyłane są pakiety od komputera 1 do komputera 2, a inna jest charakterystyka nadawania

danych od komputera 2 do komputera 1. Kierunek,w którym jest wykonywana transmisja

pliku lub strumienia wideo, będzie też nazywany jako „w przód”. Przeciwny kierunek będzie

nazywana jako „wstecz”.

Ruch podkładowy pierwszego rodzaju był generowany za pomocą polecenia scp. Przesyłany

był duży plik około 700MB, taki, żeby podczas testu transmisja pliku nie zakończyła się.

Przykładowe polecenie, które generowało ruch:

scp kamil@[fec0::1:3]:~/Videos/plik.avi ./

Kierunek przesyłania pliku – charakterystyka ruchu.

Przeprowadzono 1 test. Wyniki przedstawiono w Tab. 6

Tab. 6: Ruch scp; Kierunek „w przód”

mierzony okres czasu [s]

11.00

minimalny odstęp czasu pomiędzy pakietami [s]

0.0

maksymalny odstęp czasu pomiędzy pakietami [s]

0.300

wartość średnia odstępu czasu [s]

0.001

odchylenie standardowe odstępu czasu

0.006

liczba pakietów

9464

minimalna wielkość pakietu [b]

92

maksymalna wielkość pakietu [b]

1460

wartosc średnia wielkości pakietu [b]

1418.7

odchylenie standardowe wielkości pakietu

239.4

lista numerów protokołów

6

liczba pakietów protokołu: 6 (TCP)

9464

74

background image

Na Rys. 25 – Rys. 28 przedstawiono, wspólnie dla ruchu scp i vlc, wykresy wielkości

pakietów, odstępu między wiadomościami, histogram wielkości pakietów, histogram odstępu

między wiadomościami.

Ruch w kierunku przesyłania pliku składa się w większości z plików o wielkości 1460 bajtów.

Poza tym rzadziej występują pliki o wielkości 32 bajty. Odstęp pomiędzy pakietami jest

bardzo mały dla 80% pakietów jest to poniżej 1ms. Średnia liczba pakietów przypadających

na 1 sekundę wyniosła 864. Wszystkie pakiety były pakietami protokołu TCP (numer 6).

Kierunek przeciwny do przesyłania pliku – charakterystyka ruchu.

Przeprowadzono 1 test. Wyniki przedstawiono w Tab 7.

Tab. 7: Ruchu scp; Kierunek „wstecz”

mierzony okres czasu [s]

10.9

minimalny odstęp czasu pomiędzy pakietami [s]

0.0

maksymalny odstęp czasu pomiędzy pakietami [s]

0.303

wartość średnia odstępu czasu [s]

0.002

odchylenie standardowe odstępu czasu

0.008

liczba pakietów

6505

minimalna wielkość pakietu [b]

32

maksymalna wielkość pakietu [b]

92

wartosc średnia wielkości pakietu [b]

37.00

odchylenie standardowe wielkości pakietu

8.15

lista numerów protokołów

6

liczba pakietów protokołu: 6 (TCP)

6505

Ruch przeciwny do kierunku przesyłania pliku składa się z pakietów o wielkości poniżej 100

bajtów. Średnio przesyłanych jest 591 pakietów na sekundę, co jest nie dużo mniej niż średnia

liczba pakietów przesyłanych w kierunku przesyłania pliku. Odstęp pomiędzy większością

pakietów to około 1ms.

6.3 Program vlc

Drugi typ ruchu podkładowego był generowany przez strumieniowanie pliku dźwiękowego

w formacie mp3. Długość pliku dobrano w taki sposób, aby czas odtwarzania był większy niż

75

background image

czas trwania testu. Do strumieniowania wykorzystano program vlc, w wersji 1.0.6, należący

do standardowej dystrybucji systemu Linux Mandriva 2010. Na jednym z komputerów

uruchamiane było strumieniowanie pliku do drugiego komputera. Na drugim odbierano

strumień danych.

Parametry strumieniowania:

protokół RTP, port 5004

dodatkowe opcje:
:sout=#transcode{vcodec=mp2v,vb=800,scale=1,acodec=mpga,ab=128,channels=2,sa
mplerate=44100}

Kierunek przesyłania transmisji ścieżki dźwiękowej – charakterystyka ruchu.

Przeprowadzono 1 test. Wynki przedstawiono w Tab. 8.

Tab. 8: Ruch vlc; Kierunek „w przód”

mierzony okres czasu [s]

259.94

minimalny odstęp czasu pomiędzy pakietami [s]

0.0001

maksymalny odstęp czasu pomiędzy pakietami [s]

0.070

wartość średnia odstępu czasu [s]

0.056

odchylenie standardowe odstępu czasu

0.005

liczba pakietów

4654

minimalna wielkość pakietu [b]

32

maksymalna wielkość pakietu [b]

1336

wartosc średnia wielkości pakietu [b]

1326.95

odchylenie standardowe wielkości pakietu

107.04

lista numerów protokołów

17,58

liczba pakietów protokołu: 17 (UDP)

4647

liczba pakietów protokołu: 58 (ICMPv6)

7

Ruch w kierunku przesyłania ścieżki dźwiękowej, składa się w większości z pakietów, o

wielkości 1336 bajtów. Czasem występują pliki o wielkości 32 bajty. Odstęp pomiędzy

pakietami jest mały i wynosi dla większości pakietów 56ms. Średnia liczba pakietów

przypadających na 1 sekundę wyniosła 18. Przesyłane pakiety były pakietami protokołu UDP

(17).

Kierunek przeciwny do przesyłania transmisji ścieżki dźwiękowej – charakterystyka ruchu.

76

background image

W kierunku przeciwnym do strumieniowania pliku dźwiękowego, nie jest generowany żadny

ruch sieciowy przez aplikację vlc.

77

background image

Ruch scp; Kierunek „w przód”

Ruch scp; Kierunek „wstecz”

Ruch vlc; Kierunek „w przód”

Rys. 25: Wykres ruchu scp i vlc – wielkość pakietów
legenda wykresów: oś pionowa – wielkość pakietu [b], oś pozioma – numer pakietu

Ruch scp; Kierunek „w przód”

Ruch scp; Kierunek „wstecz”

78

background image

Ruch vlc; Kierunek „w przód”

Rys. 26: Wykres ruchu scp i vlc – odstęp między pakietami
legenda wykresów: oś pionowa – odstęp pomiędzy kolejnymi pakietami [s], oś pozioma –
numer pakietu

Ruch scp; Kierunek „w przód”

Ruch scp; Kierunek „wstecz”

Ruch vlc; Kierunek „wprzód”

79

background image

Rys. 27: Ruch scp i vlc – histogram wielkości pakietów
legenda wykresów: oś pionowa – liczba pakietów, oś pozioma – wielkość pakietu [b]

Ruch scp; Kierunek „w przód”

Ruch scp; Kierunek „wstecz”

Ruch vlc; Kierunek „w przód”

Rys. 28: Ruch scp i vlc – histogram odstępu
legenda wykresów: oś pionowa – liczba pakietów, oś pozioma – odstęp czasu pomiędzy
kolejnymi pakietami [s]

6.4 Mechanizm kształtowania ruchu

Mechanizm kształtowania ruchu (ang. traffic control) [7], dostępny w systemie Linux jako

polecenie tc, zostanie wykorzystany w pracy do symulowania obciążenia połączenia między

komputerami. Symulacja obciążenia będzie polegała głównie na określeniu maksymalnej

80

background image

przepływności, na interfejsie wyjściowym karty sieciowej. Przeprowadzenie testów

w sytuacji, gdy łącza pomiędzy komputerami są obciążone, będzie umożliwiało sprawdzenie,

jak zachowa się mechanizm przesyłania wiadomości, w nagłówkach hop-by-hop, w takich

warunkach. Stworzony mechanizm będzie dzięki temu lepiej przetestowany i będzie można

zauważyć jego mocne i słabe strony.

Polecenie tc udostępnia kilka różnych mechanizmów kształtowania ruchu sieciowego,

opartych na różnych modelach teoretycznych. Do testów wybrano strukturę wykorzystującą

typ kolejkowania typu wiadra żetonów (ang. tocken bucket).

Rys. 29: Mechanizm wiadra żetonów

Mechanizm wiadra żetonów, przedstawiony na Rys. 29, jest modelowany jako dwie kolejki.

Jedna kolejka jest zasilana ze stałą częstotliwością żetonami, do drugiej kolejki wpadają

pakiety oczekujące na wysłanie. Jeżeli kolejka z żetonami zawiera żeton, określona porcja

danych może zostać wysłana. Żeton po użyciu, zostaje skasowany z kolejki z żetonami.

Maksymalna prędkość tak sterowanego interfejsu jest proporcjonalna do szybkości

napływania żetonów do kolejki. Ważnymi parametrami jest także pojemność kolejki na

żetony i długość kolejki z pakietami oczekującymi na wysłanie. Jeżeli kolejka z żetonami jest

zapełniona, wtedy możliwe jest, przy szybkim napływie pakietów, wysłanie większej liczby

pakietów. Chwilowa szybkość jest większa od średniej szybkości. Przekłada się to na

parametr ruchu o angielskiej nazwie burstiness. Jeżeli długość kolejki z żetonami jest duża,

wtedy możliwe są krótkotrwałe, duże paczki pakietów i przekroczenie chwilowe średniej

szybkości na interfejsie. Kolejnym ważnym parametrem jest długość kolejki z pakietami

oczekującymi na żetony. Jeżeli kolejka jest długa, wtedy jest większa szansa, że pakiet

zostanie wysłany, ale średnia wartość opóźnienia będzie większa.

81

żetony

pakiety

bufor

wiadro
żetonów

background image

Za pomocą polecenia tc dostępnego w systemie Linux, tworzona jest struktura, której

elementy stanowią klasy ruchu charakteryzujące się innymi parametrami. Przykładowy

zestaw komend przedstawiono w Tab. 9.

Tab. 9: Parametry kształtowania ruchu. Przykład.

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev wlan0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev wlan0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb
latency 70ms peakrate 200kbit minburst 1540
tc filter add dev wlan0 parent 1: protocol ipv6 prio 16 u32 match ip6 src
fec0::1:2 flowid 1:11

Potencjalny ruch przechodzący przez interfejs wlan0 jest dzielony na dwie klasy

z wykorzystaniem hierarchicznego wiadra żetonów (ang. hierarichcal token bucket, htb).

Stworzono dwie klasy. Pierwsza o szybkości 10Mbit, druga o szybkości 100kbit. Pod klasy

podpięte są mechanizmy kształtowania ruchu typu wiadra żetonów. Mechanizm wiadra

żetonów przyjmuje parametry:

rate – średnia szybkość ruchu – sterowanie częstotliwością napływania żetonów

burst – cecha ruchu burstiness – związana z długością kolejki na żetony

latency – maksymalny czas oczekiwania pakietu na wysłanie – związany z długością

kolejki na pakiety, parametr ten może być wymiennie stosowany z parametrem

określającym długość kolejki o nazwie limit

peakrate – parametr, który wprowadza ograniczenie szybkości wysyłania pakietów w

momencie wystąpienia efektu burstiness

minburst – parametr, który powinien być ustawiony na długość pakietu

Po stworzenie struktury z klasami i mechanizmami kształtowania ruchu konieczne jest jeszcze

stworzenie filtrów, które przekażą wybrane pakiety do stworzonego mechanizmu. Filtrować

pakiety można w różny sposób. Jednym z najprostszym jest stworzenie warunków

obejmujących adres źródłowy lub docelowy z nagłówka IPv4/IPv6. Wykorzystane zostało do

tego polecenie tc z parametrem filter i identyfikatorem mechanizmu sterującego ruchem.

W podanym przykładzie w komputerze 1 wszystkie pakiety mające w nagłówku IPv6 adres

82

background image

źródłowy fec0::1:2 będą kierowane do struktury o identyfikatorze 1:11, która jest

mechanizmem sterowania typu wiadra żetonów. Struktura utworzona poleceniami tc

przedstawiona jest na Rys. 30. Wszystkie pakiety wychodzące przez interfejs wlan0

przechodzą przez elementy struktury. Te spełniające warunek filtru trafiają do klasy 1:11,

która wprowadza ograniczenie do 100kbit.

Rys. 30: Struktura kształtowania ruchu; Przykład

83

Class 1:11

root htb

class 1:1

filter

wlan0

tbf

tak

nie

background image

7. Testy akceptacyjne.

W rozdziale zdefiniowano listę testów akceptacyjnych, które mają sprawdzić, czy

zaprojektowane funkcje programu testowego działają poprawnie. Wszystkie testy zakończyły

się sukcesem.

84

background image

7.1 Środowisko testowe

Do testów akceptacyjnych zostało wykorzystane środowisko testowe przedstawione

w rodziale 6.1.

7.2 Scenariusze testów akceptacyjnych.

Scenariusze testów akceptacyjnych dobrano tak, żeby przetestować wszystkie typy sygnałów,

generowanych przez aplikację kliencką i wszystkie priorytety dostarczenia wiadomości przez

warstwę transportową. Testy parmetryzacji typów ruchu i priorytu numer 2 zrealizowano

w ramach bardziej szczegółowych testów warstwy transportowej.

1. Uruchomienie warstwy transportowej

Wykonywane czynności:

1. Uruchomić program warstwy transportowej.

Oczekiwany wynik:

Program warstwy transportowej jest widoczny

jako proces w systemie.

2. Uruchomienie aplikacji klienckiej

Wykonywane czynności:

1. Uruchomić aplikację kliencką.

Oczekiwany wynik:

Aplikacja kliencka jest widoczna jako proces

w systemie. Wyświetlił się graficzny interfejs

użytkownika.

3. Podłączenie aplikacji klienckiej do warstwy transportowej

Wykonywane czynności:

1. Włączyć aplikację warstwy transportowej.

2. Włączyć aplikację kliencką.

3. Podłączyć aplikację kliencką do procesu warstwy

transportowej.

Oczekiwany wynik:

Połączenie aplikacji klienckiej z warstwą transportową

jest zaraportowane w logach aplikacji klienckiej

i warstwy transportowej.

4. Przesłanie przez warstwę transportową ruchu o typie no-delay i priorytecie 2

85

background image

Wykonywane czynności:

1. Włączyć aplikację warstwy transportowej na dwóch

komputerach. Parametr priorytetu 2 ustawić na wartość

0.1s.

2. Włączyć aplikację kliencką na obu komputerach.

3. Podłączyć aplikację kliencką do procesu warstwy

transportowej w komputerze, który będzie wysyłał

wiadomości.

4. Podłączyć aplikację kliencką do procesu warstwy

transportowej na drugim komputerze.

5. Wysłać z aplikacji klienckiej na pierwszym

komputerze ruchu typu no-delay do aplikacji klienckiej

na drugim komputerze z priorytetem 2.

Oczekiwany wynik:

Ruch typu no-delay został odebrany w aplikacji

klienckiej na drugim komputerze. Moment wysłania

i odebrania jest zalogowany w plikach client1.txt

i client2.txt

5. Przesłanie przez warstwę transportową ruchu o typie no-delay i priorytecie 1

Wykonywane czynności:

1. Włączyć aplikację warstwy transportowej na dwóch

komputerach.

2. Włączyć aplikację kliencką na obu komputerach.

3. Podłączyć aplikację kliencką do procesu warstwy

transportowej w komputerze, który będzie wysyłał

wiadomości.

4. Podłączyć aplikację kliencką do procesu warstwy

transportowej na drugim komputerze.

5. Wysłać z aplikacji klienckiej na pierwszym

komputerze ruch typu no-delay wybierając priorytet 1.

6. Wygenerować ruch między komputerami np.

poleceniem scp.

86

background image

Oczekiwany wynik:

Ruch składający się z wielu wiadomości został odebrany

w aplikacji klienckiej na drugim komputerze.

Wiadomości zostały przesłane w nagłówkach hop-by-

hop pakietów IPv6 co widać w programi Wireshark.

Moment wysłania i odebrania jest zalogowany w plikach

client1.txt i client2.txt

6. Przesłanie przez warstwę transportową ruchu o typie constant i priorytecie 2

Wykonywane czynności:

1. Włączyć aplikację warstwy transportowej na dwóch

komputerach. Parametr priorytetu 2 ustawić na wartość

0.1s.

2. Włączyć aplikację kliencką na obu komputerach.

3. Podłączyć aplikację kliencką do procesu warstwy

transportowej w komputerze, który będzie wysyłał

wiadomości. Parametr ruchu constant ustawić na 0.01s.

4. Podłączyć aplikację kliencką do procesu warstwy

transportowej na drugim komputerze.

5. Wysłać z aplikacji klienckiej na pierwszym

komputerze ruch typu constant wybierając priorytet 2.

Oczekiwany wynik:

Ruch składający się z wielu wiadomości został odebrany

w aplikacji klienckiej na drugim komputerze.

Wiadomości zostały przesłane w nagłówkach hop-by-

hop pakietów IPv6 co widać w programi Wireshark.

Wygenerowane zostały dodatkowe pakiety co widać

w programie Wirshark. Moment wysłania i odebrania

jest zalogowany w plikach client1.txt i client2.txt

7. Przesłanie przez warstwę transportową ruchu o typie snmp-like i priorytecie 4

Wykonywane czynności:

1. Włączyć aplikację warstwy transportowej na dwóch

komputerach. Parametr priorytetu 2 ustawić na wartość

0.1s.

87

background image

2. Włączyć aplikację kliencką na obu komputerach.

Parametr ruchu snmp-like oznaczający odległość między

wiadomościami w serii ustawić na 0.006s. Parametry

ruchu snmp-like oznaczające czas między seriami

ustawić na 1s i 2s.

3. Podłączyć aplikację kliencką do procesu warstwy

transportowej w komputerze, który będzie wysyłał

wiadomości.

4. Podłączyć aplikację kliencką do procesu warstwy

transportowej na drugim komputerze.

5.Wysłać z aplikacji klienckiej na pierwszym

komputerze ruch typu constant wybierając priorytet 2.

Oczekiwany wynik:

Ruch składający się z wielu wiadomości został odebrany

w aplikacji klienckiej na drugim komputerze.

Wiadomości zostały przesłane w nagłówkach hop-by-

hop pakietów IPv6 co widać w programi Wireshark.

Wygenerowane zostały dodatkowe pakiety co widać w

programie Wirshark. Moment wysłania i odebrania jest

zalogowany w plikach client1.txt i client2.txt

8. Zalogowanie różnicy pomiędzy wysłaniem i odebraniem wiadomości ruchu o typie random

przesyłanych przez warstwę transportową z priorytetem 3.

Wykonywane czynności:

1. Włączyć aplikację warstwy transportowej na dwóch

komputerach.

2. Włączyć aplikację kliencką na obu komputerach.

3. Podłączyć aplikację kliencką do procesu warstwy

transportowej w komputerze, który będzie wysyłał

wiadomości. Parametry ruchu random oznaczające czas

między wiadomościami ustawić na 0.01s i 1s.

4. Podłączyć aplikację kliencką do procesu warstwy

transportowej na drugim komputerze.

88

background image

5. Wysłać z aplikacji klienckiej na pierwszym

komputerze ruch typu random wybierając priorytet 3.

Oczekiwany wynik:

Ruch składający się z wielu wiadomości został odebrany

w aplikacji klienckiej na drugim komputerze.

Wiadomości zostały przesłane w nagłówkach hop-by-

hop pakietów IPv6 co widać w programi Wireshark.

Wygenerowane zostały dodatkowe pakiety co widać w

programie Wireshark. Moment wysłania i odebrania jest

zalogowany w plikach client1.txt i client2.txt. W plikach

client1.txt i client2.txt można znaleźć odpowiadające

sobie wiadomości, gdyż zawartość wiadomości zawiera

numer porządkowy.

9. Wygenerowanie ruchu podkładowego z wykorzystaniem polecenia scp między

komputerami.

Wykonywane czynności:

1. Skonfigurować dwa komputery, tak by miały adresy

IPv6 należące do tej samej podsieci.

2. Wygenerować ruch pakietów między komputerami

przesyłając plik scp pomiędzy komputerami.

Oczekiwany wynik:

W programie Wireshark widać wysyłane pakiety

pomiędzy komputerami.

10. Wygenerowanie ruchu podkładowego między komputerami z wykorzystaniem programu

vlc.

Wykonywane czynności:

1. Skonfigurować dwa komputery, tak by miały

adresy IPv6 należące do tej samej podsieci.

2. Uruchomić streaming pliku dźwiękowego

między komputerami.

Oczekiwany wynik:

W programie Wireshark widać wysyłane pakiety

pomiędzy komputerami.

89

background image

Przeprowadzono zaprojektowane testy akceptacyjne. Wszystkie scenariusze zakończyły się

sukcesem. Szczegółowe testy parametryzacji typów ruchu i sygnałów generowanych przez

aplikację kliencką zrealizowano w ramach oddzielnych testów skoncentrowanych na

parametrach czasowych warstwy transportowej.

90

background image

8. Testy wydajności i opóźnienia

W testach wydajności użyto klienta generującego sygnału typu no-delay. Wiadomości są

generowane tak szybko, jak szybko warstwa transportowa odeśle potwierdzenie o przyjęciu

wiadomości do wysłania. Testy przeprowadzono dla priorytetu 3 i priorytetu 4, które

z założenia mają wproawdzać minimalne możliwe opóźnienie w przesłaniu wiadomości. Dla

priorytetu numer 4 zastosowano oba mechanizmy potwierdzenia. Sposób potwierdzenia

pierwszego typu w większym stopniu ogranicza szybkość generowania sygnałów przez

klienta.

Sprawdzono opóźnienie wprowadzane przez warstwę transportową działającą z priorytetem 2,

priorytetem 3 i priorytetem 4. Wykorzystano wyniki badań wydajności warstwy

transportowej. W testach dla priorytetu 3 i 4 wykorzystano sygnał typu constant. Testy

priorytetu 2 przeprowadzono także dla sygnałów snmp-like i random. Nie przeprowadzono

badania opóźnienia wprowadzanego przez priorytet 1, gdyż ten typ transportu opiera się na

ruchu podkładowym, którego nie generowano.

Na Rys. 31 – Rys. 33 przedstawiono, wspólnie dla testów wydajności i opóźnienia, wykresy

opóźnienia w dostarczeniu wiadomości, histogramu opóźnienia, histogram odstępu między

wiadomościami.

91

background image

8.1 Test w. 1. Priorytet 3.

Tab. 10: Test w. 1; Priorytet 3; Parametry kształtowania ruchu.

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 - Qos

Brak ograniczeń

Komputer 2 - Qos

Brak ograniczeń

Tab. 11: Test w. 1; Priorytet 3; Parametry przesyłanego sygnału

Generowany sygnał

no-delay

Kierunek generowanego sygnału

Z komputera 1 do komputera 2.

Parametry sygnału

Generowanie następnej wiadomości po
potwierdzeniu od warstwy transportowej.

Tab. 12: Test w. 1; Priorytet 3; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 3

Parametry warstwy transportowej

Maksymalna długość pakietu do którego
można dokleić nagłówek: 1360

Dodatkowe parametry

Brak

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami

Wyniki testu.

Liczba wysłanych wiadomości: 10000,10000,10000

Liczba odebranych wiadomości: 10000,10000,10000

Czas nadania wiadomości przez klienta nadawcę: 12.936s,12.986s,13.09s

Średni odstęp pomiędzy nadawanymi wiadomościami (z 3 eksperymentów):
1.3ms

Czas odebrania wszystkich wiadomości przez klienta odbiorcę:
15.762s,15.498s,15.896s

Średni odstęp pomiędzy odbieranymi wiadomościami (z 3 eksperymentów):
1.6ms

Średnia wartość opóźnienia: 2.88s,2.63s,2.85s

92

background image

W teście tym użyto wariant warstwy transportowej o priorytecie numer 3. Średnie opóźnienie

pomiędzy kolejnymi pakietami generowanymi przez klienta wyniosło 1.3ms. Średni odstęp

czasu pomiędzy odbieranymi wiadomościami, przez klienta odbierającego, wyniósł 1.6ms.

Warstwa transportowa osiągnęła dużą wydajność, ale opóźnienie jest bardzo duże. Średnie

opóźnienie warstwy transportowej z 3 testów wyniosło 2.79s. Warstwa transportowa

odbierająca nie była w stanie nadążyć nad prędkością nadawania pakietów przez warstwę

transportową po stronie klienta nadającego. Widać to dobrze na Rys. 31 na wykresie „Test w.

1; Priorytet 3”.

8.2 Test w. 2. Priorytet 4. Typ potwierdzenia 2.

Tab. 13: Test w. 2; Priorytet 4; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 - Qos

Brak ograniczeń

Komputer 2 - Qos

Brak ograniczeń

Tab. 14: Test w. 2; Priorytet 4; Parametry przesyłanego sygnału

Generowany sygnał

no-delay

Kierunek generowanego sygnału

Z komputera 1 do komputera 2.

Parametry sygnału

Generowanie następnej wiadomości po
potwierdzeniu od warstwy transportowej.

Tab. 15: Test w. 2; Priorytet 4; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 4

Parametry warstwy transportowej

Brak

Dodatkowe parametry

Drugi tryb pracy mechanizmu potwierdzenia.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami

93

background image

Wyniki testu.

Liczba wysłanych wiadomości: 10000,10000,10000

Liczba odebranych wiadomości: 10000,10000,10000

Czas nadania wiadomości przez klienta nadawcę: 12.744s,12.695s,12.682s

Średni odstęp pomiędzy nadawanymi wiadomościami: 1.3ms

Czas odebrania wiadomości przez klienta odbiorcę: 14.587s,14.686s,14.417s

Średni odstęp pomiędzy odbieranymi wiadomościami: 1.5ms

Średnia wartość opóźnienia: 1.74s,1.96s,1.22s

sdsd

W teście tym wykorzystano wariant warstwy transportowej o priorytecie numer 4 z

mechanizmem potwierdzenia drugiego typu. Średnie opóźnienie pomiędzy kolejnymi

pakietami generowanymi przez klienta wyniosło 1.3ms. Średni odstęp czasu pomiędzy

odbieranymi wiadomościami przez klienta odbierającego wyniósł 1.6ms. Warstwa

transportowa osiągnęła dużą wydajność, ale opóźnienie jest bardzo duże. Średnie opóźnienie

z 3 testów warstwy transportowej wyniosło 1.64s. Warstwa transportowa odbierająca nie była

w stanie nadążyć nad prędkością nadawania pakietów przez warstwę transportową po stronie

klienta nadającego. Widać to dobrze na Rys. 31 na wykresie „Test w. 2; Priorytet 4”.

8.3 Test w. 3. Priorytet 4. Typ potwierdzenia 1.

Tab. 16: Test w. 3; Priorytet 4; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 - Qos

Brak ograniczeń

Komputer 2 - Qos

Brak ograniczeń

Tab. 17: Test w. 3; Priorytet 4; Parametry przesyłanego sygnału

Generowany sygnał

no-delay

Kierunek generowanego sygnału

Z komputera 1 do komputera 2.

Parametry sygnału

Generowanie następnej wiadomości po
potwierdzeniu od warstwy transportowej.

94

background image

Tab. 18: Test w. 3; Priorytet 4; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 4

Parametry warstwy transportowej

Brak

Dodatkowe parametry

Pierwszy tryb pracy mechanizmu
potwierdzenia.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami

Wyniki testu.

Liczba wysłanych wiadomości: 10000,10000,10000

Liczba odebranych wiadomości: 10000,10000,10000

Średnia wartość opóźnienia:

Czas nadania wiadomości przez klienta nadawcę: 52.478s,51.63s,51.335s

Średni odstęp pomiędzy nadawanymi wiadomościami: 5.2ms

Czas odebrania wiadomości przez klienta odbiorcę: 52.475s,51.627s,51.332s

Średni odstęp pomiędzy odbieranymi wiadomościami: 5.2ms

Średnia wartość opóźnienia: 2.0ms,2.7ms,2.8ms

W teście tym użyto wariant warstwy transportowej, o priorytecie numer 4, z trybem

potwierdzenia pierwszego typu. Średnie opóźnienie pomiędzy kolejnymi pakietami

generowanymi przez klienta wyniosło 5.2ms, co widać na Rys. 33 na wykresie „Test w. 3;

Priorytet 4”. Jest to około 5 razy mniejsza wydajność w porównaniu do testu z mechanizmem

potwierdzenia drugiego typu i tym samym priorytetem. Jednak średnie opóźnienie przesłania

pakietu wyniosło 2.5ms. A w teście bez tego rodzaju potwierdzenia 2s. Jest to około 1000

razy mniejsze opóźnienie.

8.4. Test o. 1. Priorytet 2. Syg. Constant.

Warstwa transportowa jest w stanie dostarczać wiadomości klientowi odbierającemu bez

wprowadzania dodatkowego opóźnienia, jeżeli odstęp między wiadomościami jest nie

mniejszy niż 6ms. Dlatego do testów opóźnienia wykorzystano sygnał typu constant,

z odstępem czasu pomiędzy kolejnymi wiadomościami nie mniejszym niż 6 ms. Dodatkowo

95

background image

dla priorytetu 2 przeprowadzono testy opóźnienia dla sygnału typu random i sygnału typu

snmp-like. Priorytet 2 jest szczególnie interesujący, gdyż wykorzystuje przesyłany ruch, ale

także zapewnia maksymalne dopuszczalne opóźnienie wprowadzane przez warstwę

transportową.

Tab. 19: Test o. 1; Priorytet 2; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 - Qos

Brak ograniczeń.

Komputer 2 - Qos

Brak ograniczeń.

Tab. 20: Test o. 1; Priorytet 2; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 2 do komputera 1.

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami 6ms

Tab. 21: Test o. 1; Priorytet 2; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 2

Parametry warstwy transportowej

Maksymalne dopuszczalne opóźnienie 10ms.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba wysłanych wiadomości: 10000,10000,10000

Liczba odebranych wiadomości: 10000,10000,10000

Średnia wartość opóźnienia: 15ms,12ms,11ms

Histogram opóźnienia warstwy transportowej, przedstawiony na Rys. 32 na wykresie „Test

o. 1; Priorytet 2”, pokazuje, że opóźnienie dla większości pakietów mieściło się w zakresie

pomiędzy 5ms i 15ms, co jest dobrym wynikiem. Średnia wartość opóźnienia wyniosła w

trzech testach 13ms.

8.5 Test o. 2. Priorytet 3. Syg. Constant.

96

background image

Tab. 22: Test o. 2; Priorytet 3; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 - Qos

Brak ograniczeń.

Komputer 2 - Qos

Brak ograniczeń.

Tab. 23: Test opóźnienia 2; Priorytet 3; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 2 do komputera 1.

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami 6ms

Tab. 24: Test opóźnienia 2; Priorytet 3; Parametry warstwy transportowej;

Typ warstwy transportowa

Priorytet 3

Parametry warstwy transportowej

Maksymalna długość pakietu do którego
można dokleić nagłówek: 1360

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba wysłanych wiadomości: 10000,10000,10000

Liczba odebranych wiadomości: 10000,10000,10000

Średnia wartość opóźnienia: 5ms,5ms,6ms

Histogram opóźnienia warstwy transportowej, przedstawiony na Rys. 32 na wykresie „Test o.

2; Priorytet 3”, pokazuje, że opóźnienie dla większości pakietów było między 4ms i 7ms.

Średnia wartość opóźnienia wyniosła w trzech testach 5ms.

8.6 Test o. 3. Priorytet 4. Syg. Const.

Tab. 25: Test o. 3; Priorytet 4; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

97

background image

Komputer 1 - Qos

Brak ograniczeń.

Komputer 2 - Qos

Brak ograniczeń.

Tab. 26: Test o. 3; Priorytet 4; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 2 do komputera 1.

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami 6ms

Tab. 27: Test o. 3; Priorytet 4; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 4

Parametry warstwy transportowej

Drugi tryb pracy mechanizmu potwierdzenia.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba wysłanych wiadomości: 10000,10000,10000

Liczba odebranych wiadomości: 10000,10000,10000

Średnia wartość opóźnienia: 6ms,7ms,6ms

Histogram opóźnienia warstwy transportowej, przedstawiony na Rys. 32 na wykresie „Test o.

3; Priorytet 4”, pokazuje, że opóźnienie dla większości pakietów jest pomiędzy 5ms i 7ms.

Średnia wartość opóźnienia wyniosła w trzech testach 6ms.

8.7 Test o. 4. Priorytet 2. Syg. Random.

Tab. 28: Test o. 4; Priorytet 2; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 - Qos

Brak ograniczeń.

Komputer 2 - Qos

Brak ograniczeń.

Tab. 29: Test o. 4; Priorytet 2; Parametry przesyłanego sygnału

Generowany sygnał

random

98

background image

Kierunek generowanego sygnału

Z komputera 2 do komputera 1.

Parametry sygnału

Zakres generatora losowego odstępu czasu
0.015s – 0.025s

Tab. 30: Test o. 4; Priorytet 2; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 2

Parametry warstwy transportowej

Maksymalne dopuszczalne opóźnienie 20ms.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba wysłanych wiadomości: 3000,3000,3000

Liczba odebranych wiadomości: 3000,3000,3000

Średnia wartość opóźnienia: 19ms,20ms,17ms

Histogram opóźnienia warstwy transportowej, przedstawiony na Rys. 32 na wykresie „Test o.

4; Priorytet 2”, pokazuje, że opóźnienie dla większo ści pakietów mieściło się w zakresie

pomiędzy 5ms i 25ms, co jest dobrym wynikiem. Średnia wartość opóźnienia wyniosła w

trzech testach 19ms.

8.8 Test o. 5. Priorytet 2. Sygnał snmp-like.

Tab. 31: Test o. 5; Priorytet 2; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 - Qos Brak ograniczeń.

Komputer 2 - Qos Brak ograniczeń.

Tab. 32: Test o. 5; Priorytet 2; Parametry przesyłanego sygnału

Generowany sygnał

snmp-like

Kierunek generowanego sygnału

Z komputera 2 do komputera 1.

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami w
serii: 6ms.
Ilość wiadomości w serii: pomiędzy 10 i 100.

99

background image

Dłuższa przerwa pomiędzy seriami:
pomiędzy 0.5s i 1s.

Tab. 33: Test o. 5; Priorytet 2; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 2

Parametry warstwy transportowej

Maksymalne dopuszczalne opóźnienie 20ms.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba wysłanych wiadomości: 3000,3000,3000

Liczba odebranych wiadomości: 3000,3000,3000

Średnia wartość opóźnienia: 22ms,21ms,19ms

Histogram opóźnienia warstwy transportowej, przedstawiony na Rys. 32 na wykresie „Test o.

5; Priorytet 2”, pokazuje, że opóźnienie dla większości pakietów mieściło się w zakresie

pomiędzy 5ms i 30ms, co jest dobrym wynikiem. Średnia wartość opóźnienia wyniosła w

trzech testach 21ms.

8.9 Podsumowanie testów wydajności i opóźnienia.

Przeprowadzone testy dla sygnału typu no-delay i warstwy transportowej pracującej

z priorytetem 3 i priorytetem 4, z mechanizmem potwierdzenia typu drugiego pokazały, że

szybkość wysyłania wiadomości dla priorytetu 3 wynosi około 770 wiadomości/s, a dla

priorytetu 4 wynosi około 790 wiadomości/s. Jednak z taką szybkością nie jest wstanie

pracować warstwa transportowa po stronie klienta odbierającego wiadomości. Wydajność

przekazywania pakietów klientowi odbierającemu, dla priorytetu 3, wyniosła 640

wiadomości/s, a dla priorytetu 4 wyniosła 690 wiadomości/s. Mniejsza wydajność po stronie

odbiorcy powoduje powstanie dużego opóźnienia w dostarczeniu wiadomości. Testy pokazały

też, że wydajność warstwy transportowej, przesyłającej wiadomości w nagłówkach hop-by-

hop (priorytet 3) i w protokole UDPv6 (priorytet 4 z mechanizmem potwierdzenia drugiego

rodzaju) są do siebie bardzo zbliżone.

Wynik opóźnienia jaki uzyskano z wykorzystaniem sygnału typu no-delay i warstwy

transportowej pracującej z priorytetem 4, z mechanizmem potwierdzenia typu pierwszego

100

background image

pokazały, że wydajność warstwy transportowej, gwarantujące minimalne opóźnienie

w dostarczeniu wiadomości do klienta odbiorcy będzie zapewnione, gdy wiadomości będą

generowane nie częściej niż co 6ms. Taki odstęp czasu równoznaczny jest przesyłaniu

wiadomości z szybkością 167 wiadomości/s.

Testy opóźnienia warstwy transportowej pracującej z priorytetem 3 i 4 pokazały,

że opóźnienie dla większości pakietów jest pomiędzy 4ms i 6ms. Najciekawsze są wyniki

testów opóźnienia wprowadzanych przez warstwę transportową o priorytecie 2.

Przetestowano ją generując sygnały trzech typów: typu constant, typu random i typu snmp-

like. Dla wszystkich tych typów sygnałów, warstwa zapewniła dla większości pakietów

opóźnienie pomiędzy 5ms i 30ms. Parametr maksymalnego opóźnienia był ustawiony na

20ms. Wynika z tego, że warstwa spełnia zakładane parametry czasowe, ale trzeba pamiętać,

że maksymalne opóźnienie będzie większe o około 10ms, w porównaniu z ustawionym.

101

background image

Test w. 1; Priorytet 3

Test w. 2; Priorytet 4

Test w. 3; Priorytet 4

Test o. 1; Priorytet 2

Test o. 2; Priorytet 3

Test o. 3; Priorytet 4

102

background image

Test o. 4; Priorytet 2

Test o. 5; Priorytet 2

Rys. 31: Wykres opóźnienia – testy opóźnienia
legenda wykresów: oś pionowa – opóźnienie dostarczenia wiadomości [s], oś pozioma –
numer wiadomości

Test w. 1; Priorytet 3

Test w. 2; Priorytet 4

103

background image

Test w. 3; Priorytet 4

Test o. 1; Priorytet 2

Test o. 2; Priorytet 3

Test o. 3; Priorytet 4

Test o. 4; Priorytet 2

Test o. 5; Priorytet 2

Rys. 32: Histogram opóźnienia – testy opóźnienia
legenda wykresów: oś pionowa – liczba wiadomości, oś pozioma – opóźnienie dostarczenia
wiadomości [s]

104

background image

Test w. 1; Priorytet 3

Test w. 2; Priorytet 4

Test w. 3; Priorytet 4

Test o. 1; Priorytet 2

Test o. 2; Priorytet 3

Test o. 3; Priorytet 4

105

background image

Test o. 4; Priorytet 2

Test o. 5; Priorytet 2

Rys. 33: Histogram odstępu – testy opóźnienia
legenda wykresów: oś pionowa – liczba wiadomości, oś pozioma – odstęp czasu pomiędzy
kolejnymi wiadomościami [s]

106

background image

9. Testy przesyłania danych.

Ten rozdział prezentuje wyniki szczegółowych testów warstwy transportowej w sytuacji, gdy

między komputerami jest przesyłany ruch sieciowy. Ma to symulować rzeczywisty scenariusz

wykorzystania warstwy transportowej. Testy od 1-7 były prowadzone z ruchem podkładowym

generowanym przez polecenie scp. Testy od 8-15 były prowadzone z ruchem podkładowym

generowanym przez strumieniowanie pliku dźwiękowego programem vlc. Dodatkowo

zastosowano mechanizm kształtowania ruchu, z wykorzystaniem polecenia tc, którego

wykorzystanie ma symulować sytuację niewystarczającej przepustowości łącza i

współzawodnictwo o dostęp do pasma.

Decydując o kształcie testów podjęto decyzję o parametrach takich jak priorytet przesyłania

wiadomości przez warstwę transportową, parametry mechanizmu kształtowania ruchu, czy

typ przesyłanego sygnału. Po pierwsze, celem było zaprezentowanie wszystkich możliwych

typów sygnału oprócz sygnału no-delay, zaprezentowanie wszystkich typów priorytetów

przesyłania ruchu oraz wpływu mechanizmu kształtowania ruchu na parametry czasowe

przesyłania wiadomości.

Testy zaprojektowano tak aby można wyodrębnić dwie grupy różniące się ustawionymi

parametrami kształtowania ruchu. Pierwsza grupa to testy, w których mechanizm

kształtowania ruchu nie spowodował wysycenia przepustowości. Do tej grupy należą testy

numer 1, 2, 3, 8, 9, 10, 11, 12 i 13. Druga grupa to testy, w których mechanizm kształtowania

ruchu był tak skonfigurowany by zasymulować współzawodnictwo o przepustowość łącza.

Do tej grupy należą testy numer 4, 5, 6, 7, 14 i 15.

Projektując parametry testów 1, 2 i 10 chciano pokazać parametry czasowe opóźnienia

w dostarceniu wiadomości, przy zastosowaniu priorytetu 1.

Kolejną cechą, która jest widoczna w wynikach testów, to wpływ długości bufora na

oszczędność wynikającą z wykorzystania przesyłanych pakietów przez interfejs sieciowy dla

priorytetu numer 2. Szczególnie widoczne jest to przy porównaniu wyników testów 8 i 9.

Celem testów 11, 12 i 13 było porównanie szybkości przesyłania wiadomości przez priorytety

2, 3 i 4.

Grupa testów 4, 5, 6 i 7 służy pokazaniu jak mechanizm kształtowania ruchu wpływa na

kształt generowanego sygnału, z powodu wbudowanej funkcji ponawiania wysyłki pakietów,

107

background image

które zostały odrzucone z kolejki oczekujących na wysłanie. Porównanie dotyczy priorytetów

2 i 4. Zbadano również wpływ długości bufora mechanizmu kształtowania ruchu.

Testy 14 i 15 służa porównaniu priorytetów 3 i 4 w sytuacji wysycenia pasma transmisyjnego.

Największą liczbę testów przeprowadzono dla priorytetu 2, gdyż jest on najciekawszym

z dostępnych sposobów przesyłania danych przez warstwę transportową.

Na Rys. 34 – Rys. 39 przedstawiono, wspólnie dla testów przesyłania ruchu, wykresy

dystrybuanty opóźnienia w dostarczeniu wiadomości, wykres opóźnienia, statystyki

transmisji, histogram opóźnienia, wykres sygnału, histogram odstępu między generowanymi

wiadomościami sygnału. Nie dla wszystkich 15 testów przesyłania, zamieszczono wszystkie

typy wykresów, lecz wybrano te, które uznano za szczególnie dobrze prezentujące

charakterystykę wyniku testu.

108

background image

9.1 Test p. 1. Priorytet 1. Scp. Syg. random.

Tab. 34: Test p. 1; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev wlan0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev wlan0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb
latency 70ms peakrate 200kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 35: Test p. 1; Parametry ruchu podkładowego

Generator ruchu

Przesyłanie dużego pliku z komputera 1 do
komputera 2 za pomocą protokołu scp.

Charakterystyka ruchu

Opis w rozdziale 6.2

Tab. 36: Test p. 1; Parametry przesyłanego sygnału

Generowany sygnał

random

Kierunek generowanego sygnału

Z komputera 2 do komputera 1.

Parametry sygnału

Zakres odstępu czasu 0.08s – 0.18s

Tab. 37: Test p. 1; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 1

Parametry warstwy transportowej

Maksymalna długość pakietu do którego
można dokleić nagłówek: 1360 bajtów.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

109

background image

Dystrybuanta opóźnienia, przedstawiona na Rys. 34, na wykresie „Test p. 1”, jest liniowa

w początkowym fragmencie, pomiędzy 10ms i 150ms. W końcowym fragmencie wykres

dystrybuanty się wypłaszcza, jest niewielka grupa pakietów, których opóźnienie jest

pomiędzy 150ms i 300ms. Wynika to z faktu, że ruch podkładowy jest regularny, a

generowany sygnał ma charakter losowy. Losowe są odstępy czasu pomiędzy kolejnymi

wiadomościami. Dystrybuanta przesyłanego sygnału ma liniowy wykres w obszarze od 0.08s

do 0.18s. Mimo pewnego opóźnienia średnia intensywność ruchu podkładowego jest większa

niż intensywność generowanego sygnału, gdyż opóźnienie nie rośnie liniowo wraz

upływającym czasem od rozpoczęcia generowania sygnału.

9.2 Test p. 2. Priorytet 1. Scp. Syg. random rzadki.

Tab. 38: Test p. 2; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev wlan0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev wlan0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb
latency 70ms peakrate 200kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 39: Test p. 2; Parametry ruchu podkładowego

Generator ruchu

Przesyłanie dużego pliku z komputera 1 do
komputera 2 za pomocą protokołu scp.

Charakterystyka ruchu

Opis w rozdziale 6.2

Tab. 40: Test p. 2; Parametry przesyłanego sygnału

110

background image

Generowany sygnał

random

Kierunek generowanego sygnału

Z komputera 2 do komputera 1.

Parametry sygnału

Zakres odstępu czasu 0.26s - 0.32s

Tab. 41: Test p. 2; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 1

Parametry warstwy transportowej

Maksymalna długość pakietu do którego
można dokleić nagłówek: 1360 bajtów.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Test różni się od testu 1 tylko parametrem generatora sygnału. Zakres losowanego odstępu

czasu wynosi pomiędzy 0.26s i 0.32s, podczas gdy w teście 1 wynosił od 0.08s do 0.18s.

Opóźnienie warstwy transportowej, czyli czas od wysłania do odebrania sygnału wynosi od

bardzo małej wartości bliskiej zeru do około 120ms. Dystrybuanta opóźnienia, przedstawiona

na Rys. 34, na wykresie „Test p. 2”, jest liniowa w tym zakresie. W porównaniu z testem 1,

dystrybuanta zachowała liniowy charakter w całym zakresie. Wynikło to ze zwiększenia

odstępu czasu pomiędzy kolejnymi wiadomościami. Ruch podkładowy był wystarczająco

regularny i intensywny, żeby bufor oczekujących na wysłanie wiadomości był bardzo szybko

opróżniany.

9.3 Test p. 3. Priorytet 2. Scp. Syg. const. Kier. przeciwny.

Tab. 42: Test p. 3; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev wlan0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev wlan0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb

111

background image

latency 70ms peakrate 200kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 43: Test p. 3; Parametry ruchu podkładowego

Generator ruchu

Przesyłanie dużego pliku z komputera 1 do
komputera 2 za pomocą protokołu scp.

Charakterystyka ruchu

Opis w rozdziale 6.2

Tab. 44: Test p. 3; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 1 do komputera 2

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami
50ms

Tab. 45: Test p. 3; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 2

Parametry warstwy transportowej

Maksymalne dopuszczalne opóźnienie 25ms

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba dodatkowo wygenerowanych pakietów: 2649,2697,2649

Liczba odebranych wiadomości: 3000,3000,3000

Opóźnienie dla prawie wszystkich pakietów jest mniejsze niż 35ms, co jest bardzo dobrym

wynikiem. Warstwa transportowa miała zapewnić opóźnienie nie większe niż około 50ms,

jednak ruch podkładowy był wystarczająco intensywny, żeby opóźnienie okazało się jeszcze

mniejsze. Liczba wygenerowanych dodatkowo pakietów to średnio 2665. Liczba wiadomości,

112

background image

która została przesłana wynosi 3000. Oznacza to, że oszczędność dzięki wykorzystaniu ruchu

podkładowego wyniosła 365 na 3000 pakietów, co wynosi około 12%.

9.4 Test p. 4. Priorytet 2. Scp. Syg. const. Kier. zgodny.

Tab. 46: Test p. 4; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev wlan0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev wlan0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb
latency 70ms peakrate 200kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 47: Test p. 4; Parametry ruchu podkładowego

Generator ruchu

Opis w rozdziale 6.2

Charakterystyka ruchu

Tab. 48: Test p. 4; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 1 do komputera 2

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami
50ms

Tab. 49: Test p. 4; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 2

Parametry warstwy transportowej

Maksymalne dopuszczalne opóźnienie 25ms

113

background image

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba dodatkowo wygenerowanych pakietów: 2997,2998,2996

Liczba odebranych wiadomości: 1237,1293,1149

Liczba doklejonych nagłówków hop-by-hop: 3000,3000,3000

Test wykorzystuje parametry testu 3. Jednak sygnały są generowane w przeciwną stronę, od

komputera 1 do komputera 2, czyli zgodnie z kierunkiem przesyłania dużego pliku. Okazuje

się, że transport programem scp wykorzystuje maksymalnie duże pakiety IP równe

parametrowi MTU. Do takich wiadomości nie jest możliwe doklejenie nagłówka hop-by-hop.

Łącze jest wyjątkowo silnie nasycone.

Do komputera 2 dotarło średnio tylko 1226 wiadomości. Wąskim gardłem okazał się

mechanizm kształtowania ruchu, który odrzuca pakiety, jeżeli czekają na wysłanie zbyt długo,

tutaj ustawione było maksymalne opóźnienie 70ms. Mimo, że wiadomości były doklejane do

nagłówka hop-by-hop, zostały przy przetwarzaniu odrzucone przez mechanizm kształtowania

ruchu. Warstwa transportowa wygenerowała dodatkowe pakiety, w ilości prawie równej

liczbie nadawanych sygnałów, które zostały w większości odrzucone. W komputerze 2

odebrano mniej niż połowę nadanych sygnałów, około 41%. Dodatkowo opóźnienie

w dostarczeniu było duże, wyniosło od 150ms do 400ms.

9.5 Test p. 5. Priorytet 2. Scp. Syg. const. Kier. zgodny. Tc duże opóźnienie.

Tab. 50: Test p. 5; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev wlan0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev wlan0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb

114

background image

latency 700ms peakrate 200kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
700ms peakrate 200kbit minburst 1540

Tab. 51: Test p. 5; Parametry ruchu podkładowego

Generator ruchu

Przesyłanie dużego pliku z komputera 1 do
komputera 2 za pomocą protokołu scp.

Charakterystyka ruchu

Komputer 1 – Komputer 2 – wiekszosc
pakietow to 1460bajtowe pakiety, ktore
uniemozliwiaja doklejanie naglowka hop-by-
hop.
Komputer 2 – Komputer 1 – małe pakiety
wielkosci 40-50 bajtow, regularne odstępy
czasu pomiędzy pakietami

Tab. 52: Test p. 5; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 1 do komputera 2

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami
50ms

Tab. 53: Test p. 5; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 2

Parametry warstwy transportowej

Maksymalne dopuszczalne opóźnienie 25ms.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba dodatkowo wygenerowanych pakietów: 2999,2998,2996

Liczba odebranych wiadomości: 2810,2819,2837

Liczba doklejonych nagłówków hop-by-hop: 3000,3000,3000

115

background image

W porównaniu z testem 4 zwiększono parametr latency z 70ms do 700ms. Parametr ten

określa jak długo mogą oczekiwać pakiety IP na wysłanie za pomocą mechanizmu wiadra

żetonów. Takie rozwiązanie zmniejsza problem “wąskiego gardła” z testu 4.

Do komputera 2 dotarło średnio 2822 sygnały, czyli 94%. W teście 3 do komputera 3 dotarło

średnio tylko 38% sygnałów. Opóźnienie w dostarczeniu wiadomości było bardzo duże i dla

większości pakietów było między 1s i 1.7s.

9.6 Test p. 6. Priorytet 4. Scp. Syg. const. Kier. zgodny. Tc duże opóźnienie.

Tab. 54: Test p. 6; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev wlan0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev wlan0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb
latency 700ms peakrate 200kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
700ms peakrate 200kbit minburst 1540

Tab. 55: Test p. 6; Parametry ruchu podkładowego

Generator ruchu

Przesyłanie dużego pliku z komputera 1 do
komputera 2 za pomocą protokołu scp.

Charakterystyka ruchu

Opis w rozdziale 6.2

Tab. 56: Test p. 6; Parametry przesyłanego sygnału

Generowany sygnał

constant

116

background image

Kierunek generowanego sygnału

Z komputera 1 do komputera 2

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami
150ms

Tab. 57: Test p. 6; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 4

Parametry warstwy transportowej

Mechanizmu potwierdzenia drugiego typu.

Przebieg testu.

Przeprowadzono 1 eksperyment.

Wyniki testu.

Liczba wysłanych wiadomości: 100,100,100

Liczba odebranych wiadomości: 100,100,100

Okazało się, że mechanizm kształtowania ruchu umożliwia retransmisję pakietów UDP, które

zostały odrzucone z powodu skończonej długości bufora. Przez to operacja wysyłająca

wiadomość przez gniazdko sieciowe trwała aż do momentu udanej transmisji pakietu do

warstwy łącza danych. Na wykresie „Test p. 6” na Rys. 37 , pokazującym różnicę w czasie,

między wygenerowaniem wiadomości i wysłaniem, , widać że opóźnienie wynosiło pomiędzy

1.1s i 1.8s. Chociaż klient miał generować pakiety co 50ms to czeka on na potwierdzenie, że

operacja socket.sendto() została zakończona przed wygenerowaniem kolejnego sygnału.

Ponieważ operacja ta trwała bardzo długo 1.1s-1.8s, więc też czas pomiędzy kolejnymi

sygnałami wynosił w przybliżeniu tyle co czas oczekiwania na zakończenie się operacji

socket.sendto(). Opóźnienie, które wprowadza kolejka tocken bucket wynosi 700ms, jednak

jeżeli pakiet jest ponownie wstawiany do kolejki bo został odrzucony, otrzymujemy czas

ponad 1s. Średnie opóźnienie wyniosło 1.40s.

9.7 Test p. 7. Priorytet 4. Scp. Syg. const. Kier. zgodny. Tc małe opóźnienie.

Tab. 58: Test p. 7; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

117

background image

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev wlan0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev wlan0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb
latency 70ms peakrate 200kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 59: Test p. 7; Parametry ruchu podkładowego

Generator ruchu

Przesyłanie dużego pliku z komputera 1 do
komputera 2 za pomocą protokołu scp.

Charakterystyka ruchu

Opis w rozdziale 6.2

Tab. 60: Test p. 7; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 1 do komputera 2

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami
50ms

Tab. 61: Test p. 7; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 4

Parametry warstwy transportowej

Mechanizm potwierdzenia drugiego typu

Przebieg testu.

Przeprowadzono 1 eksperyment.

Wyniki testu.

Liczba wysłanych wiadomości: 100,100,100

Liczba odebranych wiadomości: 100,100,100

118

background image

Wyniki testu w porównaniu z testem 6 są dużo lepsze. Różnica między tymi testami polegała

tylko na parametrze latency, mechanizmu kolejkowania typu tocken bucket. Zmniejszono ten

parametr z 700ms na 70ms. Średnie opóźnienie wyniosło 310ms, podczas gdy w teście 6 było

1.4s. Mechanizm retransmisji pakietu, który został odrzucony z bufora wiadra żetonów,

umożliwił przesłanie wszystkich pakietów do komputera 2, z dużo mniejszym opóźnieniem.

Mimo mniejszego opóźnienia sygnał jest bardzo zniekształcony, gdyż ustawione było stałe

opóźnienie między wiadomościami na 50ms. Patrząc na histogram sygnału „Test p. 7” na Rys.

39, widać, że odstęp pomiędzy wiadomościami składa się z opóźnienia wykonania polecenia

sendto na gniazdku sieciowym i opóźnienia stałego ustawionego 50ms.

9.8 Test p. 8. Priorytet 2. Vlc. Syg. const.

Tab. 62: Test p. 8; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 500kbit, (1000kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class replace dev wlan0 parent 1:1 classid 1:11 htb rate 500kbit
tc qdisc replace dev wlan0 parent 1:11 handle 2 tbf rate 500kbit burst 10kb
latency 70ms peakrate 1000kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 63: Test p. 8; Parametry ruchu podkładowego

Generator ruchu

Streaming pliku mp3 z komputera 1 do
komputera 2 za pomocą protokołu RTP,
programem vlc.

Charakterystyka ruchu

Opis w rozdziale 6.3

119

background image

Tab. 64: Test p. 8; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 1 do komputera 2

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami
50ms

Tab. 65: Test p. 8; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 2

Parametry warstwy transportowej

Maksymalne dopuszczalne opóźnienie 25ms.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba dodatkowo wygenerowanych pakietów: 2193,2140,2207

Liczba odebranych wiadomości: 3000,2999,3000

Liczba doklejonych nagłówków hop-by-hop: 3000,3000,300

Średnia wartość opóźnienia: 21ms,22ms,23ms

Średnia wartość opóźnienia wyniosła 21ms. Rozkład opóźnienia był w zakresie od 9 ms do 40

ms. Osiągnięto oszczędność wynikającą z wykorzystania ruchu podkładowego.

Wygenerowano dodatkowo średnio 2180 pakietów, co wynosi 73% wszystkich przesłanych

wiadomości.

9.9 Test p. 9. Priorytet 2 duży odstęp. Vlc. Syg. const.

Tab. 66: Test p. 9; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 - kompter 1, wlan0, ograniczenie do 500kbit, (1000kbit burst)

120

background image

Qos

tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class replace dev wlan0 parent 1:1 classid 1:11 htb rate 500kbit
tc qdisc replace dev wlan0 parent 1:11 handle 2 tbf rate 500kbit burst 10kb
latency 70ms peakrate 1000kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 67: Test p. 9; Parametry ruchu podkładowego

Generator ruchu

Streaming pliku mp3 z komputera 1 do
komputera 2 za pomocą protokołu RTP,
programem vlc.

Charakterystyka ruchu

Opis w rozdziale 6.3

Tab. 68: Test p. 9; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 1 do komputera 2

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami
50ms

Tab. 69: Test p. 9; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 2

Parametry warstwy transportowej

Maksymalne dopuszczalne opóźnienie
100ms.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba dodatkowo wygenerowanych pakietów: 312,314,314

Liczba odebranych wiadomości: 1000,1000,1000

Liczba doklejonych nagłówków hop-by-hop: 1000,1000,1000

121

background image

Średnia wartość opóźnienia: 36ms,34ms,33ms

Średnia wartość opóźnienia to 34ms. Rozkład opóźnienia w wykonanych testach był

w zakresie od 10ms do 65 ms. Opóźnienie było mniejsze od ustawionego maksymalnego

opóźnienia w warstwie transportowej na 100ms. Wynikło to z faktu, że intensywność ruchu

podkładowego była większa od intensywności generowania sygnału. Osiągnięto oszczędność

wynikającą z wykorzystania ruchu podkładowego. Wygenerowano dodatkowo średnio 313

pakietów, co wynosi 31% wszystkich przesłanych sygnałów.

9.10 Test p. 10. Priorytet 1. Vlc. Syg. const.

Tab. 70: Test p. 10; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 500kbit, (1000kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class replace dev wlan0 parent 1:1 classid 1:11 htb rate 500kbit
tc qdisc replace dev wlan0 parent 1:11 handle 2 tbf rate 500kbit burst 10kb
latency 70ms peakrate 1000kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 71: Test p. 10; Parametry ruchu podkładowego

Generator ruchu

Streaming pliku mp3 z komputera 1 do
komputera 2 za pomocą protokołu RTP,
programem vlc.

Charakterystyka ruchu

Opis w rozdziale 6.3

122

background image

Tab. 72: Test p. 10; Parametry przesyłanego sygnału

Generowany sygnał

constant

Kierunek generowanego sygnału

Z komputera 1 do komputera 2

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami
150ms

Tab. 73: Test p. 10; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 1

Parametry warstwy transportowej

Maksymalna długość pakietu do którego
można dokleić nagłówek: 1360 bajtów.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba odebranych wiadomości: 1000,1000,1000

Liczba doklejonych nagłówków hop-by-hop: 1000,1000,1000

Średnia wartość opóźnienia: 39ms,39ms,39ms

Średnia wartość opóźnienia to 39ms. Rozkład opóźnienia w wykonanych testach był w miarę

równomiernie rozłożony, w zakresie od 10ms do 65 ms. Osiągnięto 100% oszczędność

wynikającą z wykorzystania ruchu podkładowego. Wszystkie 1000 sygnałów zostało

wysłanych w nagłówkach hop-by-hop, w ruchu istniejącym. Jednocześnie opóźnienie było na

niskim poziomie. Było to możliwe, gdyż odstęp pomiędzy generowanymi sygnałami wynosił

150ms.

9.11 Test p. 11. Priorytet 2. Vlc. Syg. snmp-like.

Tab. 74: Test p. 11; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 - kompter 1, wlan0, ograniczenie do 500kbit, (1000kbit burst)

123

background image

Qos

tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class replace dev wlan0 parent 1:1 classid 1:11 htb rate 500kbit
tc qdisc replace dev wlan0 parent 1:11 handle 2 tbf rate 500kbit burst 10kb
latency 70ms peakrate 1000kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 75: Test p. 11; Parametry ruchu podkładowego

Generator ruchu

Streaming pliku mp3 z komputera 1 do
komputera 2 za pomocą protokołu RTP,
programem vlc.

Charakterystyka ruchu

Opis w rozdziale 6.3

Tab. 76: Test p. 11; Parametry przesyłanego sygnału

Generowany sygnał

snmp-like

Kierunek generowanego sygnału

Z komputera 1 do komputera 2.

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami w
serii: 6ms.
Ilość wiadomości w serii: pomiędzy 1 i 100.
Dłuższa przerwa pomiędzy seriami:
pomiędzy 0.5s i 5s.

Tab. 77: Test p. 11; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 2

Parametry warstwy transportowej

Maksymalna dopuszczalne opóźnienie 10ms

Przebieg testu.

Przeprowadzono 3 eksperymenty.

Wyniki testu.

Liczba dodatkowo wygenerowanych pakietów: 453,460,451

Liczba odebranych wiadomości: 500,500,500

Liczba doklejonych nagłówków hop-by-hop: 500,500,500

124

background image

Średnia wartość opóźnienia: 16ms,16ms,16ms

Średnia wartość opóźnienia wyniosła 16ms. Jest to bardzo dobry wynik. W warstwie

transportowej parametr maksymalnego opóźnienia był ustawiony na 10ms. Rozkład

opóźnienia jest układa się pomiędzy 10ms i 25ms. Osiągnięto małą oszczędność wynikającą

z wykorzystania ruchu podkładowego. Wygenerowano dodatkowo średnio 455 pakietów na

500 przesłanych wiadomości.

9.12 Test p. 12. Priorytet 4. Vlc. Syg. snmp-like.

Tab. 78: Test p. 12; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 500kbit, (1000kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class replace dev wlan0 parent 1:1 classid 1:11 htb rate 500kbit
tc qdisc replace dev wlan0 parent 1:11 handle 2 tbf rate 500kbit burst 10kb
latency 70ms peakrate 1000kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 79: Test p. 12; Parametry ruchu podkładowego

Generator ruchu

Strumieniowanie pliku mp3 z komputera 1 do
komputera 2 za pomocą protokołu RTP,
programem vlc.

Charakterystyka ruchu

Opis w rodziale 6.3

Tab. 80: Test p. 12; Parametry przesyłanego sygnału

Generowany sygnał

snmp-like

125

background image

Kierunek generowanego sygnału

Z komputera 1 do komputera 2.

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami w
serii: 6ms.
Ilość wiadomości w serii: pomiędzy 1 i 100.
Dłuższa przerwa pomiędzy seriami:
pomiędzy 0.5s i 5s.

Tab. 81: Test p. 12; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 4

Parametry warstwy transportowej

Mechanizm potwierdzenia drugiego typu

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba wysłanych wiadomości: 500,500,500

Liczba odebranych wiadomości: 500,500,500

Średnia wartość opóźnienia: 7ms,7ms,7ms

Rozkład opóźnienia jest w skoncentrowany wokół wartości 7ms. Sygnał generowany ma

charakter prawie taki jak zakładany, są dłuższe przerwy i serie z krótkimi odstępami między

wiadomościami. Krótkie przerwy wynoszą około 10ms, co jest nieznacznie więcej niż

ustawione 6ms. Opóźnienie wprowadził między innymi mechanizm potwierdzenia. Warstwa

transportowa wstrzymuje klienta generującego sygnał, dopóki polecenie sendto na gniazdku

sieciowym, nie zakończy działania. W kolejnym teście numer 13 został wykorzystany inny

rodzaj warstwy transportowej, bez mechanizmu potwierdzenia charakterystycznego dla

priorytetu 4, dzięki czemu odstęp pomiędzy kolejnymi wiadomościami w serii jest mniejszy

niż 10ms.

9.13 Test p. 13. Priorytet 3. Vlc. Syg. snmp-like.

Tab. 82: Test p. 13; Parametry kształtowania ruchu

Ustawione parametry

126

background image

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 500kbit, (1000kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class replace dev wlan0 parent 1:1 classid 1:11 htb rate 500kbit
tc qdisc replace dev wlan0 parent 1:11 handle 2 tbf rate 500kbit burst 10kb
latency 70ms peakrate 1000kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 83: Test p. 13; Parametry ruchu podkładowego

Generator ruchu

Strumieniowanie pliku mp3 z komputera 1 do
komputera 2 za pomocą protokołu RTP,
programem vlc.

Charakterystyka ruchu

Opis w rozdziale 6.3

Tab. 84: Test p. 13; Parametry przesyłanego sygnału

Generowany sygnał

snmp-like

Kierunek generowanego sygnału

Z komputera 1 do komputera 2.

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami w
serii: 6ms.
Ilość wiadomości w serii: pomiędzy 1 i 100.
Dłuższa przerwa pomiędzy seriami:
pomiędzy 0.5s i 5s.

Tab. 85: Test p. 13; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 3

Parametry warstwy transportowej

Maksymalna długość pakietu do którego
można dokleić nagłówek: 1360 bajtów.

Przebieg testu.

127

background image

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba wysłanych wiadomości: 500,500,500

Liczba odebranych wiadomości: 500,500,500

Liczba dodatkowo wygenerowanych pakietów: 500,500,500

Średnia wartość opóźnienia: 9ms,7ms,7ms

Ruchem przesyłanym był ruch mający symulować ruch protokołu SNMP. Średnia wartość

opóźnienia wyniosła 8ms. Jest to wynik właściwie taki sam co w przypadku wysyłania

wiadomości bezpośrednio w protokole UDP (test p. 12). Rozkład opóźnienia jest

skoncentrowany wokół wartości 7ms. Charakter ruchu jest taki jak zakładany. Występują

dłuższe i krótkie przerwy. Krótkie przerwy mają wartość około 6ms. Jest to lepszy

charakterystyka niż w teście 11. Wynika to z faktu, że użyta tutaj warstwa transportowa ma

mechanizm potwierdzenia, nie czekający na faktyczne wysłanie wiadomości.

9.14 Test p. 14. Priorytet 4. Vlc. Tc. Syg. snmp-like.

Tab. 86: Test p. 14; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 500kbit, (1000kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class replace dev wlan0 parent 1:1 classid 1:11 htb rate 500kbit
tc qdisc replace dev wlan0 parent 1:11 handle 2 tbf rate 160kbit burst 10kb
latency 70ms peakrate 400kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 87: Test p. 14; Parametry ruchu podkładowego

128

background image

Generator ruchu

Strumieniowanie pliku mp3 z komputera 1 do
komputera 2 za pomocą protokołu RTP,
programem vlc.

Charakterystyka ruchu

Opis w rozdziale 6.3

Tab. 88: Test p. 14; Parametry przesyłanego sygnału

Generowany sygnał

snmp-like

Kierunek generowanego sygnału

Z komputera 1 do komputera 2.

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami w
serii: 6ms.
Ilość wiadomości w serii: pomiędzy 1 i 100.
Dłuższa przerwa pomiędzy seriami:
pomiędzy 0.5s i 5s.

Tab. 89: Test p. 14; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 4

Parametry warstwy transportowej

Mechanizm potwierdzenia drugiego typu.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba wysłanych wiadomości: 1000,1000,1000

Liczba odebranych wiadomości: 1000,1000,1000

Średnia wartość opóźnienia: 148ms,149ms,151ms

Ruchem przesyłanym był ruchem typu snmp. Jednak z powodu mechanizmu potwierdzenia

sygnał został zupełnie zniekształcony. Z wykresu w małej skali widać, ze opóźnienie

pomiędzy pakietami w serii wynosiło około 13ms lub około 21ms. Jeżeli spojrzymy na

wykres histogramu opóźnienia „Test p. 14” na Rys. 37, widać że sygnał został zniekształcony

do wartości opóźnienia.

Jest widoczna zaleta mechaznimu transportu w oddzielnych pakietach UDP. Do komputera 2

dotarło 100% wiadomości. Wynika to z cechy mechanizmu kształtowania ruchu, który

129

background image

umożliwia retransmisję pakietów protokołu UDP, jeżeli pakiet został odrzucony z kolejki

z powodu przekroczenia czasu oczekiwania na wysłanie.

9.15 Test p. 15. Priorytet 3. Vlc. Tc. Syg. snmp-like.

Tab. 90: Test p. 15; Parametry kształtowania ruchu

Ustawione parametry

Komputer 1

adres fec0::1:2, interfejs wlan0

Komputer 2

adres fec0::1:3, interfejs eth0

Komputer 1 -
Qos

kompter 1, wlan0, ograniczenie do 500kbit, (1000kbit burst)
tc qdisc add dev wlan0 handle 1: root htb
tc class add dev wlan0 parent 1: classid 1:1 htb rate 10Mbit
tc class replace dev wlan0 parent 1:1 classid 1:11 htb rate 500kbit
tc qdisc replace dev wlan0 parent 1:11 handle 2 tbf rate 160kbit burst 10kb
latency 70ms peakrate 400kbit minburst 1540

Komputer 2 -
Qos

kompter 2, eth0, ograniczenie do 100kbit, (200kbit burst)
tc qdisc add dev eth0 handle 1: root htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbit
tc qdisc add dev eth0 parent 1:11 handle 2 tbf rate 100kbit burst 10kb latency
70ms peakrate 200kbit minburst 1540

Tab. 91: Test p. 15; Parametry ruchu podkładowego

Generator ruchu

Strumieniowanie pliku mp3 z komputera 1 do
komputera 2 za pomocą protokołu RTP,
programem vlc.

Charakterystyka ruchu

Opis w rozdziale 6.3

Tab. 92: Test p. 15; Parametry przesyłanego sygnału

Generowany sygnał

snmp-like

Kierunek generowanego sygnału

Z komputera 1 do komputera 2.

Parametry sygnału

Odstęp czasu pomiędzy wiadomościami w
serii: 6ms.
Ilość wiadomości w serii: pomiędzy 1 i 100.
Dłuższa przerwa pomiędzy seriami:
pomiędzy 0.5s i 5s.

130

background image

Tab. 93: Test p. 15; Parametry warstwy transportowej

Typ warstwy transportowa

Priorytet 3

Parametry warstwy transportowej

Maksymalna długość pakietu do którego
można dokleić nagłówek: 1360 bajtów.

Przebieg testu.

Przeprowadzono 3 eksperymenty z tymi samymi parametrami.

Wyniki testu.

Liczba wysłanych wiadomości: 1000,1000,1000

Liczba odebranych wiadomości: 869,900,864

Liczba dodatkowo wygenerowanych pakietów: 1000,1000,1000

Średnia wartość opóźnienia: 196ms,196ms,199ms

Do komputera 2 dotarło średnio 878 pakietów na 1000 wysłanych. Wiadomości były

doklejane do pakietów IP, ale mechanizm kształtowania ruchu odrzucał niektóre z nich, gdy

bufor był przepełniony. Opóźnienie przyjmowało wartości głównie od około 150ms do około

250ms. Rozkład w tym obszarze był w miarę równomierny. Sygnał typu snmp nie został

zniekształcony. Widać to na wykresie „Test p. 15”, histogramu odstępu czasu pomiędzy

kolejnymi wiadomościami na Rys. 39.

131

background image

Test p. 1

Test p. 2

Rys. 34: Dystrybuanta opóźnienia – testy przesyłania danych
legenda wykresów p1,p2: oś pionowa – dystrybuanta opóźnienia w dostarczeniu
wiadomości, oś pozioma – czas[s]

Test p. 4

Test p. 5

Rys. 35: Wykres opóźnienia – testy przesyłania danych
legenda wykresów p4, p5: oś pionowa – opóźnienie dostarczenia wiadomości [s], oś
pozioma – numer wiadomości

132

background image

Test p. 3

Test p. 4

Test p. 5

Test p. 8

Test p. 9

Test p. 11

133

background image

Test p. 15

Rys. 36: Statystyki transmisji – testy przesyłania danych
legenda wykresów p3, p4, p5, p8, p9, p11, p15: oś pionowa – liczba wiadomości

Test p. 3

Test p. 4

Test p. 5

Test p. 6

134

background image

Test p. 7

Test p. 8

Test p. 9

Test p. 10

Test p. 11

Test p. 12

135

background image

Test p. 13

Test p. 14

Test p. 15

Rys. 37: Histogram opóźnienia – testy przesyłania danych
legenda wykresów p3-p15: oś pionowa – liczba wiadomości, oś pozioma – opóźnienie
dostarczenia wiadomości [s]

Test p. 11

Test p. 12

136

background image

Test p. 13

Test p. 14

Test p. 15

Rys. 38: Wykres sygnału – testy przesyłania danych
legenda wykresów p11-p5: oś pionowa – odstęp pomiędzy kolejnymi wiadomościami [s], oś
pozioma – numer wiadomości

Test p. 1

Test p. 2

137

background image

Test p. 3

Test p. 4

Test p. 5

Test p. 6

Test p. 7

Test p. 8

138

background image

Test p. 9

Test p. 10

Test p. 11

Test p. 12

Test p. 13

Test p. 14

139

background image

Test p. 15

Rys. 39: Histogram odstępu – testy przesyłania danych
legenda wykresów p1-p15: oś pionowa – liczba wiadomości, oś pozioma – odstęp czasu
pomiędzy kolejnymi wiadomościami [s]

140

background image

9.16 Podsumowanie testów przesyłania danych

Przeprowadzone testy są pewnym wycinkiem wszystkich możliwych kombinacji ruchu

podkładowego, przesyłanego sygnału, priorytetu przesyłania wiadomosci oraz parametrów

mechanizmu kształtowania ruchu. Nie ma pewności, że wszystkie cechy tego sposobu

transportu uwidoczniły się w zbiorze przeprowadzonych testów, ale jest przypuszczenie, że

większość cech transportu można było zaobserwować na podstawie wyników testów. Wyniki

testów zostały omówione poprzez pogrupowanie testów i omówienie każdej grupy oddzielnie.

Podsumowanie testów 4, 5, 6 i 7

W teście 4 i 5 pokazano, jak będzie się zachowywała warstwa transportowa dla priorytetu 2,

gdy interfejs sieciowy będzie wysycony pakietami o wartości MTU. W takiej sytuacji

warstwa transportowa będzie musiała wygenerować dodatkowe pakiety, które będą często

odrzucane przez mechanizm kształtowania ruchu, ograniczający pasmo. W teście 4 dotarło do

odbiorcy tylko około 40% wiadomości. Poprawę dostarczania wiadomości można zwiększyć

zwiększając bufor na pakiety oczekujące na wysłanie. Po zwiększeniu maksymalnego czasu

oczekiwania w buforze z 70ms, w teście 4, do 700ms, w teście 5, do odbiorcy dotarło już

około 94% wszystkich wysyłanych wiadomości.

W celu porównania zachowania priotetu 2, przeprowadzono takie same testy

z wykorzystaniem priorytetu 4. Okazało się, że przesyłania wiadomości bezpośrednio

w protokole UDP powoduje, że odrzucone pakiety przez mechanizm kształtowania ruchu są

ponownie transmitowane aż do skutku. Dzięki temu do odbiorcy w testach 5 i 6 dotarło 100%

wysłanych wiadomości. Jest jednak poważna wada tego mechanizmu. Warstwa transportowa

wysyłająca pakiety wprowadza duże opóźnienia pomiędzy kolejno nadawanymi pakietami.

Sięgają one 1.5s w teście 6. Priorytet 2 nie zniekształcił generowanego sygnału, czyli odstęp

pomiędzy pakietami w serii był rzędu 6ms.

Podsumowanie testów 3, 8, 9

Testy 3, 8 i 9 pokazały, jak zachowuje się warstwa transportowa przesyłająca wiadomości

z priorytetem 2, gdy łącze nie jest wysycone. Zachowana zostaje wartość masymalnego

opóźnienia przy przesyłaniu wiadomości. Gdy dopuszczalne opóźnienie jest większe wtedy

zysk, polegający na wykorzystaniu ruchu podkładowego do przesyłania wiadomości, jest

większy. W teście numer 9 zysk wyniósł 31%.

141

background image

Podsumowanie testów 1, 2, 10

Testy 1, 2 i 10 pokazały, jak zachowuje się warstwa transportowa przesyłająca wiadomości

z priorytetem 1. Dla każdego z trzech testów dostarczono wszystkie wiadomości do odbiorcy

z małym opóźnieniem. Takie wyniki uzyskano, ponieważ ruch podkładowy był bardziej

intensywny od przesyłanego sygnału. Ruch o priorytecie 1 nadaje się do przesyłania

wiadomości, dla których nie jest krytyczne opóźnienie w dostarczeniu, oraz występuje

wystarczająco intensywny ruch podkładowy.

Podsumowanie testów 11,12 i 13

Testy 11, 12 i 13 pokazały jakie opóźnienie jest wprowadzane przez warstwę transportową dla

priorytetów 2, 3 i 4, w przypadku gdy łącze nie jest wysycone. Przesyłanym sygnałem był

sygnał typu snmp-like. Priorytety 3 i 4 uzyskały taką samą wartośc opóźnienia, około 7ms.

Priorytet 2 z ustawioną wartością maksymalnego opóźnienia na 10ms, osiągnął wartość

średnią opóźnienia około 16ms. Najszybciej wiadomości dostarczane są priorytetem 3 i 4,

tylko trochę wolniej priorytetem 2.

Podsumowanie testów 14 i 15

Testy 14 i 15 pokazały jaki wpływ na przesyłany ruch ma priorytet 3 i 4 w przypadku, gdy

łącze jest wysycone pakietami nie mającymi wartości MTU. Priorytet 3 z powodu

mechanizmu retransmisji pakietów UDP zniekształaca generowany sygnał. Opóźnienie

pomiędzy kolejnymi wiadomościami wynosi około 150ms, mimo że powinno to być około

6ms. Priorytet 4 nie zniekształca generowanego sygnału. Odstęp pomiędzy wiadomościami

w serii wynosi około 8ms. Wadą priorytetu 4 jest to, że dotarło do odbiorcy tylko 88%

wysłanych pakietów.

142

background image

10. Podsumowanie testów

Wykonany program i przeprowadzone testy wydajności i opóźnienia pokazały, że cel

postawiony przed częścią praktyczną pracy został osiągnięty. Stworzona implementacja

umożliwia przesyłanie wiadomości w nagłówkach hop-by-hop pakietów IPv6 z dość dobrą

wydajnością i wprowadzanym małym opóźnieniem. Wydajność jest wystarczająca do

przeprowadzonych testów z rodziału 9, które symulują przesyłanie wiadomościz szybkością

maksymalną około 200 razy na sekundę. Zaimplementowane rozwiązanie nie jest jednak

skalowale, gdyż nie da się za jego pomocą testować bardziej skomplikowanych scenariuszy,

wymagających większej wydajności i jeszcze mniejszego opóźnienia. Wydaje się,

że oczekiwane rezultaty spełniłoby rozwiązanie przedstawione w rozdziale 4.2 Implementacja

z wykorzystaniem zaczepów. Rozwiązanie to polega na napisaniu kodu przetwarzającego

pakiety w przestrzeni jądra z wykorzystaniem mechanizmu rejestrowania funkcji, którym

zostaje przekazana obsługa pakietu, w wybranych momentach przetwarzania.

Testy warstwy tranportowej pokazały, że wykorzystanie nagłówków hop-by-hop może być

ciekawym i korzystnym rozwiązaniem alternatywnym do wysyłania wiadomości

w odzielnych pakietach. Nagłówki hop-by-hop umożliwiają przysyłanie dużej liczby

informacji bez dużego wykorzystania radiowego pasma transmisyjnego. Nagłówek hop-by-

hop sprawdzi się szczególnie dobrze w sytuacji, gdy jest konieczność przesyłania danych

bardzo często, kilkadziesiąt lub kilkaset razy na sekundę, a łącze radiowe jest mocno

obciążone. Ograniczeniem będzie tutaj konieczność sprawdzenia czy po dodaniu nagłówka

nie przekroczona zostanie wartość MTU łącza. Drugą wadą zauważoną w trakcie testów jest

fakt, że pakiety, także te z dołączonym nagłówkiem hop-by-hop mogą być odrzucone przez

mechanizm kształtowania ruchu stosowany w systemie Linux.

Mimo, że zbiór testów jest dość obszerny, gdyż zawiera 15 różnych scenariuszy testowych, to

stanowi on tylko mały wkład nad zbadaniem mechanizmu transportu wykorzystującego

nagłówki hop-by-hop w protokole IPv6. Rzeczywisty ruch internetowy ma dużo bardziej

złożony charakter, a z jednego radiowego punktu dostępowego może korzystać więcej niż

jeden komputer, co powoduje większe zakłócenia.

143

background image

LITERATURA

[1]

RFC 2460, Internet Protocol, Version 6 (IPv6), 1998

[2]

RFC 791, INTERNET PROTOCOL DARPA INTERNET PROGRAM PROTOCOL

SPECIFICATION, 1981

[3]

Dokumentacja języka Python, http://docs.python.org/, strona odwiedzona 10.09.2011

[4]

Dokumentacja do Pythonowego API dla biblioteki GTK+,

http://www.pygtk.org/docs/pygtk/, strona odwiedzona 10.09.2011

[5]

Dokumentacja do biliotek libnetfilter_queue, libnfnetlink, http://www.netfilter.org/,

strona odwiedzona 10.09.2011

[6]

Dokumentacja do biblioteki nfqueue-bindings, http://software.inl.fr/trac/wiki/nfqueue-

bindings i http://www.nufw.org/projects/nfqueue-bindings/wiki/Wiki, strony

odwiedzone 10.09.2011

[7]

Marcin Króliczak, praca inżynierska pt.: Graficzna aplikacja zarządzająca pasmem

w łączu współdzielonym, Wydział Elektroniki i Technik Informacyjnych, Warszawa

2007

[8]

Bert Hubert, Linux Advanced Routing & Traffic Control HOWTO, Opis mechanizmu

Traffic Control w systemie Linux, rozdział 9: Queueing Disciplines for Bandwidth

Management, http://lartc.org/lartc.html, strona odwiedzona 10.09.2011

[9]

Differentiated Service on Linux HOWTO, rozdział 2.1.- Linux Traffic Control, Opis

mechanizmu Traffic Control w systemie Linukx, http://opalsoft.net/qos/DS-21.htm,

strona odwiedzona 10.09.2011

[10]

Dokumentacja polecenia tc w systemie Linux, strona man w systemie Linux Mandriva

2010

[11]

Dokumentacja polecenia ip6tables w systemie Linux, strona man w Linuksie

Mandriva 2010

[12]

prof. Zieher, materiały dydaktyczne New Internet Protocols, Hochschule Esslingen,

Niemcy, 2008

[13]

Peter Benko (ETH), Domonkos Asztalos (ETH), Csaba Simon (BME), Vassilios

Kaldanis (VELTI), EFIPSANS Integration Framework, INFSO-ICT-

215549/WP5/D.5.1, , dokument powstał w ramach projektu EFIPSANS, artykuł

dostępny na http://www.efipsans.org, odwiedzonej 01.06.2011

144

background image

[14]

Kod źródłowy jądra systemu Linux 2.6.37, dostępny jako pakiet rpm w dystrybucji

systemu Linux Mandriva 2010

[15]

RFC 2675, IPv6 Jumbograms, 1998

[16]

RFC 2711, IPv6 Router Alert Option, 1999

[17]

Emanuela Lins, Saurabh Agarwal, IPv6 Implementation Study, A study of IPv6

Implementation in Linux, 2003

[18]

RFC 3879, Deprecating Site Local Addresses, 2004

[19]

Sławomir Kukliński, Paweł Radziszewski, Jacek Wytrębowicz, Ipv6 in Wireless

Networks – Selected Issues, Journal of Telecommunications and Information

Technology 2/2011

145

background image

Spis tabel.

Tab. 1: Odpowiadające sobie pole w nagłówkach IPv4 i IPv6.................................................14
Tab. 2: Bezstanowa konfiguracja adresu IPv6. Przykład..........................................................16
Tab. 3: Nagłówki rozszerzające IPv6........................................................................................17
Tab. 4: Protokoły Inet6..............................................................................................................28
Tab. 5: Porównanie cech sposobó implementacji.....................................................................48
Tab. 6: Ruch scp; Kierunek „w przód”.....................................................................................74
Tab. 7: Ruchu scp; Kierunek „wstecz”.....................................................................................75
Tab. 8: Ruch vlc; Kierunek „w przód”.....................................................................................76
Tab. 9: Parametry kształtowania ruchu. Przykład.....................................................................81
Tab. 10: Test w. 1; Priorytet 3; Parametry kształtowania ruchu................................................92
Tab. 11: Test w. 1; Priorytet 3; Parametry przesyłanego sygnału.............................................92
Tab. 12: Test w. 1; Priorytet 3; Parametry warstwy transportowej...........................................92
Tab. 13: Test w. 2; Priorytet 4; Parametry kształtowania ruchu................................................93
Tab. 14: Test w. 2; Priorytet 4; Parametry przesyłanego sygnału.............................................93
Tab. 15: Test w. 2; Priorytet 4; Parametry warstwy transportowej...........................................93
Tab. 16: Test w. 3; Priorytet 4; Parametry kształtowania ruchu................................................94
Tab. 17: Test w. 3; Priorytet 4; Parametry przesyłanego sygnału.............................................94
Tab. 18: Test w. 3; Priorytet 4; Parametry warstwy transportowej...........................................95
Tab. 19: Test o. 1; Priorytet 2; Parametry kształtowania ruchu................................................96
Tab. 20: Test o. 1; Priorytet 2; Parametry przesyłanego sygnału..............................................96
Tab. 21: Test o. 1; Priorytet 2; Parametry warstwy transportowej............................................96
Tab. 22: Test o. 2; Priorytet 3; Parametry kształtowania ruchu................................................97
Tab. 23: Test opóźnienia 2; Priorytet 3; Parametry przesyłanego sygnału...............................97
Tab. 24: Test opóźnienia 2; Priorytet 3; Parametry warstwy transportowej;............................97
Tab. 25: Test o. 3; Priorytet 4; Parametry kształtowania ruchu................................................97
Tab. 26: Test o. 3; Priorytet 4; Parametry przesyłanego sygnału..............................................98
Tab. 27: Test o. 3; Priorytet 4; Parametry warstwy transportowej............................................98
Tab. 28: Test o. 4; Priorytet 2; Parametry kształtowania ruchu................................................98
Tab. 29: Test o. 4; Priorytet 2; Parametry przesyłanego sygnału..............................................98
Tab. 30: Test o. 4; Priorytet 2; Parametry warstwy transportowej............................................99
Tab. 31: Test o. 5; Priorytet 2; Parametry kształtowania ruchu................................................99
Tab. 32: Test o. 5; Priorytet 2; Parametry przesyłanego sygnału..............................................99
Tab. 33: Test o. 5; Priorytet 2; Parametry warstwy transportowej..........................................100
Tab. 34: Test p. 1; Parametry kształtowania ruchu.................................................................109
Tab. 35: Test p. 1; Parametry ruchu podkładowego................................................................109
Tab. 36: Test p. 1; Parametry przesyłanego sygnału...............................................................109
Tab. 37: Test p. 1; Parametry warstwy transportowej.............................................................109
Tab. 38: Test p. 2; Parametry kształtowania ruchu..................................................................110
Tab. 39: Test p. 2; Parametry ruchu podkładowego................................................................110
Tab. 40: Test p. 2; Parametry przesyłanego sygnału...............................................................110
Tab. 41: Test p. 2; Parametry warstwy transportowej.............................................................111
Tab. 42: Test p. 3; Parametry kształtowania ruchu..................................................................111

146

background image

Tab. 43: Test p. 3; Parametry ruchu podkładowego................................................................112
Tab. 44: Test p. 3; Parametry przesyłanego sygnału...............................................................112
Tab. 45: Test p. 3; Parametry warstwy transportowej.............................................................112
Tab. 46: Test p. 4; Parametry kształtowania ruchu..................................................................113
Tab. 47: Test p. 4; Parametry ruchu podkładowego................................................................113
Tab. 48: Test p. 4; Parametry przesyłanego sygnału...............................................................113
Tab. 49: Test p. 4; Parametry warstwy transportowej.............................................................113
Tab. 50: Test p. 5; Parametry kształtowania ruchu..................................................................114
Tab. 51: Test p. 5; Parametry ruchu podkładowego................................................................115
Tab. 52: Test p. 5; Parametry przesyłanego sygnału...............................................................115
Tab. 53: Test p. 5; Parametry warstwy transportowej.............................................................115
Tab. 54: Test p. 6; Parametry kształtowania ruchu..................................................................116
Tab. 55: Test p. 6; Parametry ruchu podkładowego................................................................116
Tab. 56: Test p. 6; Parametry przesyłanego sygnału...............................................................116
Tab. 57: Test p. 6; Parametry warstwy transportowej.............................................................117
Tab. 58: Test p. 7; Parametry kształtowania ruchu..................................................................117
Tab. 59: Test p. 7; Parametry ruchu podkładowego................................................................118
Tab. 60: Test p. 7; Parametry przesyłanego sygnału...............................................................118
Tab. 61: Test p. 7; Parametry warstwy transportowej.............................................................118
Tab. 62: Test p. 8; Parametry kształtowania ruchu..................................................................119
Tab. 63: Test p. 8; Parametry ruchu podkładowego................................................................119
Tab. 64: Test p. 8; Parametry przesyłanego sygnału...............................................................120
Tab. 65: Test p. 8; Parametry warstwy transportowej.............................................................120
Tab. 66: Test p. 9; Parametry kształtowania ruchu.................................................................120
Tab. 67: Test p. 9; Parametry ruchu podkładowego................................................................121
Tab. 68: Test p. 9; Parametry przesyłanego sygnału...............................................................121
Tab. 69: Test p. 9; Parametry warstwy transportowej.............................................................121
Tab. 70: Test p. 10; Parametry kształtowania ruchu...............................................................122
Tab. 71: Test p. 10; Parametry ruchu podkładowego..............................................................122
Tab. 72: Test p. 10; Parametry przesyłanego sygnału.............................................................123
Tab. 73: Test p. 10; Parametry warstwy transportowej...........................................................123
Tab. 74: Test p. 11; Parametry kształtowania ruchu................................................................123
Tab. 75: Test p. 11; Parametry ruchu podkładowego..............................................................124
Tab. 76: Test p. 11; Parametry przesyłanego sygnału.............................................................124
Tab. 77: Test p. 11; Parametry warstwy transportowej...........................................................124
Tab. 78: Test p. 12; Parametry kształtowania ruchu...............................................................125
Tab. 79: Test p. 12; Parametry ruchu podkładowego..............................................................125
Tab. 80: Test p. 12; Parametry przesyłanego sygnału.............................................................125
Tab. 81: Test p. 12; Parametry warstwy transportowej...........................................................126
Tab. 82: Test p. 13; Parametry kształtowania ruchu...............................................................126
Tab. 83: Test p. 13; Parametry ruchu podkładowego..............................................................127
Tab. 84: Test p. 13; Parametry przesyłanego sygnału.............................................................127
Tab. 85: Test p. 13; Parametry warstwy transportowej...........................................................127
Tab. 86: Test p. 14; Parametry kształtowania ruchu...............................................................128
Tab. 87: Test p. 14; Parametry ruchu podkładowego..............................................................128
Tab. 88: Test p. 14; Parametry przesyłanego sygnału.............................................................129

147

background image

Tab. 89: Test p. 14; Parametry warstwy transportowej...........................................................129
Tab. 90: Test p. 15; Parametry kształtowania ruchu...............................................................130
Tab. 91: Test p. 15; Parametry ruchu podkładowego..............................................................130
Tab. 92: Test p. 15; Parametry przesyłanego sygnału.............................................................130
Tab. 93: Test p. 15; Parametry warstwy transportowej...........................................................131

148

background image

Spis rysunków.

Rys. 1: Adres IPv6 Link-local...................................................................................................11
Rys. 2: Adres interfejsu IF-ID...................................................................................................12
Rys. 3: Adres IPv6 Global Unicast............................................................................................12
Rys. 4: Nagłówek IPv4..............................................................................................................13
Rys. 5: Nagłówek IPv6..............................................................................................................14
Rys. 6: Bezstanowa konfiguracja adresu IPv6..........................................................................16
Rys. 7: Sekwencja nagłówków rozszerzających.......................................................................18
Rys. 8: Bezpośrednia komunikacja z węzłem mobilnym.........................................................19
Rys. 9: Komunikacja z węzłem mobilnym; Wykorzystanie pośrednika...................................19
Rys. 10: Nagłówek hop-by-hop................................................................................................21
Rys. 11: Struktura opcji nagłówka hop-by-hop.........................................................................21
Rys. 12: Padding 0....................................................................................................................22
Rys. 13: Padding n bajtów.........................................................................................................22
Rys. 14: Obsługa pakietów przychodzących.............................................................................24
Rys. 15: Obsługa pakietów wychodzących...............................................................................25
Rys. 16: Zaczepy.......................................................................................................................39
Rys. 17: Architektura aplikacji: warstwa transportowa i aplikacja kliencka............................54
Rys. 18: Przykładowe histogramy opóźnienia dla priorytetów 2, 3, 4......................................57
Rys. 19: Warstwa transportowa; Część wysyłająca; Logowanie zdarzeń.................................58
Rys. 20: Architektura warstwy transportowej; część odbierająca.............................................63
Rys. 21: Histogramy sygnałów – prezentacja sygnałów...........................................................66
Rys. 22: Wykres sygnału – prezentacja sygnałów....................................................................67
Rys. 23: Aplikacja kliencka. Logowanie zdarzeń.....................................................................69
Rys. 24: Środowisko testowe....................................................................................................72
Rys. 25: Wykres ruchu scp i vlc – wielkość pakietów..............................................................78
Rys. 26: Wykres ruchu scp i vlc – odstęp między pakietami....................................................79
Rys. 27: Ruch scp i vlc – histogram wielkości pakietów..........................................................79
Rys. 28: Ruch scp i vlc – histogram odstępu............................................................................80
Rys. 29: Mechanizm wiadra żetonów.......................................................................................81
Rys. 30: Struktura kształtowania ruchu; Przykład....................................................................83
Rys. 31: Wykres opóźnienia – testy opóźnienia......................................................................103
Rys. 32: Histogram opóźnienia – testy opóźnienia.................................................................104
Rys. 33: Histogram odstępu – testy opóźnienia......................................................................106
Rys. 34: Dystrybuanta opóźnienia – testy przesyłania danych...............................................132
Rys. 35: Wykres opóźnienia – testy przesyłania danych.........................................................132
Rys. 36: Statystyki transmisji – testy przesyłania danych......................................................134
Rys. 37: Histogram opóźnienia – testy przesyłania danych....................................................136
Rys. 38: Wykres sygnału – testy przesyłania danych..............................................................137
Rys. 39: Histogram odstępu – testy przesyłania danych.........................................................141
Rys. 40: Klient - GUI..............................................................................................................154

149

background image

Spis listingów.

Listing 1: Struktura bufora sk_buff (include/linux/sk_buff.h)..................................................26
Listing 2: Struktura wskaźników do nagłówków (include/linux/sk_buff.h).............................27
Listing 3: Dane tymczasowe protokołów obsługujących include/linux/sk_buff.h..................28
Listing 4: Struktura packet_type (include/linux/netdevice.h)...................................................28
Listing 5: Struktura ipv6_packet_type (net/ipv6/ipv6_sockglue.c)..........................................29
Listing 6: Struktura Inet6_protocol (include/net/protocol.h)....................................................30
Listing 7: Struktura proto_ops (include/linux/net.h).................................................................30
Listing 8: Struktura Inet6_stream_ops (net/ipv6/af_inet6.c)....................................................31
Listing 9: Struktura Inet6_dgram_ops (net/ipv6/af_inet6.c).....................................................31
Listing 10: Uzupełnianie strukty ipv6_txoptions......................................................................34
Listing 11: Rejestracja nowej zmiennej w przestrzeni jądra.....................................................36
Listing 12: Odczytanie nagłówka hop-by-hop..........................................................................38
Listing 13: Fragmenty jądra, w których zarejestrowano zaczepy. Plik net/ipv6/ip6_output.c. 41
Listing 14: Fragmenty jądra, w których zarejestrowano zaczepy. Plik net/ipv6/ip6_input.c. .41
Listing 15: Użycie zaczepów. Przykład....................................................................................42
Listing 16: Stworzenie filtra pakietów. Polecenie ip6tables. Przykład 1..................................44
Listing 17: Przetwarzanie pakietów w przestrzeni użytkownika. Język C++...........................45
Listing 18: Utworzenie filtra pakietów. Polecenie ip6tables. Przykład 2.................................46
Listing 19: Przetwarzanie pakietów w przestrzeni użytkownika. Język Python......................47
Listing 20: Funkcja przetwarzająca pakiety. Język Python......................................................48
Listing 21: Plik iniput-1.ini.....................................................................................................159
Listing 22: Plik input2-2.ini....................................................................................................161

150

background image

Załącznik A. Dokumentacja użytkowa programu testowego

Wymagania systemowe:

system operacyjny Linux z wersją jądra mininum 2.6.37; jądro musi być

skompilowane ze wsparciem dla mechanizmu nfnetlink_queue, np. Jądro dostępne w

systemie Mandriva 2010

biblioteka libnfnetlink, wersja minimum 1.0.0

biblioteka libnetfilter_queue, wersja minimum 1.0.0

zainstalowany język Python w wersji minimum 2.6.5

biblioteka do języka Python pygtk, wersja minimum 2.17

biblioteka do języka Python dpkt, wersja minimum 1.7

biblioteka do języka Python nfqueue, wersja minimum 0.3

Pliki programu testowego

Program warstwy transportowej:

gtk-widget6-v2.py – plik programu

input-1.ini – plik z parametrami konfiguracyjnymi

Program aplikacji klienckiej:

client-gen-data-v3.py – plik programu

input-2.ini – plik z parametrami konfiguracyjnymi

Uruchamianie programu testowego

Program warstwy transportowej:

1. Skonfigurować poleceniem ip6tables filtrację pakietów, które będą trafiały do aplikacji. ?

2. Przejść do katalogu z plikami gtk-widget6-v2.py oraz input-1.ini i wykonać komendę z linii

poleceń z użytkownika root (bash, sh): python gtk-widget6-v2.py.

Program aplikacji klienckiej:

151

background image

1. Przejść do katalogu z plikami client-gen-data-v3.py i input-2.ini. Program testowy

powinien być uruchamiany z użytkownika innego niż root. W linii poleceń wykonać

komendę: python client-gen-data-v3.py

Zatrzymywanie programu testowego.

Program warstwy transportowej:

1. Zabić proces programu warstwy tranportowej przy użyciu polecenia kill.

Program aplikacji klienckiej:

2. Zabić proces programu klienta przy użyciu polecenia kill.

Opis pliku konfiguracyjnego init-1.ini

Przykładowa zawartość pliku init-1.ini przedstawiona jest na Listingu 21.

Listing 21: Plik iniput-1.ini

[Address]

152

Rys. 40: Klient - GUI

background image

MY_ADDRESS: fec0::1:2
DEST_ADDRESS: fec0::1:3
DELAY_PORT: 6665
DIRECT_PORT: 6661
PRIORITY_PORT: 6666
CLIENT_SENDER_PORT: 23000
CLIENT_RECEIVER_PORT: 23002

[Transport]
MAX_PAYLOAD=1360
MAX_DELAY=0.020
DIRECT_TYPE=0

[Log]
LOG_ALL_PACKET: 1

[Others]
NUM_OF_PACKETS: 10000
DELAY_LOOP: 100000

Znaczenie poszczególnych pól pliku input-1.ini:

MY_ADDRESS – adres IPv6 komputera

DEST_ADDRESS – adres IPv6 komputera warstwy transportowej do której będą wysyłane

dodatkowe pakiety generowane przez warstwę transportową

DELAY_PORT – numer portu na który wysyłane są dodatkowe pakiety dla priorytetu 2

DIRECT_PORT – numer portu na który wysyłane są dodatkowe pakiety dla priorytetu 3

-PRIORITY_PORT – numer portu na który wysyłane są dodatkowe pakiety dla priorytetu 4

-CLIENT_SENDER_PORT – numer portu na którym warstwa transportowa nasłuchuje na

podłączenie się klienta, jest to kanał do wysyłania wiadomości od klienta do warstwy

transportowej

-CLIENT_RECEIVER_PORT – numer portu na którym warstwa transportowa nasłuchuje na

podłączenie się klienta, jest to kanał do przesyłania klientowi wiadomości odebranych przez

warstwę transportową

-MAX_PAYLOAD – maksymalna długość pakietu wychodzącego do którego zostanie

doklejony nagłówek hop-by-hop

-MAX_DELAY – czas po którym wysyłane sa dodatkowe pakiety dla priorytetu 2

153

background image

-DIRECT_TYPE – typ mechanizmu potwierdzenia dla priorytetu 4, wartość 0 oznacza

mechnizm potwierdzenia drugiego typu, wartość 1 oznacza mechanizm potwierdzenia

pierwszego typu

-LOG_ALL_PACKET – włączenie logowania wszystkich pakietów przychodzących i

wychodzących, wartość 1 oznacza, że logowane są do pliku server3b.txt i server5b.txt

wszystkie pakiety przekazywane przez jądro do programu, zarówno wychodzące jak i

przychodzące, wartość 0 oznacza że pakiety nie są logowane

-NUM_OF_PACKETS – maksymalna liczba wiadomości, które przetworzy warstwa

transportowa, po tej liczbie program przestanie przetwarzać nowe wiadomości

-DELAY_LOOP – maksymalna liczba przejścia przez pętlę wątku, który wysyła dodatkowe

wiadomości dla priorytetu 2, uruchomienie nowego przejścia przez pętlę odbywa się co okres

czasu ustawiony w parametrze MAX_DELAY

Opis pliku konfiguracyjnego init-2.ini

Przykładowa zawartość pliku init-2.ini przedstawiona jest na Listingu 22.

Listing 22: Plik input2-2.ini

[Address]
MY_ADDRESS: fec0::1:2
CLIENT_SENDER_PORT: 23000
CLIENT_RECEIVER_PORT: 23002

[Signal]
CONSTANT_TIME_SLEEP: 0.030
RANDOM_MIN_FLOAT: 0.045
RANDOM_MAX_FLOAT: 0.085
CONSTANT_TIME_FAST: 0.020
FAST_MODE_MIN_COUNT: 100
FAST_MODE_MAX_COUNT: 200
SLOW_MODE_MIN_FLOAT: 1.0
SLOW_MODE_MAX_FLOAT: 1.1

[Others]
NUM_OF_PACKETS: 1000

Znaczenie poszczególnych pól pliku input-1.ini:

- MY_ADDRESS – adres IPv6 komputera

154

background image

-CLIENT_SENDER_PORT – numer portu na którym warstwa transportowa nasłuchuje na

podłączenie się klienta, jest to kanał do wysyłania wiadomości od klienta do warstwy

transportowej

-CLIENT_RECEIVER_PORT – numer portu na którym warstwa transportowa nasłuchuje na

podłączenie się klienta, jest to kanał do przesyłania klientowi wiadomości odebranych przez

warstwę transportową

-CONSTANT_TIME_SLEEP – parametr sygnału typu constant, odstęp pomiędzy kolejnymi

wiadomościami

-RANDOM_MIN_FLOAT – parametr sygnału typu random, minimalna wartość generatora

losowego odstępu czasu

-RANDOM_MAX_FLOAT – parametr sygnału typu random, maksymalna wartość

generatora losowego odstępu czasu

-CONSTANT_TIME_FAST – parametr sygnału typu snmp-like, odstęp pomiędzy kolejnymi

wiadomościami w serii

-FAST_MODE_MIN_COUNT – parametr sygnału typu snmp-like, minimalna liczba

wiadomości w serii

-FAST_MODE_MAX_COUNT – parametr sygnału typu snmp-like, maksymalna liczba

wiadomości w serii

-SLOW_MODE_MIN_FLOAT – parametr sygnału typu snmp-like, minimalna wartość

generatora losowego odstępu czasu

-SLOW_MODE_MAX_FLOAT – parametr sygnału typu constant, maksymalna wartość

generatora losowego odstępu czasu

-NUM_OF_PACKETS – liczba wiadomości, które wygeneruje klient

Obsługa GUI aplikacji klienta

Na Rys. 40 przedstawiono okno aplikacji klienta. Znaczenie poszczególnych fragmentów

GUI:

Obszar Signal składa się z następujących pól:

- check box Generate – uruchamia generowanie i wysyłanie wiadomości do serwera dla

sygnału opisanego przez ustawienia pól z obszaru Signal: Opt Type, Priority, Signal oraz z

wartościami parametrów z pliku wsadowego input-1.ini

- pole wyboru wartości Opt Type - numer opcji, który będzie nadany przesyłanym danym

w formacie TLV upakowanym w nagłówku hop-by-hop

155

background image

- pole wyboru Priority – priorytet przesłania danych, który będzie nadany wygenrowanym

wiadomościom

- pole wyboru Signal – wybór typu sygnału

Obszar Statistic składa się z następujących pól:

- etykieta Packet generated – szacowana liczba wysłanych wiadomości do serwera

- etykieta Packet received – szacowana liczba odebranych wiadomości od serwera

- etykieta Packet waiting for send – szacowana liczba wiadomości oczekujących na wysłanie

do serwera

Obszar Client-Server communication składa się z dwóch podobszarów: Client->Server i

Server<-Client.

Podobszar Client->Server składa się z następujących pól:

- checkbox Connect to Server – uruchamia połączenie do wysyłania wiadomości między

klientem i serwerem wykorzystując parametry ustawione w polach Host i Port

- etykieta Host – ustawiony adres serwera

- etykieta Port – ustawiony port serwera

- pole do wprowadzania Host – pole do wprowadzenia adresu serwera

- pole do wprowadzania Port – pole do wprowadzenia portu serwera

Podobszar Client<-Server składa się z następujących pól:

- checkbox Connect to Server – uruchamia połączenie do odbierania wiadomości między

klientem i serwerem wykorzystując parametry ustawione w polach Host, Port i Check

Interval (s).

- pole do wprowadzenia List Opt Types – lista numerów opcji oddzielonych przecinkiem,

które będą przekazywane przez serwer do klienta

- etykieta Host – ustawiony adres serwera

- etykieta Port – ustawiony port serwera

- pole do wprowadzania Host – pole do wprowadzenia adresu serwera

- pole do wprowadzania Port – pole do wprowadzenia portu serwera

156

background image

Załącznik B. Zawartość płyty CD dołączonej do pracy.

⁃ app - kod źródłowy programu testowego

⁃ app/resultAnalyzer2-v2.py - skrypt w języku Python do analizowania logów

programu, generuje wykresy, które zostały wykorzystane w pracy

⁃ doc - tekst pracy w formacie pdf i odt

⁃ app-cpp - kod źródłowy implementacji dodawania nagłówka hop-by-hop z użyciem

biblioteki libnetfilter_queue, napisany w języku C++

⁃ app-kernel – zmodyfikowane pliki jądra systemu Linux w wersji ..., które umożliwiają

nadawanie i odbieranie wiadomości wykorzystując nagłówek hop-by-hop

⁃ app-warf – fragment wstępnej wersji implementacji, wykorzystującej zaczepy,

związanej z projektem EFIPSANS

⁃ kod źródłowy bibliotek, które były zainstalowane na komputerze ze źródeł:

app-depend/dpkt-1.7 - dpkt

app-depend/iptables-1.4.10 - iptables

app-depend/libnfnetlink-1.0.0.tar.bz2 - libnfnetlink

app-depend/libnfnetlink-1.0.0.tar.bz2 - libnetfilter_queue

app-depend/nfqueue-bindings-0.3.tar.gz - nfqueue-bindings

157


Document Outline


Wyszukiwarka

Podobne podstrony:
5a 6 5 2 5 Lab Rozwiązywanie problemów związanych z trasami statycznymi IPv4 oraz IPv6
IPv4 oraz IPv6, Prace - dokumenty
8 2 5 4 Lab Identifying IPv6?dresses
lab2 IPv6
IPv6 2 Datagram IPv6
8 2 5 5 Lab Configuring IPv6?dresses on Network?vices
IP v 6, IPv6
Protokol internetowy IPv6
IPv6 4 Neighbor Discovery
IPv6 r6
0 0 0 2 Lab Installing the IPv6 Protocol with Windows XP
Czy IPv6 SEIP2013
8 3 2 8 Packet Tracer Troubleshooting IPv4 and IPv6?dressing Instructions
IPv6 3 ICMPv6
IPV6 RIP
8 3 2 5 Packet Tracer Verifying IPv4 and IPv6?dressing Instructions
8 2 5 4 Lab Identyfikowanie adresow IPv6 id (2)
IPv6 Lekturka

więcej podobnych podstron