Kľúčové úlohy:
Čerpanie informácii zo zdrojových kódov: examples/tutorial/first.cc second.cc third.cc
Komunikácia v simulácii začína na Aplikačnej vrstve (viď obr.App2App) prechádza cez jednotlivé nižšie vrstvy ISO OSI až na Fyzickú úroveň. Prenos je následne simulovaný fyzikálnymi modelmi s parametrami ako vzdialenosť, výška, frekvencia … pre výpočet ďalších parametrov ako útlm, oneskorenie, …
V simulácii sa z toho vypočíta či je prenos úspešný alebo nie. Ak áno nastáva rozbaľovanie/dekódovanie správ v opačnom smere ISO OSI, a teda L1 až L7.
Treba si uvedomiť aj fyzickú skutočnosť – koncept NS3. Základný stavebný prvok je Uzol – Entita/nositeľ vlastností, čo je napr. PC, mobil…
Na uzol sa inštalujú sieťové zariadenia tzv. NIC (môže ich byť viac). NIC medzi sebou komunikujú na L1 vrstve v kanály (channel). Sú 3 základné typy kanálov, ktoré sa navzájom neovplyvňujú CSMA, P2P a Wifi.
Na jednotlivé NIC sa inštalujú jednotlivé vrstvy ISO OSI. Inštalácia prebieha vo forme konfigurácii parametrov.
Tieto konfigurácie môžeme rôzne pozmeniť a následne inštalovať na iné uzly/zariadenia/protokoly…
Nastavovanie (napr. mobility r.44) má vo všeobecnosti tvar („nazov ns3 triedy/podtriedy“, „nazov atributu“, hodnota, „nazov atributu“, hodnota …). Niektoré sa nastavújú priamo r.145. Alebo sa používajú statické volania konfigurácie Config::Set…(„cesta/názov triedy/podtriedy/atributu“,hodnota), ale to neskôr.
BulkSendApplication — vytváranie a posielanie dát hneď tak rýchlo, ako sa uvoľní zasobník; hlavne pre TCP socket-y.
OnOffApplication — všeobecné posielanie; CBR – Constant Bit Rate, VBR – Variable Bit Rate
PacketSink — complement pre OnOffAplication; vhodné aj pre detekciu príchodu správ napr. ICMP.
UdpClientServer, UdpEcho — generátor UDP spáv s odozvou-ozvenou.
ThreeGppHttpClientServer — generuje http správy, vhodne pre modelovanie internetu.
Internetové aplikácie:
DHCPv4Client / Server
Ping6
V4Ping — generuje ICMP správu a následne čaká na odpoveď, pričom počíta RTT.
Radvd
ďalšie 3rd: DNS …
Všetky vyššie uvedené majú pomocníkov v NS3 pre ľahšiu prácu (napr. UdpEchoClientHelper, UdpEchoServerHelper, OnOffHelper, V4pingHelper, PacketSinkHelper, PacketSocketHelper …), ikeď by sa dali použiť priamo vytváranie objektov cez tzv. „smart pointer“ <PTR> Socket a Packet.
V NS3 je možné niektoré časti simulácie vypustiť z dôvodu zjednodušenia, nakoľko tieto vrstvy budú komentované podrobnejšie neskôr. Použijú sa pomocníci pre inštaláciu konfigurácie InternetStackHelper (agregátor IP/TCP/UDP funkcionality – konfigurácia sa inštaluje na uzly a nie zariadenia!), Ipv4AddressHelper pre automatické nastavenie siete jednotlivým zariadeniam v NIC kontajnery a Ipv4InterfaceContainer pre pridelenie IP adries. Rozdistibuovanie informácii o sieťach
NS3 rozlišuje hlavne 3 druhy komunikačných kanálov:
1 |
cp examples/tutorial/third.cc scratch/ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
#include "ns3/core-module.h" #include "ns3/point-to-point-module.h" #include "ns3/network-module.h" #include "ns3/applications-module.h" #include "ns3/mobility-module.h" #include "ns3/csma-module.h" #include "ns3/internet-module.h" #include "ns3/netanim-module.h" #include "ns3/yans-wifi-helper.h" #include "ns3/ssid.h" #include "ns3/config-store-module.h" // Default Network Topology // // Wifi 10.1.3.0 // AP-R1 (eduroam) // * * * * // | | | | 10.1.1.0 R2 // n5 n6 n7 n0 -------------- n1 n2 n3 n4 // point-to-point | | | | // ================ // LAN 10.1.2.0 using namespace ns3; NS_LOG_COMPONENT_DEFINE ("cvicenie2o13"); static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktCount, Time pktInterval ){ if (pktCount > 0) { std::ostringstream sprava; sprava << "Ahoj stano "<< pktCount << '\0'; Ptr<Packet> p = Create<Packet> ( (uint8_t*)sprava.str().c_str(), (uint16_t) sprava.str().length() + 1 ); socket->Send (p); Simulator::Schedule (pktInterval, &GenerateTraffic, socket, pktCount-1, pktInterval); }else{ socket->Close (); } } int main (int argc, char *argv[]){ bool verbose = true; uint32_t nCsma = 3; uint32_t nWifi = 3; bool tracing = false; CommandLine cmd (__FILE__); cmd.AddValue ("m", "Pocet serverov", nCsma); cmd.AddValue ("n", "pocet mobilnych zariadeni", nWifi); cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose); cmd.AddValue ("tracing", "Enable pcap tracing", tracing); cmd.Parse (argc,argv); if (verbose){ LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO); } NodeContainer nP;//2 smerovace nP.Create (2); PointToPointHelper pointToPoint; pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms")); NetDeviceContainer pDevices; pDevices = pointToPoint.Install (nP); NodeContainer nS; // servery nS.Add (nP.Get (1));// R2 tiez ma NIC CSMA nS.Create (nCsma); CsmaHelper csma; csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps")); csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560))); NetDeviceContainer csmaDevices; csmaDevices = csma.Install (nS); NodeContainer nW; nW.Create (nWifi); //NodeContainer wifiApNode = nP.Get (0); MobilityHelper mobility; mobility.SetPositionAllocator ("ns3::RandomBoxPositionAllocator" ,"X", StringValue("ns3::UniformRandomVariable[Min=0.0|Max=50.0] ") ,"Y", StringValue("ns3::UniformRandomVariable[Min=0.0|Max=50.0] ") ,"Z", StringValue("ns3::ConstantRandomVariable[Constant=1.0] ") ); mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel", "Bounds", RectangleValue (Rectangle (0, 50, 0, 50))); mobility.Install (nW); mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (nP.Get (0)); mobility.Install (nS); YansWifiChannelHelper channel = YansWifiChannelHelper::Default (); YansWifiPhyHelper phy; phy.SetChannel (channel.Create ()); WifiHelper wifi; wifi.SetRemoteStationManager ("ns3::AarfWifiManager"); WifiMacHelper mac; Ssid ssid = Ssid ("eduroam"); mac.SetType ("ns3::StaWifiMac", //mobilne zariadenia "Ssid", SsidValue (ssid), "ActiveProbing", BooleanValue (false)); NetDeviceContainer staDevices; staDevices = wifi.Install (phy, mac, nW); mac.SetType ("ns3::ApWifiMac",// R1--2.NIC "Ssid", SsidValue (ssid)); NetDeviceContainer apDevices; apDevices = wifi.Install (phy, mac, nP.Get (0)); // siet vrstvu TCP/IP InternetStackHelper stack; stack.Install (nS); stack.Install (nP.Get (0)); stack.Install (nW); Ipv4AddressHelper address; address.SetBase ("10.1.1.0", Ipv4Mask("/30"));//4*IP ADSL linku Ipv4InterfaceContainer p2pInterfaces; p2pInterfaces = address.Assign (pDevices); address.SetBase ("10.1.2.0", "255.255.255.0"); address.Assign (csmaDevices); address.SetBase ("10.1.3.0", "255.255.255.0"); address.Assign (staDevices); address.Assign (apDevices); Ipv4GlobalRoutingHelper::PopulateRoutingTables (); UdpEchoServerHelper echoServer (9); Ptr<Node> src = nW.Get(0); Names::Add ("src", src); Ptr<Node> dst = nS.Get(1); Names::Add ("dst", dst); ApplicationContainer serverApps = echoServer.Install (dst); serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0)); auto ip = dst->GetObject<Ipv4>(); NS_LOG_UNCOND(ip->GetAddress(1,0).GetLocal()); UdpEchoClientHelper echoClient (ip->GetAddress(1,0).GetLocal() , 9);//0-> Kt. sietovka NIC, interface csmaInterfaces.GetAddress (nCsma) echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0))); echoClient.SetAttribute ("PacketSize", UintegerValue (1024)); ApplicationContainer clientApps = echoClient.Install (src); clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0)); ip = nS.Get(2)->GetObject<Ipv4>(); NS_LOG_UNCOND(ip->GetAddress(1,0).GetLocal()); PacketSinkHelper sinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (ip->GetAddress(1,0).GetLocal(), 80)); TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory"); /* Ptr<Socket> recvSink = Socket::CreateSocket (dst, tid); InetSocketAddress local = InetSocketAddress (dstIp->GetAddress(1,0).GetLocal(), 80); recvSink->Bind (local);*/ Ptr<Socket> source = Socket::CreateSocket (nW.Get(2), tid); InetSocketAddress remote = InetSocketAddress (ip->GetAddress(1,0).GetLocal(), 80); source->Connect (remote); ApplicationContainer sinkApp = sinkHelper.Install (nS.Get(2)); sinkApp.Start(Seconds(2.0)); sinkApp.Stop(Seconds(10.0)); Simulator::Stop (Seconds (10.0)); Simulator::Schedule (Seconds(4.0), &GenerateTraffic, source, 10, Seconds(0.3)); if (tracing == true){ pointToPoint.EnablePcapAll ("third"); phy.EnablePcap ("third", apDevices.Get (0)); csma.EnablePcap ("third", csmaDevices.Get (0), true); GtkConfigStore g; g.ConfigureAttributes(); g.ConfigureDefaults(); } AnimationInterface a("a.xml"); a.EnablePacketMetadata(); a.UpdateNodeColor(dst, 0, 0, 255); a.UpdateNodeDescription(dst, "DST"); a.UpdateNodeColor(src, 0, 255, 0); a.UpdateNodeDescription(src, "SRC"); auto obr = a.AddResource("/home/student/Documents/share/router.png"); a.UpdateNodeImage(nP.Get(0)->GetId(), obr); Simulator::Run (); Simulator::Destroy (); return 0; } |
Na prezretie komunikácie použite aplikácie:
1 |
../netanim-3.108/NetAnim & |
.
r.1-9 sú knižnice nutné k spusteniu. Vo väčšine majú tvar „ns3/nazov-modulu.h“, všetky predzostavené moduly sa vypisujú za každým úspešným zostavením projektu. Tie ostatné knižnice sú čiastkové a určite sa nachádzajú v niektorom module, ale IDE si ich tam vie doplniť samo.
Napr. yans-wifi-helper a ssid budu spoločne aj s ostatnými v wifi-module
r.12 je špeciálny deklaratívny riadok pre použitie záznamových makier NS_LOG… Tie sa prednostne používajú namiesto std::cout a cerr.
r.15-17 definujú premenné pre vstupné parametre príkazové riadka, ktorý sa získava pomocou objektu cmd na nasledovných r.19-23
Vytvoríme si n-uzlov pre serverovú časť LAN, m-uzlov pre WIFI časť a 2 uzly pre sieť prepájajúcu serverovú a wifi časť. t.j. n a m sú parametre pre príkazový riadok. Potrebujeme ešte kontajnery pre medzi siete a p2p linku.
r.26-41. Na týchto riadkoch si definujeme kontajnery ako logické celky. Uzly ktorým budeme prideľovať podobné vlastnosti. Napríklad inštalácia wifi, byť spoločne v podsieti (teraz tým nemyslíme VLAN) … Tiež im môžeme prideliť identifikátory – mená, pre skrátené a jasnejšie písanie kódu neskôr. Vrámci L1 vrstvy definujeme aj pohyb a umiestnenie (r.43-61), kde na r.56 môžete vidieť prvé (ne)použitie identifikátora/pomenovania.
od r. 63 nastavujeme L2 vrstvy ISO OSI (NIC, kanál) t.j. CSMA, P2P linky. Na r.86 je definovanie L2 pre wifi, je to jedna z tried definujúca správanie. Tu môžeme nastaviť aj parametre alebo ich opomenúť, necháme to na prednastavenej inicializácii.
Nastavíme si sieťovú vrstvu.
Ipv4GlobalRoutingHelper::PopulateRoutingTables (); Ipv4InterfaceContainer má funkciu SetMetric(), ktorá NIC uzla nastaví metriku – prioritu.
Nastavíme aplikačnú vrstvu. Do kontajnerov (ApplicationContainer) si uložíme jednotlivé aplikácie (ikeď ich máme iba 2 – klientskú časť a serverovú časť).
Trieda UdpEchoServerHelper má parameter konštruktora číslo portu na ktorom bude počúvať. Následne sa zavolá inštalácia konfigurácie pre aplikáciu.
Trieda UdpEchoClientHelper má parametre konštruktora adresu (IP) a číslo portu servera, nakoľko sa konfigurácia to inštaluje klienta.
obe aplikácie majú množstvo atribútov (viď v dokumentáciu a obr. udpAttributes).
Niektoré atribúty teda majú nazov (MaxPackets, RemoteAddress …), prednastavenú hodnotu (100, 00-00-00 …), a dátový typ (UintegerValue, AddressValue …). Niektoré dátové typy majú automatickú konverziu ako pre prípad Interval je ekvivalentné : 10 ; StringValue(„10ns“); TimeValue(NanoSeconds(10));
V uvedenom prípade nastavíme počet balíkov na odoslanie = 3, interval medzi jednotlivými balíkmi 500 milisekúnd,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
#include "ns3/core-module.h" #include "ns3/point-to-point-module.h" #include "ns3/network-module.h" #include "ns3/applications-module.h" #include "ns3/mobility-module.h" #include "ns3/csma-module.h" #include "ns3/internet-module.h" #include "ns3/yans-wifi-helper.h" #include "ns3/ssid.h" using namespace ns3; NS_LOG_COMPONENT_DEFINE ("cvicenie 2"); int main (int argc, char *argv[]) { uint32_t mCsma = 3; uint32_t nWifi = 3; uint32_t dataSize = 1024; CommandLine cmd; cmd.AddValue ("m", "Pocet serverov", mCsma); cmd.AddValue ("n", "Pocet wiif stanic.", nWifi); cmd.AddValue ("dSize", "Velkost udajov.", dataSize); cmd.Parse (argc,argv); // L1 NodeContainer nW,nP,nS; nW.Create (nWifi);//AP+mobily nP.Create(2);//R1-R2 Names::Add ("R1", nP.Get(1)); Names::Add ("R2", nP.Get(0)); nS.Add(nP.Get(1));//R2 nS.Create(mCsma);//R2+servers Names::Add ("PCs", nS.Get(mCsma)); MobilityHelper mobility; mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", DoubleValue (0.0), "MinY", DoubleValue (0.0), "DeltaX", DoubleValue (5.0), "DeltaY", DoubleValue (10.0), "GridWidth", UintegerValue (3), "LayoutType", StringValue ("RowFirst")); mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel", "Bounds", RectangleValue (Rectangle (-50, 50, -50, 50))); mobility.Install (nW); mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (nP.Get(1));//"R1" nutne //dalsie nie su nutne mobility.Install ("R1"); // L2 -- nastavenia NIC a kanalov PointToPointHelper p2p; p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); p2p.SetChannelAttribute ("Delay", StringValue ("5ms")); NetDeviceContainer nicP; nicP = p2p.Install (nP); CsmaHelper csma; NetDeviceContainer nicS; csma.SetChannelAttribute ("DataRate", StringValue ("1000Mbps")); csma.SetChannelAttribute ("Delay", TimeValue (MicroSeconds (5))); nicS = csma.Install (nS); YansWifiChannelHelper wChannel; YansWifiPhyHelper phy; phy.SetChannel (wChannel.Create ()); WifiHelper wifi; wifi.SetRemoteStationManager ("ns3::AarfWifiManager"); WifiMacHelper mac; Ssid ssid = Ssid ("eduroam"); mac.SetType ("ns3::StaWifiMac", "Ssid", SsidValue (ssid), "ActiveProbing", BooleanValue (false)); NetDeviceContainer nicW; nicW = wifi.Install (phy, mac, nW); // mobily NIC mac.SetType ("ns3::ApWifiMac", "Ssid", SsidValue (ssid)); NetDeviceContainer nicWap; nicWap = wifi.Install (phy, mac, nP.Get(0)); // L3 -- IP InternetStackHelper stack; stack.InstallAll(); Ipv4AddressHelper address; address.SetBase ("10.2.1.0", "255.255.255.0");// Ipv4Mask(0xffffff00)); Ipv4Mask ("/24") Ipv4InterfaceContainer networkSContainer = address.Assign (nicS); address.SetBase ("10.2.4.0", Ipv4Mask ("/30")); address.Assign (nicP); address.SetBase ("10.1.0.0", Ipv4Mask("255.255.0.0")); // Ipv4InterfaceContainer networkWContainer = address.Assign (nicW); address.Assign (nicW); address.Assign (nicWap); Ipv4GlobalRoutingHelper::PopulateRoutingTables(); //L7 UdpEchoServerHelper echoServer (9); ApplicationContainer serverApps = echoServer.Install ( "PCs") ; serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0)); Ptr<Node> src = nW.Get(0); Ptr<Node> dst = nS.Get(mCsma); UdpEchoClientHelper echoClient (nicS.GetAddress (mCsma), 9);//mCsma=nS.GetN()-1 echoClient.SetAttribute ("MaxPackets", UintegerValue (5)); echoClient.SetAttribute ("Interval", TimeValue (MilliSeconds (1000))); echoClient.SetAttribute ("PacketSize", UintegerValue (dataSize)); ApplicationContainer clientApps = echoClient.Install (src); clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0)); Simulator::Stop (Seconds (10.0)); LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO); csma.EnablePcap("ttt",nicS, true); wifi.EnablePcap("sss",nicW, true); AnimationInterface aml("a.xml"); aml.EnablePacketMetadata(); aml.SetConstantPosition(src, 0,0); aml.UpdateNodeDescription(src, "src"); aml.UpdateNodeDescription(dst, "dst"); Simulator::Run (); Simulator::Destroy (); return 0; } |