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 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

Vous aimerez peut-être aussi