Zadáním této práce je v simulačním prostředí Omnet++ namodelovat síť s cykly a zjistit její chování v případě, že není v činnosti Spanning Tree Algoritmus.
Pro řešení úlohy jsem použil framework INET, který obsahuje vytvořené komponenty, jako je switch, síťový klient, sběrnice a podobně. Jeho kompilace nebyla zcela triviální (nepodařilo se mi mu vnutit include adresáře). Pro další zájemce nechť poslouží následující "kuchařku":
Dále jsem využil několika příkladů z INET Framework
V jazyce NED jsem si nejprve vytvořil základní model sítě. Nejdříve s jedním switchem, protože jsem chtěl porovnávat běh sítě, která je bez cyklů se sítí s cykly. Pak jsem model rozšířil o druhý switch (tvořící cyklus) a simulaci prováděl na něm. Podobu modelu jsem tvořil v nástroji GNED.
V modelu sítě se nalézejí dvě klientské stanice(host1, host2) a jeden server. Z hlediska implementace jsou si tyto stanice rovnocenné, všechny
jsou realizovány za pomocí modulu EtherHost, který je převzat z příkladu LANs (viz. adresář INET\Examples\Ethernet\LANs). Komunikace
probíha na úrovni ethernetových rámců (adresace je realizována automaticky generovanými MAC adresami). Stanice host1 a host2 posílají rámce serveru
a server posílá rámce stanici host1.
Sběrnice jsou vytvořeny pomocí modulu EtherBus. Rámce přeposílá všem připojeným zařízením v pořadí dle vzdáleností na sběrnici.
Switch je vytvořen za pomoci modulu EtherSwitch. Bylo pouze potřeba navýšit txQueueLimit (maximální délka fronty) z 1000 na 10000.
Pro sledování délky fronty switche je třeba upravit soubory EtherMAC.cc a EtherMAC.h:
WATCH(QueueLengths);
QueueLengthVector.setName("LengthOfQueue");
Upravení hodnot proměnných v těle metody printState():QueueLengths=txQueue.length();
QueueLengthVector.record(txQueue.length());
Zapsání skalárních hodnot v těle metody finish():recordScalar("LengthOfQueue",QueueLengths);
Dobu simulace jsem nastavil na 500 sekund. Výsledky se vždy výsledky zapíší do souborů omnetpp.sca a omnetpp.vec.
síť bez cyklu | síť s cyklem | ||
Čas simulace | 499,9635s | 499,9996s | |
Host1 | odeslaných rámců | 2152 | 5894 |
přijatých rámců | 4145 | 154310 | |
max. doba přenosu | 0.01192845s | 8.341480s | |
prům. doba přenosu | 0.00406966s | 1.307561s | |
Host2 | odeslaných rámců | 517 | 450 |
přijatých rámců | 5780 | 159754 | |
max. doba přenosu | 0.01182927s | 14.591198s | |
prům. doba přenosu | 0.00404274s | 2.6586159s | |
Server | odeslaných rámců | 3628 | 8638 |
přijatých rámců | 2669 | 150265 | |
max. doba přenosu | 0.01052685s | 11.440701s | |
prům. doba přenosu | 0.00415091s | 1.1834192s |
V síti s cyklem dochází na sběrnici k duplikaci rámců. Počet přijatých rámců několika násobně převyšuje počet odeslaných oproti síti bez cyklu, kde se počet odeslaných rámců hosty se rovná počtu přijatých serverem.
V síti s cyklem rapidně roste doba přenosu rámce, jak roste počet duplikovaných rámců. U sítě bez cyklu je doba přenosu packetu asi 300x menší.
Zde je graf znázorňující počet rámců zahozených, protože jim nepatřily. Je zřejmé, že sběrnice doručuje Hostu1 rámce určené i pro Host2 a Server.
V důsledku cyklu se ovšem k Serveru dostanou i rámce, které mu nepatří. Tento fakt je způsoben zmatením switchů v důsledku cyklu v síti a špatným nastavováním směrovacích tabulek, kdy switch dostane rámec i z druhé strany, přenastaví si v tabulce směr a potom rámec posílá špatným směrem.
Při simulaci jsem se naučil používat systém Omnet++ a INET Framework a ukázal si průběh rámců v síti s cyklem.