Académique Documents
Professionnel Documents
Culture Documents
TP1 NS3 Exemple PDF
TP1 NS3 Exemple PDF
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>
NS_LOG_COMPONENT_DEFINE ("Lab3_part1");
Marwa Dammak
Maintenant, nous pouvons commencer notre fonction « main » :
Toutes les commandes qui suivent doivent être incluses dans la fonction main.
D'abord nous declarons quelques paramétres por 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.
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.
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);
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 :
Pour créer un sink UDP pour recevoir les packets utilisez le code suivant :
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");
}
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.
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 :
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);
Marwa Dammak