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 bibliothèques :
#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 paramétres 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 paramétres 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 générer les données.
Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue(PacketSize));
Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue (DataRate));
Config::SetDefault ("ns3::Ipv4GlobalRouting::RespondToInterfaceEvents",BooleanValue(true));
Passons maintenant à la création de la topologie. Les nœuds du réseau sont sauvegardés dans une
calsse appelé « NodeContainer ».
NodeContainer nodes;
nodes.Create (num_Nodes);
Nous allons grouper les nœuds pour créer 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 mêmes valeurs pour les autres liens.
Aprés, nous devons configurer les paramétres de la couche 3. Pour implémenter ipv4 nous utilisons
« InternetStackHelper » . Ce helper definit le routage static comme le routage le plus prioritaire.
Nous devons changer ses priorités.
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 nœud et le coût (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 données du routage et configurer les tables de
routage au niveau des nœuds :
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
Maintenant nous allons installer une application UDP au niveau des nœuds 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 créer 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 créer 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 deuxième 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 détruit
à la fin de la simulation. La fonction « main » est maintenant compléte.
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 accédez à 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 nœud 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 aprés les
commandes précédents :

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 effectués.

Marwa Dammak