Ns3 Projects for B.E/B.Tech M.E/M.Tech PhD Scholars.  Phone-Number:9790238391   E-mail: ns3simulation@gmail.com

How to Implement Network Service chaining in ns3

To implement the network service chaining in the ns3 has need to embrace the sequence of network services such as firewalls, load balancers, and intrusion detection systems that packets need to permit via earlier reaching their endpoint. This needs to setup the numerous nodes, configure the routing and probably utilize the custom applications to emulate the features of these services. Given below are the detailed procedure on how to implement the network service chaining in the ns3:

Step-by-Step Implementation:

Step 1: Setup ns3 Environment

Make sure ns3 is installed in the system.

Step 2: Include Necessary Modules

Include the necessary ns3 modules in your script:

#include “ns3/core-module.h”

#include “ns3/network-module.h”

#include “ns3/internet-module.h”

#include “ns3/point-to-point-module.h”

#include “ns3/applications-module.h”

#include “ns3/traffic-control-module.h”

#include “ns3/flow-monitor-module.h”

Step 3: Create the Simulation Script

  1. Setup Nodes and Network:

using namespace ns3;

NS_LOG_COMPONENT_DEFINE (“NetworkServiceChainingExample”);

int main (int argc, char *argv[])

{

CommandLine cmd;

cmd.Parse (argc, argv);

// Create nodes

NodeContainer nodes;

nodes.Create (6);

// Create point-to-point links

PointToPointHelper pointToPoint;

pointToPoint.SetDeviceAttribute (“DataRate”, StringValue (“10Mbps”));

pointToPoint.SetChannelAttribute (“Delay”, StringValue (“2ms”));

NetDeviceContainer devices;

devices = pointToPoint.Install (NodeContainer (nodes.Get (0), nodes.Get (1))));

devices.Add (pointToPoint.Install (NodeContainer (nodes.Get (1), nodes.Get (2))));

devices.Add (pointToPoint.Install (NodeContainer (nodes.Get (2), nodes.Get (3))));

devices.Add (pointToPoint.Install (NodeContainer (nodes.Get (3), nodes.Get (4))));

devices.Add (pointToPoint.Install (NodeContainer (nodes.Get (4), nodes.Get (5))));

// Install Internet stack

InternetStackHelper stack;

stack.Install (nodes);

// Assign IP addresses

Ipv4AddressHelper address;

address.SetBase (“10.1.1.0”, “255.255.255.0”);

Ipv4InterfaceContainer interfaces = address.Assign (devices);

// Set up routing

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

// Set up applications

uint16_t port = 9;  // Discard port (RFC 863)

// Server application on node 5

Address serverAddress (InetSocketAddress (Ipv4Address::GetAny (), port));

PacketSinkHelper packetSinkHelper (“ns3::UdpSocketFactory”, serverAddress);

ApplicationContainer sinkApps = packetSinkHelper.Install (nodes.Get (5));

sinkApps.Start (Seconds (1.0));

sinkApps.Stop (Seconds (20.0));

// Client application on node 0

OnOffHelper onoff (“ns3::UdpSocketFactory”, Address (InetSocketAddress (interfaces.GetAddress (5), port)));

onoff.SetConstantRate (DataRate (“1Mbps”));

ApplicationContainer apps = onoff.Install (nodes.Get (0));

apps.Start (Seconds (2.0));

apps.Stop (Seconds (20.0));

// Enable pcap tracing for packet capture

pointToPoint.EnablePcapAll (“network-service-chaining”);

// Enable traffic control

TrafficControlHelper tch;

tch.SetRootQueueDisc (“ns3::RedQueueDisc”);

tch.Install (devices);

// Enable flow monitor

FlowMonitorHelper flowmon;

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

Simulator::Stop (Seconds (20.0));

Simulator::Run ();

// Print per-flow statistics

monitor->CheckForLostPackets ();

Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier> (flowmon.GetClassifier ());

std::map<FlowId, FlowMonitor::FlowStats> stats = monitor->GetFlowStats ();

for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin (); i != stats.end (); ++i)

