Rozdział 4
Rozszerzenie funkcjonalności programu
4.1 Tworzenie map
4.1.1 Konstrukcja topologii sieci
4.1.2 Wstępna konfiguracja mapy
4.1.3 Przykład konstrukcji mapy
4.2 Implementacja protokołu informowania
o trasach
4.3 Wizualizacja protokołu TCP
Program zaprojektowano w taki sposób, by umożliwić jego łatwą rozbudowę.
W prosty sposób, posługując się przygotowaną biblioteką metod, można stworzyć
aplet symulujący sieć IP o dowolnej topologii. Najpoważniejszym ograniczeniem
jest tu wielkość ekranu i moc obliczeniowa komputera, na którym aplet będzie
wykonywany. Większego nakładu pracy wymaga napisanie modułów symulujących
inne protokoły rodziny TCP/IP. Wydaje się, że najciekawsza byłaby symulacja
protokołu dynamicznego informowania o trasach lub protokołu TCP.
4.1 Tworzenie map
Program został tak zaprojektowany, by umożliwić ułożenie mapy o dowolnej
topologii. Podczas realizacji powstało jednak kilka ograniczeń poprawiających
czytelność mapy:
-
dany węzeł może być włączony do danej sieci tylko jednym portem;
-
szyny nie mogą mieć ukośnego położenia,
-
jednego węzła nie należy podłączać do więcej niż czterech szyn ethernetowych
umieszczonych z czterech stron węzła,
-
linie i szyny nie powinny się krzyżować,
-
linie łączące węzły z szyną są do niej prostopadłe.
Najwiekszą trudnością przy tworzeniu mapy jest właściwe rozmieszczenie
elementów, tak by nie zachodziły one na siebie. Aplikacja nie potrafi wykryć
błędnego rozłożenia elementów mapy. Użyteczna byłaby więc realizacja graficznego
narzędzia typu WYSIWYG (What You See Is What You Get) pozwalającego
w łatwy sposób zaplanować wygląd mapy.
Tworzenie mapy można podzielić na dwa zadania:
-
konstrukcję topologii sieci -- rozmieszczenie i połączenie elementów,
-
prekonfigurację elementów sieci -- przypisanie adresów do interfejsów i
wprowadzenie pozycji do tablic tras.
Spis rzeczy Początek
rozdziału
4.1.1 Konstrukcja topologii sieci
Aby utworzyć własną mapę należy napisać klasę dziedziczącą po klasie
Framework.
Nowy obiekt musi posiadać metodę
public void arrangeMap()
w której należy użyć opisanych poniżej metod klasy Framework.
Metoda createHost()
Składnia:
public Host
createHost(String name, int nEthernet, int nSerial, int x, int y)
Parametry:
-
name - nazwa węzła (dowolny napis),
-
nEthernet - liczba portów ethernetowych,
-
nSerial - liczba portów szeregowych,
-
x, y - współrzędne środka węzła.
Opis:
Metoda służy do stworzenia elementu symulującego węzeł sieci. Przy
tworzeniu węzła należy określić rodzaj i maksymalną liczbę portów, którą
ma on posiadać. Ikona symbolizująca węzeł jest kwadratem o boku 30 pikseli.
Jej rodzaj zależy od liczby zadeklarowanych portów. Węzły posiadające dokładnie
jeden port są symbolizowane przez ikonę przedstawiającą komputer typu PC,
a węzły o większej liczbie portów (rutery) -- przez ikonę z krzyżującymi
się strzałkami. Metoda przekazuje dowiązanie do stworzonego węzła.
Metoda createBus()
Składnia:
public EtherNet
createBus(String name, int buflen, boolean isveritcal,
int lowend, int highend, int position)
Parametry:
-
name - nazwa sieci (dowolny napis),
-
buflen - długość bufora pakietów,
-
isvertical - flaga wskazująca położenie szyny na mapie: jeśli
true
-- to szyna jest pionowa, w przeciwnym razie pozioma,
-
lowend, highend, position - współrzędne końców szyny.
Opis:
Metoda służy do stworzenia elementu symulującego sieć rozgłoszeniową.
Interpretacja parametrów
lowend,
highend, position zależy od parametru
isvertical.
Jeśli szyna jest pionowa, to jej końce mają współrzędne
(position,lowend)
i (position, highend), w przeciwnym przypadku odpowiednio (lowend,
position) i (highend, position). Metoda przekazuje dowiązanie
do stworzonego obiektu.
Metoda createLine()
Składnia:
public SerialLine
createLine(String name, int buflen, Host end1, Host end2)
Parametry:
-
name - nazwa linii (dowolny napis),
-
end1, end2 - węzły, które mają być połączone linią szeregową.
Opis:
Metoda tworzy obiekt SerialLine symulujący linię szeregową,
łączący ze sobą dwa węzły. Linia symbolizująca obiekt na mapie jest położona
na odcinku łączącym środki dwu węzłów. Jeżeli któryś z węzłów nie posiada
wolnego portu szeregowego, to jest generowany wyjątek IllegalArgumentException.
Metoda przekazuje dowiązanie do utworzonego obiektu.
Metoda connectToBus()
Składnia:
public Port
connectToBus(EtherNet net, Host host)
Parametry:
-
net - sieć, do której chcemy podłączyć węzeł,
-
host - węzeł, który chcemy podłączyć.
Opis:
Metoda łączy węzeł z szyną ethernetu. Jeżeli węzeł nie posiada wolnego
portu ethernetowego, to jest generowany wyjątek IllegalArgumentException.
Należy zadbać o to, by odpowiednia współrzędna (x dla szyn poziomych, y
dla pionowych) środka węzła zawierała się pomiędzy współrzędnymi końców
szyny. Metoda przekazuje dowiązanie do portu łaczącego węzeł z ethernetem.
Spis rzeczy Początek
rozdziału
4.1.2 Wstępna konfiguracja mapy
Konfiguracja mapy sprowadza się do dwu czynności: zaadresowaniu portów
i modyfikacji tablicy tras węzłów. Pierwsza z nich wymaga posiadania dowiązania
do portu, który ma zostać zaadresowany. W przypadku portów dołączonych
do ethernetu dowiązanie takie przekazuje omawiana wyżej metoda
connectToBus(). Aby znaleźć port łączący węzeł z linią szeregową
należy użyć metody findPort() zdefiniowanej w klasie Host.
Następnie dla znalezionego portu należy wywołać
setAddress().
Metoda Host.findPort()
Składnia:
public Port
findPort(Net net)
Parametry:
-
net - dowiązanie do sieci, do której jest dołączony port;
Opis:
Wynikiem działania metody jest dowiązanie do portu podłączonego do
sieci net i należącego do węzła, dla którego metoda została wywołana.
Jeśli taki port nie zostanie znaleziony, to jest przekazywana wartość null.
Metoda jest uniwersalna -- działa zarówno dla portów szeregowych, jak i
ethernetowych.
Metoda Port.setAddress()
Składnia:
public boolean
setAddress(String ip, String mask)
Parametry:
-
ip - adres sieci w notacji kropkowej,
-
mask - maska podsieci. Wartość null lub pusty napis jest interpretowany
jako brak maski podsieci.
Opis:
Metoda przypisuje adres IP do interfejsu, dla którego jest wykonywana.
Adres nie może być identyczny z już przypisanym do innego interfejsu tego
samego węzła. W przypadku podania błędnych parametrów jest generowany wyjątek
klasy
InvalidArgumentException. Metoda wpisuje pozycje dotyczące
konfigurowanej sieci do tabeli tras.
Konfiguracji tablicy tras dokonują metody zdefiniowane w klasie Host.
Metoda addRoute dodaje zwykłą pozycję, zaś addDefRoute
służy do wprowadzenia trasy domyślnej.
Metoda Host.addRoute() i Host.addDefRoute
Składnia:
public boolean
addRoute(String net, String mask, String gateway)
public boolean
addDefRoute(String gateway)
Parametry:
-
net -- adres sieci,
-
mask -- maska podsieci,
-
gateway -- adres rutera.
Opis:
Metody dodają pozycję do tablicy tras węzła. Adres rutera musi być
osiągalny bezpośrednio dla węzła, który wykonuje metodę. Dlatego przed
jej wywołaniem należy skonfigurować adres IP interfejsu, do którego jest
podłączona sieć zawierająca ruter. Jeśli któryś z parametrów nie ma formy
notacji kropkowej właściwej dla adresu IP, to metody generują wyjątek IllegalArgumentException,
zaś w przypadku podania błędnego bądź nieosiągalnego adresu rutera przekazują
wartość false.
Spis rzeczy Początek
rozdziału
4.1.3 Przykład konstrukcji mapy
Poniżej przedstawiono kod klasy tworzący mapę widoczną na rys. 4.1
/*****************************************************************************
* Demo.java
* Przykład konstrukcji mapy
*/
import ips.*;
public class Demo extends Framework
{
Host a1, a2, a3, b1, b2, b3, c1, c2, c3;
EtherNet a, b, c;
SerialLine ab, bc, ac;
public void arrangeMap()
{
// tworzenie węzłów sieci po lewej stronie mapy
a1= createHost("A1",
1, 0, 40, 190);
a2= createHost("A2",
1, 0, 40, 280);
a3= createHost("A3",
1, 2, 90, 270);
// tworzenie węzłów sieci u góry mapy
b1= createHost("B1",
1, 0, 140, 40);
b2= createHost("B2",
1, 0, 200, 40);
b3= createHost("B3",
1, 2, 150, 160);
// tworzenie węzłów sieci po prawej stronie mapy
c1= createHost("C1",
1, 1, 250, 160);
c2= createHost("C2",
1, 1, 260, 270);
c3= createHost("C3",
1, 0, 330, 200);
// tworzenie sieci ethernetowych
a= createBus("A", 10,
true, 160, 300, 65);
b= createBus("B", 10,
false, 120, 220, 80);
c= createBus("C", 10,
true, 120, 300, 300);
// tworzenie linii szeregowych
ab= createLine("AB",
10, a3, b3);
bc= createLine("BC",
10, b3, c1);
ac= createLine("AC",
10, a3, c2);
// podłączanie węzłów do sieci ethernetowych
connectToBus(a, a1);
connectToBus(a, a2);
connectToBus(a, a3);
connectToBus(b, b1);
connectToBus(b, b2);
connectToBus(b, b3);
connectToBus(c, c1);
connectToBus(c, c2);
connectToBus(c, c3);
} // arrangeMap()
} // public class Demo
Rysunek 4.1: Obraz mapy tworzonej przez klasę Demo
|
Spis rzeczy Początek
rozdziału
4.2 Implementacja protokołu informowania o trasach
Opisywany program warto wzbogacić o symulację protokołu dynamicznego wyznaczania
tras. Wymagałoby to dodania dodatkowych wątków czuwających nad aktualizacją
tablic tras w węzłach, generujących i odbierających komunikaty aktualizujące
trasy.
Program powinien zostać wzbogacony o następujące funkcje:
-
konfigurowanie protokołu wyznaczania tras: wyznaczanie relacji sąsiedztwa
pomiędzy ruterami,
-
możliwość śledzenia procesu uczenia się topologii sieci przez węzły oraz
zmian w tablicy tras,
-
możliwość różnicowania wydajności (prędkości transmisji) poszczególnych
sieci,
-
symulowanie awarii łącza, węzła lub portu,
-
obserwację procesu reakcji sieci na zdarzenie.
Ciekawym rozszerzeniem byłaby możliwość konfigurowania jakości protokołów.
Dotyczy to szczególnie protokołów wykorzystujących algorytm wektor-odległość,
takich jak RIP. W podstawowej wersji protokół ten posiada bowiem wiele
wad, eliminowanych przez dodatkowe mechanizmy, np. dzielenie horyzontu
(ang. split horizont). Inną możliwością jest porównanie działania
algorytów wektor-odległość z algorytmami wyboru najkrótszej ścieżki, w
szczególności sposobu reakcji na awarie w sieci.
Symulacja protokołu informowania o trasach wymaga jednak rozwiązania
problemów, takich jak wizualizacja procesów przebiegających jednocześnie
w całej sieci oraz prezentacja zawartości dużych pakietów.
Spis rzeczy Początek
rozdziału
4.3 Wizualizacja protokołu TCP
Równie interesującym rozszerzeniem funkcjonalności programu może byc wizualizacja
protokołu TCP, a przede wszystkim jego mechanizmów:
-
nawiązywania i zrywania połączenia (np. w formie graficznego diagramu stanów),
-
sterowania przepływem: przesuwających się okien, kumulacyjnych potwierdzeń
i algorytmu Karna.
Aby dobrze pokazać sterowanie przepływem należy umożliwić zmienianie przez
użytkownika przepustowości i jakości łączy (np. losowo usuwać pakiety przechodzące
przez daną sieć, sterować priorytetem wątków i prędkością animacji).
Trudnością w implementacji TCP jest złożoność oprogramowania. Kod realizujący
TCP jest dłuższy i posiada dwa razy więcej funkcji i procedur niż kod protokołów
IP, ICMP, UDP i ARP razem wziętych [2].