Vous êtes sur la page 1sur 6

Exemple de simulation

Nous allons tester le protocole de routage avec la topologie suivante :

Pour chaque simulation on doit inclure les modules dont on aura besoin. Pour cette partie nous
allons ajouter ces bibliothques :
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/netanim-module.h"
#include "ns3/applications-module.h"
#include "ns3/animation-interface.h"
#include "ns3/point-to-point-layout-module.h"
#include "ns3/ipv4-static-routing-helper.h"
#include "ns3/ipv4-list-routing-helper.h"
#include "ns3/ipv4-global-routing-helper.h"
#include "ns3/flow-monitor.h"
#include "ns3/flow-monitor-helper.h"
#include "ns3/flow-monitor-module.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
La ligne suivante nous permet d'introduire ns-3 comme nom de domaine :
using namespace ns3;
Cette ligne permet l'affichage des messages LOG :
NS_LOG_COMPONENT_DEFINE ("Lab3_part1");
Marwa Dammak

Maintenant, nous pouvons commencer notre fonction main :


int main (int argc, char *argv[])
{
//add your codes here
}
Toutes les commandes qui suivent doivent tre incluses dans la fonction main.
D'abord nous declarons quelques paramtres por la simulation.
uint32_t PacketSize = 512; // bytes
std::string DataRate ("1Mbps");
uint16_t num_Nodes = 8;
uint16_t UDPport = 9;
bool tracing = false;
L'objet CommandLine permet de modifier des paramtres lors du lancement de la simulation :
CommandLine cmd;
cmd.AddValue ("PacketSize", "size of application packet sent", PacketSize);
cmd.AddValue ("DataRate", "rate of pacekts sent", DataRate);
cmd.AddValue ("tracing", "turn on ascii and pcap tracing", tracing);
cmd.Parse (argc, argv);
Maintenant nous allons configurer une application on/off pour gnrer les donnes.
Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue(PacketSize));
Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue (DataRate));
Config::SetDefault ("ns3::Ipv4GlobalRouting::RespondToInterfaceEvents",BooleanValue(true));
Passons maintenant la cration de la topologie. Les nuds du rseau sont sauvegards dans une
calsse appel NodeContainer .
NodeContainer nodes;
nodes.Create (num_Nodes);
Nous allons grouper les nuds pour crer les liens entre eux.
NodeContainer AB = NodeContainer (nodes.Get (0), nodes.Get (1));
NodeContainer BE = NodeContainer (nodes.Get (1), nodes.Get (2));
NodeContainer EG = NodeContainer (nodes.Get (2), nodes.Get (3));
NodeContainer AG = NodeContainer (nodes.Get (0), nodes.Get (3));
NodeContainer BC = NodeContainer (nodes.Get (1), nodes.Get (5));
NodeContainer EF = NodeContainer (nodes.Get (2), nodes.Get (4));
NodeContainer GH = NodeContainer (nodes.Get (3), nodes.Get (7));
NodeContainer FC = NodeContainer (nodes.Get (4), nodes.Get (5));
NodeContainer FH = NodeContainer (nodes.Get (4), nodes.Get (7));
NodeContainer CD = NodeContainer (nodes.Get (5), nodes.Get (6));
NodeContainer HD = NodeContainer (nodes.Get (7), nodes.Get (6));
Marwa Dammak

Nous allons attribuer la bande passante et le delai pour chaque lien


