Skip to main content

Simulation of persistent vs. non-persistent CSMA in a 15-node wired LAN and compare channel utilization | NS3 Project 9

Computer Networks Digital Assignment

Topic:

Simulate persistent vs. non-persistent CSMA in a 15-node wired LAN and compare channel utilization.

Code:

// csma-persistent.cc
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
#include "ns3/applications-module.h"
#include "ns3/netanim-module.h"
#include "ns3/flow-monitor-module.h"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE("CsmaSimulation");

int main (int argc, char *argv[])
{
  bool persistent = true; // change to false for non-persistent
  CommandLine cmd;
  cmd.AddValue("persistent", "Enable persistent CSMA", persistent);
  cmd.Parse(argc, argv);

  NodeContainer nodes;
  nodes.Create(15);

  CsmaHelper csma;
  csma.SetChannelAttribute("DataRate", StringValue("100Mbps"));
  csma.SetChannelAttribute("Delay", TimeValue(NanoSeconds(6560)));

  NetDeviceContainer devices = csma.Install(nodes);

  InternetStackHelper stack;
  stack.Install(nodes);

  Ipv4AddressHelper address;
  address.SetBase("10.1.1.0", "255.255.255.0");
  Ipv4InterfaceContainer interfaces = address.Assign(devices);

  uint16_t port = 9;

  // Server on node 0
  UdpServerHelper server(port);
  ApplicationContainer serverApp = server.Install(nodes.Get(0));
  serverApp.Start(Seconds(1.0));
  serverApp.Stop(Seconds(20.0));

  // Clients on remaining nodes
  for (int i = 1; i < 15; i++)
  {
    UdpClientHelper client(interfaces.GetAddress(0), port);
    client.SetAttribute("MaxPackets", UintegerValue(1000));
    client.SetAttribute("Interval",
                        TimeValue(persistent ? Seconds(0.01) : Seconds(0.05))); // key difference
    client.SetAttribute("PacketSize", UintegerValue(1024));

    ApplicationContainer clientApp = client.Install(nodes.Get(i));
    clientApp.Start(Seconds(2.0 + i * 0.1));
    clientApp.Stop(Seconds(20.0));
  }

  // Enable tracing
  csma.EnablePcapAll("csma");

  // NetAnim
  std::string mode = persistent ? "persistent" : "nonpersistent";
  AnimationInterface anim("csma-" + mode + ".xml");

  // PCAP trace file
  csma.EnablePcapAll("csma-" + mode);

  Simulator::Stop(Seconds(20.0));

  FlowMonitorHelper flowmon;
  Ptr<FlowMonitor> monitor = flowmon.InstallAll();

  Simulator::Run();
  monitor->CheckForLostPackets();

  Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier>(flowmon.GetClassifier());
  std::map<FlowId, FlowMonitor::FlowStats> stats = monitor->GetFlowStats();

  for (auto &flow : stats)
  {
    std::cout << "Flow ID: " << flow.first << std::endl;
    std::cout << "Tx Packets: " << flow.second.txPackets << std::endl;
    std::cout << "Rx Packets: " << flow.second.rxPackets << std::endl;
    std::cout << "Throughput: " << flow.second.rxBytes * 8.0 /
      (flow.second.timeLastRxPacket.GetSeconds() -
       flow.second.timeFirstTxPacket.GetSeconds()) / 1024 << " Kbps\n";
  }

  Simulator::Destroy();
  return 0;
}

Commands to run the code:

  1. Create a file inside the scratch folder and save the code as csma-persistent.cc.
  2. To run code in persistent mode:
    ./ns3 run "scratch/csma-persistent --persistent=1"
  3. To run code in non-persistent mode:
    ./ns3 run "scratch/csma-persistent --persistent=0"
  4. Generated Output Files:
    • For Persistent:
      • csma-persistent.xml
      • csma-persistent-*.pcap
    • For Non-Persistent:
      • csma-nonpersistent.xml
      • csma-nonpersistent-*.pcap

Output:

For Non-Persistent:

Non-Persistent Terminal Output 1 Non-Persistent Terminal Output 2

For Persistent:

Persistent Terminal Output 1 Persistent Terminal Output 2

Graph:

Channel Utilization Comparison Graph

Comments

Popular posts from this blog

How to Create Ubuntu 24.04 Bootable USB Using Rufus [Step-by-Step Guide]

How to Create Ubuntu 24.04 Bootable USB Using Rufus [Step-by-Step Guide] Are you planning to install or try Ubuntu 24.04 LTS ? The easiest and most reliable method is to create a bootable USB drive using Rufus on a Windows system. This detailed guide will help you create a Ubuntu 24.04 USB bootloader using Rufus with easy-to-follow steps and screenshots (optional). Here is the complete video of the bootloader creation and OS installation in Windows 11. 🧰 Requirements A USB flash drive (minimum 8GB recommended) A Windows PC Ubuntu 24.04 LTS ISO file Rufus USB creation tool 🧾 Steps to Create a Ubuntu 24.04 Bootable USB Using Rufus ✅ Step 1: Download Ubuntu 24.04 ISO Visit the official Ubuntu website and download the Ubuntu 24.04 LTS ISO file . ✅ Step 2: Download and Run Rufus Head to Rufus official site and download the latest version. Open the executable file (no installation required). ✅ Step 3: Insert USB Drive Plug in your USB drive. Rufus ...

Installing ns3 in Ubuntu 22.04 | Complete Instructions

In this post, we are going to see how to install ns-3.36.1 in Ubuntu 22.04. You can follow the video for complete details Tools used in this simulation: NS3 version ns-3.36.1  OS Used: Ubuntu 22.04 LTS Installation of NS3 (ns-3.36.1) There are some changes in the ns3 installation procedure and the dependencies. So open a terminal and issue the following commands Step 1:  Prerequisites $ sudo apt update In the following packages, all the required dependencies are taken care and you can install all these packages for the complete use of ns3. $ sudo apt install g++ python3 python3-dev pkg-config sqlite3 cmake python3-setuptools git qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools gir1.2-goocanvas-2.0 python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython3 openmpi-bin openmpi-common openmpi-doc libopenmpi-dev autoconf cvs bzr unrar gsl-bin libgsl-dev libgslcblas0 wireshark tcpdump sqlite sqlite3 libsqlite3-dev  libxml2 libxml2-dev libc6-dev libc6-dev-i386 libc...

Installation of NS2 in Ubuntu 22.04 | NS2 Tutorial 2

NS-2.35 installation in Ubuntu 22.04 This post shows how to install ns-2.35 in Ubuntu 22.04 Operating System Since ns-2.35 is too old, it needs the following packages gcc-4.8 g++-4.8 gawk and some more libraries Follow the video for more instructions So, here are the steps to install this software: To download and extract the ns2 software Download the software from the following link http://sourceforge.net/projects/nsnam/files/allinone/ns-allinone-2.35/ns-allinone-2.35.tar.gz/download Extract it to home folder and in my case its /home/pradeepkumar (I recommend to install it under your home folder) $ tar zxvf ns-allinone-2.35.tar.gz or Right click over the file and click extract here and select the home folder. $ sudo apt update $ sudo apt install build-essential autoconf automake libxmu-dev gawk To install gcc-4.8 and g++-4.8 $ sudo gedit /etc/apt/sources.list make an entry in the above file deb http://in.archive.ubuntu.com/ubuntu/ bionic main universe $ sudo apt update Since, it...