Preskoči na sadržaj

Slaganje složenijih topologija u simulaciji računalnih mreža

Topologija zvijezde i proširene zvijezde

Topologije mreža koje srećemo u praksi najčešće nisu jednostavne kao ovdje navedene na kojima učimo načela i metode simulacije. Međutim, ns-3 je vrlo fleksibilan, odnosno ne ograničava korisnika u slaganju topologije, i skalabilan, odnosno omogućuje slaganje simulacija reda veličine tisuću čvorova i više.

Najjednostavnija topologija zvijezde koja nije istovremeno i linearna je oblika "zvijezde s tri kraka", odnosno

           n3
           /
          /
n1 ----- n2
          \
           \
           n4

i u ns-3-u se slaže istom logikom kao i linearna topologija: prvo stvorimo kontejner allNodes sa 4 čvora. Zatim u kontejner nodes12 stavljamo čvorove n1 i n2, u kontejner nodes23 čvorove n2 i n3 te u kontejner nodes24 čvorove n2 i n4. Sve čvorove pritom dohvaćamo iz allNodes.

NodeContainer allNodes;
allNodes.Create (4);
NodeContainer nodes12 (allNodes.Get (0), allNodes.Get (1));
NodeContainer nodes23 (allNodes.Get (1), allNodes.Get (2));
NodeContainer nodes24 (allNodes.Get (1), allNodes.Get (3));

Nešto složeniji primjer bila bi proširena zvijezda oblika

                    n4 ----- n5
                    /
                   /
n1 ----- n2 ----- n3
                   \
                    \
                    n6 ----- n7

i u ns-3-u je za nju potrebno imati šest kontejnera (obzirom da nam kontejner služi za jednostavniju instalaciju point-to-point veze među čvorovima). Dobivamo je analogno prethodnom primjeru, s time da imamo

  • u kontejneru nodes12 čvorove n1 i n2,
  • u kontejneru nodes23 čvorove n2 i n3,
  • u kontejneru nodes34 čvorove n3 i n4,
  • u kontejneru nodes45 čvorove n4 i n5,
  • u kontejneru nodes36 čvorove n3 i n6,
  • u kontejneru nodes67 čvorove n6 i n7.
NodeContainer allNodes;
allNodes.Create (7);
NodeContainer nodes12 (allNodes.Get (0), allNodes.Get (1));
NodeContainer nodes23 (allNodes.Get (1), allNodes.Get (2));
NodeContainer nodes34 (allNodes.Get (2), allNodes.Get (3));
NodeContainer nodes45 (allNodes.Get (3), allNodes.Get (4));
NodeContainer nodes36 (allNodes.Get (2), allNodes.Get (5));
NodeContainer nodes67 (allNodes.Get (5), allNodes.Get (6));

Još jedan vrlo zanimlji primjer topologije zvijezde je

    n4  n3
     \  /
      \/
n5 -- n1 -- n2
      /\
     /  \
    n6  n7

U programskom kodu to je

NodeContainer allNodes;
allNodes.Create (7);
NodeContainer nodes12 (allNodes.Get (0), allNodes.Get (1));
NodeContainer nodes13 (allNodes.Get (0), allNodes.Get (2));
NodeContainer nodes14 (allNodes.Get (0), allNodes.Get (3));
NodeContainer nodes15 (allNodes.Get (0), allNodes.Get (4));
NodeContainer nodes16 (allNodes.Get (0), allNodes.Get (5));
NodeContainer nodes17 (allNodes.Get (0), allNodes.Get (6));

Instalacija point-to-point veza, postavljanje IP adresa i instalacija aplikacija ide potpuno analogno kao u prethodnom primjeru te je ostavljena kao vježba za čitatelja.

Topologija bučice

Topologija bučice (engl. dumbell) je vrlo često korištena podvrsta zvjezdaste topologije, zbog čega ćemo je detaljnije analizirati. U općenitom slučaju ona se sastoji od dva usmjerivača povezana vezom tipa točka-do-točke na koje su zatim povezani domaćini. Najjednostavniji primjer topologije bučice je ona koja ima dva usmjerivača (označenih s n2 i n3) s po dva domaćina.