{

Ipv4FlowClassifier::FiveTuple t = classifier->FindFlow (i->first);

std::cout << “Flow ” << i->first << ” (” << t.sourceAddress << ” -> ” << t.destinationAddress << “)\n”;

std::cout << ”  Tx Bytes:   ” << i->second.txBytes << “\n”;

std::cout << ”  Rx Bytes:   ” << i->second.rxBytes << “\n”;

std::cout << ”  Tx Packets: ” << i->second.txPackets << “\n”;

std::cout << ”  Rx Packets: ” << i->second.rxPackets << “\n”;

std::cout << ”  Throughput: ” << i->second.rxBytes * 8.0 / (i->second.timeLastRxPacket.GetSeconds() – i->second.timeFirstTxPacket.GetSeconds()) / 1024 / 1024 << ” Mbps\n”;

}

Simulator::Destroy ();

return 0;

}

Step 4: Create Custom Applications for Network Services

We need to generate the custom application then we must emulate the behaviour of network services such as firewalls, load balancers, and intrusion detection systems. Below are the samplet to setup a basic firewall application:

class FirewallApplication : public Application

{

public:

FirewallApplication ();

virtual ~FirewallApplication ();

void Setup (Ptr<Socket> socket, Address address);

private:

virtual void StartApplication (void);

virtual void StopApplication (void);

void HandleRead (Ptr<Socket> socket);

Ptr<Socket>     m_socket;

Address         m_peer;

};

FirewallApplication::FirewallApplication ()

: m_socket (0)

{

}

FirewallApplication::~FirewallApplication ()

{

m_socket = 0;

}

void

FirewallApplication::Setup (Ptr<Socket> socket, Address address)

{

m_socket = socket;

m_peer = address;

}

void

FirewallApplication::StartApplication (void)

{

m_socket->Bind ();

m_socket->Connect (m_peer);

m_socket->SetRecvCallback (MakeCallback (&FirewallApplication::HandleRead, this));

}

void

FirewallApplication::StopApplication (void)

{

if (m_socket)

{

m_socket->Close ();

}

}

void

FirewallApplication::HandleRead (Ptr<Socket> socket)

{

Ptr<Packet> packet;

Address from;

while ((packet = socket->RecvFrom (from)))

{

NS_LOG_UNCOND (“Firewall received ” << packet->GetSize () << ” bytes from ” << InetSocketAddress::ConvertFrom (from).GetIpv4 ());

// Implement firewall logic here (e.g., drop or forward packets based on rules)

// For simplicity, we’ll forward all packets

socket->Send (packet);

}

}

Step 5: Integrate Custom Applications

Incorporate the custom applications inside the simulation script. For instances, we need to setup a firewall application on node 2:

int main (int argc, char *argv[])

{

CommandLine cmd;

cmd.Parse (argc, argv);

// Create nodes

NodeContainer nodes;

nodes.Create (6);

// Create point-to-point links

PointToPointHelper pointToPoint;

pointToPoint.SetDeviceAttribute (“DataRate”, StringValue (“10Mbps”));

pointToPoint.SetChannelAttribute (“Delay”, StringValue (“2ms”));

NetDeviceContainer devices;

devices = pointToPoint.Install (NodeContainer (nodes.Get (0), nodes.Get (1))));

devices.Add (pointToPoint.Install (NodeContainer (nodes.Get (1), nodes.Get (2))));

devices.Add (pointToPoint.Install (NodeContainer (nodes.Get (2), nodes.Get (3))));

devices.Add (pointToPoint.Install (NodeContainer (nodes.Get (3), nodes.Get (4))));

devices.Add (pointToPoint.Install (NodeContainer (nodes.Get (4), nodes.Get (5))));

// Install Internet stack

InternetStackHelper stack;

stack.Install (nodes);

// Assign IP addresses

Ipv4AddressHelper address;

address.SetBase (“10.1.1.0”, “255.255.255.0”);

Ipv4InterfaceContainer interfaces = address.Assign (devices);

// Set up routing

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

// Set up applications