PointToPointHelper p2p;
p2p.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
p2p.SetChannelAttribute ("Delay", StringValue ("10ms"));
NetDeviceContainer dAB = p2p.Install (AB);
Utilisez les mmes valeurs pour les autres liens.
Aprs, nous devons configurer les paramtres de la couche 3. Pour implmenter ipv4 nous utilisons
InternetStackHelper . Ce helper definit le routage static comme le routage le plus prioritaire.
Nous devons changer ses priorits.
NS_LOG_INFO("Setting routing protocols");
Ipv4StaticRoutingHelper staticRouting;
Ipv4GlobalRoutingHelper globalRouting;
Ipv4ListRoutingHelper list;
list.Add(staticRouting,0);
list.Add(globalRouting,10);
// Install network stacks on the nodes
InternetStackHelper internet;
internet.SetRoutingHelper(list);
internet.Install(nodes);
Maintenant nous devons attribuer les adresses IP chaque nud et le cot (metric) de chaque lien.
Ipv4AddressHelper ipv4;
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer iAB = ipv4.Assign (dAB);
iAB.SetMetric(0,2);
iAB.SetMetric(1,2);
ipv4.SetBase ("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer iBE = ipv4.Assign (dBE);
iBE.SetMetric(0,2);
iBE.SetMetric(1,2);
ipv4.SetBase ("10.1.3.0", "255.255.255.0");
Ipv4InterfaceContainer iEG = ipv4.Assign (dEG);
iEG.SetMetric(0,1);
iEG.SetMetric(1,1);
ipv4.SetBase ("10.1.4.0", "255.255.255.0");
Ipv4InterfaceContainer iAG = ipv4.Assign (dAG);
iAG.SetMetric(0,6);
iAG.SetMetric(1,6);
ipv4.SetBase ("10.1.5.0", "255.255.255.0");
Ipv4InterfaceContainer iBC = ipv4.Assign (dBC);
iBC.SetMetric(0,7);
iBC.SetMetric(1,7);
Marwa Dammak

ipv4.SetBase ("10.1.6.0", "255.255.255.0");


Ipv4InterfaceContainer iEF = ipv4.Assign (dEF);
iEF.SetMetric(0,2);
iEF.SetMetric(1,2);
ipv4.SetBase ("10.1.7.0", "255.255.255.0");
Ipv4InterfaceContainer iGH = ipv4.Assign (dGH);
iGH.SetMetric(0,4);
iGH.SetMetric(1,4);
ipv4.SetBase ("10.1.8.0", "255.255.255.0");
Ipv4InterfaceContainer iFC = ipv4.Assign (dFC);
iFC.SetMetric(0,3);
iFC.SetMetric(1,3);
ipv4.SetBase ("10.1.9.0", "255.255.255.0");
Ipv4InterfaceContainer iCD = ipv4.Assign (dCD);
iCD.SetMetric(0,3);
iCD.SetMetric(1,3);
ipv4.SetBase ("10.1.10.0", "255.255.255.0");
Ipv4InterfaceContainer iHD = ipv4.Assign (dHD);
iHD.SetMetric(0,2);
iHD.SetMetric(1,2);
ipv4.SetBase ("10.1.11.0", "255.255.255.0");
Ipv4InterfaceContainer iFH = ipv4.Assign (dFH);
iFH.SetMetric(0,2);
iFH.SetMetric(1,2);
Nous ajoutons cette ligne pour initialiser la base de donnes du routage et configurer les tables de
routage au niveau des nuds :
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
Maintenant nous allons installer une application UDP au niveau des nuds A et D. D'abord copiez
les lignes de code suivantes :
PacketSinkHelper UDPsink ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny
(),
UDPport));
ApplicationContainer App;
NodeContainer SourceNode = NodeContainer (nodes.Get (0));
NodeContainer SinkNode = NodeContainer (nodes.Get (6));
Pour crer un sink UDP pour recevoir les packets utilisez le code suivant :
App = UDPsink.Install (SinkNode);
App.Start (Seconds (0.0));
App.Stop (Seconds (10.0));
Address D_Address(InetSocketAddress(iHD.GetAddress (1), UDPport));
Pour crer une source UDP ajoutez ces commandes :

Marwa Dammak

OnOffHelper UDPsource ("ns3::UdpSocketFactory", D_Address);


UDPsource.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1)));
UDPsource.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0)));
App = UDPsource.Install(SourceNode);
App.Start (Seconds (1.0));
App.Stop (Seconds (10.0));
NS3 a deux types d'output : les fichiers Pcap qu'on peut lire avec wireshark . Le deuxime type
est lesfichier trace de NS3.
if (tracing == true)
{
AsciiTraceHelper ascii;
p2p.EnableAsciiAll (ascii.CreateFileStream ("Lab3_part1.tr"));
p2p.EnablePcapAll ("Lab3_part1");
}
Pour voir les tables de routage, ajoutez le code suivant :
Ptr<OutputStreamWrapper> stream1 = Create<OutputStreamWrapper> ("Table2", std::ios::out);
Ipv4GlobalRoutingHelper helper2;
helper2.PrintRoutingTableAllAt(Seconds(2.0),stream1);
Enfin nous devons definir le temps de debut et de la fin de la simulation. Le simulateur sera dtruit
la fin de la simulation. La fonction main est maintenant complte.
Simulator::Stop (Seconds (10.0));
Simulator::Run ();
Simulator::Destroy ();
return 0;
}
Pour lancer la simulation, sauvegardez le code avec l'extension .cc dans le dossier scratch
puis ouvrez le terminal et accdez ns-allinone-3.x/ns-3.x/ et lancez la commande suivante :
./waf run scratch/myfile (without .cc)
Maintenant changez les metrics des lien AG et GE 1et 2 respectivement. Lancez la simulation de
nouveau et verifier si le chemin entre A et D a chang ou pas.
Changez la metric du lien AG 8 et verifiez de nouveau le chemin entre A et D.
Maintenant nous allons evaluer le routage lorsqu'un nud n'est pas fonctionnel.
Ptr<Node> node1=nodes.Get(1);
Ptr<Ipv4> ipv41=node1->GetObject<Ipv4>();
Simulator::Schedule(Seconds(3),&Ipv4::SetDown,ipv41,1);
Et pour verifier les tables de routage dans ce cas , nous utilisons les lignes suivantes aprs les
commandes prcdents :

Marwa Dammak

Ptr<OutputStreamWrapper> stream1 = Create<OutputStreamWrapper> ("Table2", std::ios::out);


Ipv4GlobalRoutingHelper helper2;
helper2.PrintRoutingTableAllAt(Seconds(2.0),stream1);
Maintenant consultez la table de routage pour verifier les changements effectus.

Marwa Dammak

Vous aimerez peut-être aussi