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 Data Synchronization in ns3

To implement network data synchronization in ns3, we need to create a scenario where nodes can keep their data consistent by synchronizing updates with each other. This simulates different real-world applications such as distributed databases, file synchronization services, or any system where data consistency across multiple nodes is crucial. Here are the steps to implement this in ns3.

Steps for implementation

Step 1: Set up the simulation

Make sure that ns3 is installed in the computer. If not, install it.

Step 2: Create the network topology

Define the network topology with multiple nodes. In our example, let’s simulate a scenario where nodes synchronize their data with each other.

Step 4: Define the Bootstrapping Application

Simulate the network data synchronization application in ns3.

Step 4: Write the script

Here is an example script to create and configure network bootstrapping in ns3.

  • Create a new file :

Save the below script as data-synchronization.cc in the scratch directory of our ns3 installation.

#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/mobility-module.h”

#include “ns3/wifi-module.h”

using namespace ns3;

NS_LOG_COMPONENT_DEFINE (“DataSynchronizationExample”);

class DataSynchronizationApplication : public Application

{

public:

DataSynchronizationApplication ();

virtual ~DataSynchronizationApplication ();

void Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, Time interPacketInterval);

void SetData (std::string data);

std::string GetData () const;

protected:

virtual void StartApplication (void);

virtual void StopApplication (void);

private:

void SendPacket ();

void ReceivePacket (Ptr<Socket> socket);

Ptr<Socket> m_socket;

Address m_peer;

uint32_t m_packetSize;

uint32_t m_nPackets;

Time m_interval;

uint32_t m_sent;

std::string m_data;

EventId m_sendEvent;

};

DataSynchronizationApplication::DataSynchronizationApplication ()

: m_socket (0),

m_packetSize (0),

m_nPackets (0),

m_sent (0)

{

}

DataSynchronizationApplication::~DataSynchronizationApplication ()

{

m_socket = 0;

}

void

DataSynchronizationApplication::Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, Time interPacketInterval)

{

m_socket = socket;

m_peer = address;

m_packetSize = packetSize;

m_nPackets = nPackets;

m_interval = interPacketInterval;

}

void

DataSynchronizationApplication::SetData (std::string data)

{

m_data = data;

}

std::string

DataSynchronizationApplication::GetData () const

{

return m_data;

}

void

DataSynchronizationApplication::StartApplication (void)

{

m_socket->Bind ();

m_socket->Connect (m_peer);

m_socket->SetRecvCallback (MakeCallback (&DataSynchronizationApplication::ReceivePacket, this));

SendPacket ();

}

void

DataSynchronizationApplication::StopApplication (void)

{

if (m_socket)

{

m_socket->Close ();

}

Simulator::Cancel (m_sendEvent);

}

void

DataSynchronizationApplication::SendPacket ()

{

Ptr<Packet> packet = Create<Packet> ((uint8_t*)m_data.c_str(), m_data.size());

m_socket->Send (packet);

if (++m_sent < m_nPackets)

{

m_sendEvent = Simulator::Schedule (m_interval, &DataSynchronizationApplication::SendPacket, this);

}

}

void

DataSynchronizationApplication::ReceivePacket (Ptr<Socket> socket)

{

Ptr<Packet> packet = socket->Recv ();

uint8_t *buffer = new uint8_t[packet->GetSize ()];

packet->CopyData (buffer, packet->GetSize ());

std::string receivedData = std::string((char*)buffer, packet->GetSize ());

NS_LOG_UNCOND (“Received data: ” << receivedData);

m_data = receivedData;

delete[] buffer;

}

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

{

CommandLine cmd;

cmd.Parse (argc, argv);

NodeContainer nodes;

nodes.Create (2); // Two nodes for data synchronization

// Set up point-to-point links between nodes

PointToPointHelper pointToPoint;

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

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

NetDeviceContainer devices;

devices = pointToPoint.Install (nodes);

// Install the Internet stack on the nodes

InternetStackHelper stack;

stack.Install (nodes);

// Assign IP addresses to the devices

Ipv4AddressHelper address;

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

Ipv4InterfaceContainer interfaces = address.Assign (devices);

// Set up mobility

MobilityHelper mobility;

mobility.SetMobilityModel (“ns3::ConstantPositionMobilityModel”);

mobility.Install (nodes);

nodes.Get (0)->GetObject<MobilityModel> ()->SetPosition (Vector (0.0, 0.0, 0.0));

nodes.Get (1)->GetObject<MobilityModel> ()->SetPosition (Vector (50.0, 0.0, 0.0));

// Set up data synchronization applications

uint32_t packetSize = 1024;

uint32_t nPackets = 10;

Time interPacketInterval = Seconds (1.0);

// Node A

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

Ptr<DataSynchronizationApplication> appA = CreateObject<DataSynchronizationApplication> ();

appA->Setup (sourceSocketA, InetSocketAddress (interfaces.GetAddress (1), 9), packetSize, nPackets, interPacketInterval);

appA->SetData (“Data from Node A”);

nodes.Get (0)->AddApplication (appA);

appA->SetStartTime (Seconds (2.0));

appA->SetStopTime (Seconds (10.0));

// Node B

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

InetSocketAddress localB = InetSocketAddress (Ipv4Address::GetAny (), 9);

sinkSocketB->Bind (localB);

Ptr<DataSynchronizationApplication> appB = CreateObject<DataSynchronizationApplication> ();

nodes.Get (1)->AddApplication (appB);

sinkSocketB->SetRecvCallback (MakeCallback (&DataSynchronizationApplication::ReceivePacket, appB));

// Enable packet capturing

pointToPoint.EnablePcapAll (“data-synchronization”);

// Run simulation

Simulator::Run ();

Simulator::Destroy ();

return 0;

}

Explanation:

  1. Create Nodes and Network:
    • Two nodes are created and connected them using point-to-point links.
    • On all nodes, install the Internet stack.
    • Assign IP addresses to the devices.
  2. Define Data Synchronization Application:
    • Create a DataSynchronizationApplication class sends and receives data for synchronization.
    • The SendPacket function is used to create packets with the specified data and sends them.
    • The ReceivePacket function is used to handle incoming packets and update the node’s data.
  3. Install and Configure the Application:
    • For sending and receiving, create sockets.
    • On the nodes, install the DataSynchronizationApplication.
    • Configure the application with the necessary parameters, such as packet size, number of packets, inter-packet interval, and data.
  4. Run the Simulation:
    • Define the start and stop times for the applications.
    • Run the simulation and log the results.

 

Step 4: Build and Run the Simulation

Save the script as data-synchronization.cc and build the script using waf, then run the simulation.

./waf configure

./waf build

./waf –run data-synchronization

Step 5: Analyze the results

We can analyze the results by observing at the logs to verify the behavior of the data synchronization application after the simulation.

On the whole, we had an analysis on the implementation of network data synchronization by creating a scenario where nodes can keep their data consistent by synchronizing updates with each other. Also, we provide a detailed explanation on Network Data Synchronization.

Kindly reach out to ns3simulation.com for further guidance on implementing Network Data Synchronization in ns3. Our simulations focus on ensuring nodes maintain data consistency through synchronized updates tailored to your project requirements.