n1 ----\              /---- n5
        \            /
        n3 -------- n4
        /            \
n2 ----/              \---- n6
NodeContainer allNodes;
allNodes.Create (6);
NodeContainer nodes13 (allNodes.Get (0), allNodes.Get (2));
NodeContainer nodes23 (allNodes.Get (1), allNodes.Get (2));
NodeContainer nodes34 (allNodes.Get (2), allNodes.Get (3));
NodeContainer nodes45 (allNodes.Get (3), allNodes.Get (4));
NodeContainer nodes46 (allNodes.Get (3), allNodes.Get (5));

PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("50ms"));

NetDeviceContainer devices13, devices23, devices34, devices45, devices46;
devices13 = pointToPoint.Install (nodes13);
devices23 = pointToPoint.Install (nodes23);
devices45 = pointToPoint.Install (nodes45);
devices46 = pointToPoint.Install (nodes46);

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("2Mbps"));
devices34 = pointToPoint.Install (nodes34);

Dodjela adresa vrši se na isti način kao i ranije.

InternetStackHelper stack;
stack.Install (allNodes);

Ipv4InterfaceContainer interfaces13, interfaces23, interfaces34, interfaces45, interfaces46;

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
interfaces13 = address.Assign (devices13);

address.SetBase ("10.1.2.0", "255.255.255.0");
interfaces23 = address.Assign (devices23);

address.SetBase ("10.1.3.0", "255.255.255.0");
interfaces34 = address.Assign (devices34);

address.SetBase ("10.1.4.0", "255.255.255.0");
interfaces45 = address.Assign (devices45);

address.SetBase ("10.1.5.0", "255.255.255.0");
interfaces46 = address.Assign (devices46);

Dodatak: slaganje složenijih topologija većih razmjera

Modul point-to-point-layout pomaže nam u stvaranju topologija sa više čvorova raspoređenih u određenom obliku. Ns-3 implementira tri takve topologije:

  • Dumbbell (hrv. bučica) topologiju sa PointToPointDumbbellHelper (dokumentacija)
  • Grid (hrv. rešetka) topologiju sa PointToPointGridHelper (dokumentacija) te
  • Star (hrv. zvijezda) topologiju sa PointToPointStarHelper (dokumentacija)

Kao što smo već vidjeli, topologija bučice ima jednu središnju vezu, a na svakom od krajnjih čvorova određeni broj čvorova povezanih na krajnji čvor. Broj čvorova da desne i lijeve strane bučice ne mora biti isti.

    n4  n3       n8   n9
     \  /         \   /
      \/           \ /
n5 -- n1 ---------- n2 -- n10
      /\           / \
     /  \         /   \
    n6  n7      n11   n12

Kod toplogije rešetke susjedni čvorovi povezani su tako da tvore rešetkastu strukturu.

n11 -- n12 -- n13 -- n14
 |      |      |      |
 |      |      |      |
n21 -- n22 -- n23 -- n24
 |      |      |      |
 |      |      |      |
n31 -- n32 -- n33 -- n34

Topologija zvijezde stvara se na način koji smo već spomenuli; na jedan središnji čvor povežemo najmanje tri čvora tako da izgledom podsjećaju na zvijezdu.

    n4  n3
     \  /
      \/
n5 -- n1 -- n2
      /\
     /  \
    n6  n7

Zaglavlje u kojem se nalaze pomoćnici za kreiranje ovakvih složenih topologija je point-to-point-layout-module.h te ga je potrebno uključiti u naš programski kod linijom:

#include <ns3/point-to-point-layout-module.h>

Nakon što smo to učiniti spremni smo za kreiranje bilo koje od tri prethodno navedene topologije.

Složenija topologija bučice

Kreiranje topologije bučice radimo na način da odredimo broj čvorova sa lijeve i broj čvorova sa desne strane središnja dva čvora, a da bismo olakšali kasniju izmjenu samog broja čvorova spremimo vrijednosti u varijable.