uint16_t port = 9;  // Discard port (RFC 863)

// Server application on node 5

Address serverAddress (InetSocketAddress (Ipv4Address::GetAny (), port));

PacketSinkHelper packetSinkHelper (“ns3::UdpSocketFactory”, serverAddress);

ApplicationContainer sinkApps = packetSinkHelper.Install (nodes.Get (5));

sinkApps.Start (Seconds (1.0));

sinkApps.Stop (Seconds (20.0));

// Client application on node 0

OnOffHelper onoff (“ns3::UdpSocketFactory”, Address (InetSocketAddress (interfaces.GetAddress (5), port)));

onoff.SetConstantRate (DataRate (“1Mbps”));

ApplicationContainer apps = onoff.Install (nodes.Get (0));

apps.Start (Seconds (2.0));

apps.Stop (Seconds (20.0));

// Firewall application on node 2

Ptr<Socket> firewallSocket = Socket::CreateSocket (nodes.Get (2), UdpSocketFactory::GetTypeId ());

Address firewallAddress = InetSocketAddress (interfaces.GetAddress (3), port);

Ptr<FirewallApplication> firewallApp = CreateObject<FirewallApplication> ();

firewallApp->Setup (firewallSocket, firewallAddress);

nodes.Get (2)->AddApplication (firewallApp);

firewallApp->SetStartTime (Seconds (1.5));

firewallApp->SetStopTime (Seconds (20.0));

// Enable pcap tracing for packet capture

pointToPoint.EnablePcapAll (“network-service-chaining”);

// Enable traffic control

TrafficControlHelper tch;

tch.SetRootQueueDisc (“ns3::RedQueueDisc”);

tch.Install (devices);

// Enable flow monitor

FlowMonitorHelper flowmon;

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

Simulator::Stop (Seconds (20.0));

Simulator::Run ();

// Print per-flow statistics

monitor->CheckForLostPackets ();

Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier> (flowmon.GetClassifier ());

std::map<FlowId, FlowMonitor::FlowStats> stats = monitor->GetFlowStats ();

for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin (); i != stats.end (); ++i)

{

Ipv4FlowClassifier::FiveTuple t = classifier->FindFlow (i->first);

std::cout << “Flow ” << i->first << ” (” << t.sourceAddress << ” -> ” << t.destinationAddress << “)\n”;

std::cout << ”  Tx Bytes:   ” << i->second.txBytes << “\n”;

std::cout << ”  Rx Bytes:   ” << i->second.rxBytes << “\n”;

std::cout << ”  Tx Packets: ” << i->second.txPackets << “\n”;

std::cout << ”  Rx Packets: ” << i->second.rxPackets << “\n”;

std::cout << ”  Throughput: ” << i->second.rxBytes * 8.0 / (i->second.timeLastRxPacket.GetSeconds() – i->second.timeFirstTxPacket.GetSeconds()) / 1024 / 1024 << ” Mbps\n”;

}

Simulator::Destroy ();

return 0;

}

Step 6: Run the Simulation

Compile and run your simulation script:

./waf configure

./waf build

./waf –run NetworkServiceChainingExample

Explanation

  • Node Creation: Create nodes representing different devices in the network.
  • Point-to-Point Links: Configure point-to-point links between nodes with specified data rates and delays.
  • Internet Stack: Install the Internet stack on all nodes.
  • IP Configuration: Assign IP addresses to the interfaces.
  • Routing: Set up global routing to ensure packets can travel through the network.
  • Applications: Use OnOffApplication and PacketSink to simulate traffic between nodes. Add custom applications (like FirewallApplication) to simulate network services.
  • Packet Tracing: Enable pcap tracing to capture packets.
  • Traffic Control: Enable traffic control using the RedQueueDisc queue discipline.
  • Flow Monitor: Use the FlowMonitor module to collect and print statistics about the traffic flows.

Advanced Network Service Chaining Techniques

  1. Load Balancer:

To distribute traffic across multiple servers is executed a load balancer application.

class LoadBalancerApplication : public Application