uint32_t nLeftLeaf = 3;
uint32_t nRightLeaf = 7;

Zatim kreiramo point-to-point veze već poznatim pomoćnikom PointToPointHelper.

PointToPointHelper pointToPointRouter;
pointToPointRouter.SetDeviceAttribute ("DataRate", StringValue ("100Mbps"));
pointToPointRouter.SetChannelAttribute ("Delay", StringValue ("1ms"));

PointToPointHelper pointToPointLeaf;
pointToPointLeaf.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
pointToPointLeaf.SetChannelAttribute ("Delay", StringValue ("2ms"));

Na kraju je samo preostalo pozvati pomoćnik PointToPointDumbbellHelper sa odgovarajućim parametrima te dodijeliti kreiranim čvorovima adrese. U dodjeljivanju adresa pomaže nam metoda AssignIpv4Addresses koja prima tri parametra, prvi parametar je adresni prostor lijevog dijela bučice, drugi desnog dijela, a treći središnjeg. Za kreiranje adresnog prostora koristimo već poznati pomoćnik Ipv4AddressHelper.

PointToPointDumbbellHelper d (nLeftLeaf, pointToPointLeaf, nRightLeaf, pointToPointLeaf, pointToPointRouter);

InternetStackHelper stack;
d.InstallStack (stack);

d.AssignIpv4Addresses (Ipv4AddressHelper ("10.1.1.0", "255.255.255.0"),
                       Ipv4AddressHelper ("10.2.1.0", "255.255.255.0"),
                       Ipv4AddressHelper ("10.3.1.0", "255.255.255.0"));

Instalacija aplikacija vrši se kao i u prethodnim primjerima uz preporuku da se koriste petlje ukoliko želimo aplikacije na više čvorova.

Topologija rešetke

Kod kreiranja topologije rešetke polazimo od određivanja broja redaka i broja stupaca (primjetite da se zapravo kreira matrica čvorova).

uint32_t nRows = 4;
uint32_t nCols = 5;

Potom je potrebno kreirati pomoćnik za stvaranje point-to-point veza koji će biti između svaka dva čvora kao što smo kreirali i kod topologije bučice.

PointToPointHelper pointToPointGrid;
pointToPointGrid.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
pointToPointGrid.SetChannelAttribute ("Delay", StringValue ("5ms"));

Sada pozivamo pomoćnik za kreiranje grid topologije. Nakon kreiranja same topologije dodjeljujemo joj adresni prostor na način da pozivamo metodu AssignIpv4Addresses. Prvi parametar te metode je adresni prostor redaka, a drugi adresni prostor stupaca.

PointToPointGridHelper g (nRows, nCols, pointToPointGrid);

InternetStackHelper stack;
g.InstallStack (stack);

g.AssignIpv4Addresses (Ipv4AddressHelper ("10.1.1.0", "255.255.255.0"),
                       Ipv4AddressHelper ("10.2.1.0", "255.255.255.0"));

Topologija zvijezde

Najjednostavnije kreiranje ima topologija zvijezde s obzirom da pomoćnik prima samo dva parametra, prvi je broj krakova koje kreirana zvijezda ima, a drugi naravno veza koja će biti između pojedinih čvorova. Jedino što moramo paziti da se kreiranjem n krakova zvijezde zapravo kreira n + 1 čvorova ukupno u topologiji iz razloga što se središnji čvor nužno kreira. U primjeru kreiramo 6 krakova, dakle 7 čvorova ukupno.

uint32_t numSpokes = 6;

PointToPointHelper pointToPointStar;
pointToPointStar.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
pointToPointStar.SetChannelAttribute ("Delay", StringValue ("1ms"));

PointToPointStarHelper s (numSpokes, pointToPointStar);

InternetStackHelper stack;
s.InstallStack (stack);

s.AssignIpv4Addresses (Ipv4AddressHelper ("10.1.1.0", "255.255.255.0"));

Ovaj smo primjer već stvorili i ručno, te je moguće usporediti programski kod obaju varijanti.

Author: Ivan Ivakić, Vedran Miletić