{

public:

LoadBalancerApplication ();

virtual ~LoadBalancerApplication ();

void Setup (Ptr<Socket> socket, Address address);

private:

virtual void StartApplication (void);

virtual void StopApplication (void);

void HandleRead (Ptr<Socket> socket);

Ptr<Socket>     m_socket;

Address         m_peer;

};

LoadBalancerApplication::LoadBalancerApplication ()

: m_socket (0)

{

}

LoadBalancerApplication::~LoadBalancerApplication ()

{

m_socket = 0;

}

void

LoadBalancerApplication::Setup (Ptr<Socket> socket, Address address)

{

m_socket = socket;

m_peer = address;

}

void

LoadBalancerApplication::StartApplication (void)

{

m_socket->Bind ();

m_socket->Connect (m_peer);

m_socket->SetRecvCallback (MakeCallback (&LoadBalancerApplication::HandleRead, this));

}

void

LoadBalancerApplication::StopApplication (void)

{

if (m_socket)

{

m_socket->Close ();

}

}

void

LoadBalancerApplication::HandleRead (Ptr<Socket> socket)

{

Ptr<Packet> packet;

Address from;

while ((packet = socket->RecvFrom (from)))

{

NS_LOG_UNCOND (“LoadBalancer received ” << packet->GetSize () << ” bytes from ” << InetSocketAddress::ConvertFrom (from).GetIpv4 ());

// Implement load balancing logic here (e.g., forward packets to different servers)

// For simplicity, we’ll forward all packets to the next hop

socket->Send (packet);

}

}

  1. Intrusion Detection System (IDS):

To detect and log malicious traffic to execute an IDS applications.

class IdsApplication : public Application

{

public:

IdsApplication ();

virtual ~IdsApplication ();

void Setup (Ptr<Socket> socket, Address address);

private:

virtual void StartApplication (void);

virtual void StopApplication (void);

void HandleRead (Ptr<Socket> socket);

Ptr<Socket>     m_socket;

Address         m_peer;

};

IdsApplication::IdsApplication ()

: m_socket (0)

{

}

IdsApplication::~IdsApplication ()

{

m_socket = 0;

}

void

IdsApplication::Setup (Ptr<Socket> socket, Address address)

{

m_socket = socket;

m_peer = address;

}

void

IdsApplication::StartApplication (void)

{

m_socket->Bind ();

m_socket->Connect (m_peer);

m_socket->SetRecvCallback (MakeCallback (&IdsApplication::HandleRead, this));

}

void

IdsApplication::StopApplication (void)

{

if (m_socket)

{

m_socket->Close ();

}

}

void

IdsApplication::HandleRead (Ptr<Socket> socket)

{

Ptr<Packet> packet;

Address from;

while ((packet = socket->RecvFrom (from)))

{

NS_LOG_UNCOND (“IDS received ” << packet->GetSize () << ” bytes from ” << InetSocketAddress::ConvertFrom (from).GetIpv4 ());

// Implement IDS logic here (e.g., detect and log malicious traffic)

// For simplicity, we’ll log all packets

NS_LOG_UNCOND (“Logging packet: ” << packet->GetUid ());

// Forward the packet

socket->Send (packet);

}

}

  1. Policy-Based Routing:

To control the paths that packets take through the network based on predefined rules to execute policy-based routing.

Ipv4StaticRoutingHelper ipv4RoutingHelper;

Ptr<Ipv4StaticRouting> staticRouting = ipv4RoutingHelper.GetStaticRouting (nodes.Get (0)->GetObject<Ipv4> ());

staticRouting->AddNetworkRouteTo (Ipv4Address (“10.1.2.0”), Ipv4Mask (“255.255.255.0”), Ipv4Address (“10.1.1.2”), 1);

In the end, we have discussed how the network service chaining will implemented in the ns3 tool. If you need any other information regarding the service chaining we will confirm to help and support you. We provide you with exceptional project execution ideas for the implementation of Network Service Chaining in ns3tool. Our team will conduct thorough performance analysis and offer superior simulation support. We specialize in managing numerous nodes and configuring routing effectively.