Simulate TCP Variant Comparison Under Bursty ON/OFF Traffic Model
In this assignment, we simulate and compare TCP NewReno and TCP Vegas using NS-3 under a bursty ON/OFF traffic pattern. A congested network is created to observe how both variants behave in terms of throughput, delay, and packet loss. This helps in understanding the difference between loss-based and delay-based congestion control and how each performs in real network conditions.
Using TCP NewReno
Code: (24BPS1039.cc)
#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/netanim-module.h"
#include "ns3/flow-monitor-module.h"
using namespace ns3;
int main() {
Config::SetDefault("ns3::TcpL4Protocol::SocketType",
TypeIdValue(TypeId::LookupByName("ns3::TcpNewReno")));
Config::SetDefault("ns3::DropTailQueue<Packet>::MaxSize",
StringValue("20p"));
NodeContainer nodes;
nodes.Create(3);
NodeContainer n0n1 = NodeContainer(nodes.Get(0), nodes.Get(1));
NodeContainer n1n2 = NodeContainer(nodes.Get(1), nodes.Get(2));
PointToPointHelper p2p1;
p2p1.SetDeviceAttribute("DataRate", StringValue("10Mbps"));
p2p1.SetChannelAttribute("Delay", StringValue("2ms"));
PointToPointHelper p2p2;
p2p2.SetDeviceAttribute("DataRate", StringValue("2Mbps"));
p2p2.SetChannelAttribute("Delay", StringValue("5ms"));
NetDeviceContainer d0d1 = p2p1.Install(n0n1);
NetDeviceContainer d1d2 = p2p2.Install(n1n2);
AsciiTraceHelper ascii;
p2p2.EnableAsciiAll(ascii.CreateFileStream("newreno-trace.tr"));
p2p2.EnablePcapAll("newreno-pcap");
InternetStackHelper stack;
stack.Install(nodes);
Ipv4AddressHelper address;
address.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer i0i1 = address.Assign(d0d1);
address.SetBase("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer i1i2 = address.Assign(d1d2);
Ipv4GlobalRoutingHelper::PopulateRoutingTables();
OnOffHelper onoff("ns3::TcpSocketFactory",
Address(InetSocketAddress(i1i2.GetAddress(1), 9)));
onoff.SetAttribute("DataRate", StringValue("10Mbps"));
onoff.SetAttribute("PacketSize", UintegerValue(1024));
onoff.SetAttribute("OnTime",
StringValue("ns3::ConstantRandomVariable[Constant=1]"));
onoff.SetAttribute("OffTime",
StringValue("ns3::ConstantRandomVariable[Constant=1]"));
ApplicationContainer app = onoff.Install(nodes.Get(0));
app.Start(Seconds(1.0));
app.Stop(Seconds(10.0));
PacketSinkHelper sink("ns3::TcpSocketFactory",
InetSocketAddress(Ipv4Address::GetAny(), 9));
ApplicationContainer sinkApp = sink.Install(nodes.Get(2));
sinkApp.Start(Seconds(0.0));
sinkApp.Stop(Seconds(10.0));
AnimationInterface anim("newreno-animation.xml");
FlowMonitorHelper flowmon;
Ptr<FlowMonitor> monitor = flowmon.InstallAll();
Simulator::Stop(Seconds(10.0));
Simulator::Run();
monitor->SerializeToXmlFile("newreno.xml", true, true);
Simulator::Destroy();
return 0;
}
Output Screenshots:
NetAnim
FlowMonitor
TraceMetrics
GNUPLOT
The graph shows the variation of throughput over time for TCP NewReno under bursty ON/OFF traffic conditions. It can be observed that the throughput fluctuates significantly, increasing during ON periods when data is transmitted and dropping sharply during OFF periods. Due to its loss-based congestion control mechanism, TCP NewReno reacts only after packet loss occurs, which leads to higher variability and less stable performance in the network.
Using TCP Vegas
Code: (24BPS1039.cc)
#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/netanim-module.h"
#include "ns3/flow-monitor-module.h"
using namespace ns3;
int main() {
Config::SetDefault("ns3::TcpL4Protocol::SocketType",
TypeIdValue(TypeId::LookupByName("ns3::TcpVegas")));
Config::SetDefault("ns3::DropTailQueue<Packet>::MaxSize",
StringValue("20p"));
NodeContainer nodes;
nodes.Create(3);
NodeContainer n0n1 = NodeContainer(nodes.Get(0), nodes.Get(1));
NodeContainer n1n2 = NodeContainer(nodes.Get(1), nodes.Get(2));
PointToPointHelper p2p1;
p2p1.SetDeviceAttribute("DataRate", StringValue("10Mbps"));
p2p1.SetChannelAttribute("Delay", StringValue("2ms"));
PointToPointHelper p2p2;
p2p2.SetDeviceAttribute("DataRate", StringValue("2Mbps"));
p2p2.SetChannelAttribute("Delay", StringValue("5ms"));
NetDeviceContainer d0d1 = p2p1.Install(n0n1);
NetDeviceContainer d1d2 = p2p2.Install(n1n2);
AsciiTraceHelper ascii;
p2p2.EnableAsciiAll(ascii.CreateFileStream("vegas-trace.tr"));
p2p2.EnablePcapAll("vegas-pcap");
InternetStackHelper stack;
stack.Install(nodes);
Ipv4AddressHelper address;
address.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer i0i1 = address.Assign(d0d1);
address.SetBase("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer i1i2 = address.Assign(d1d2);
Ipv4GlobalRoutingHelper::PopulateRoutingTables();
OnOffHelper onoff("ns3::TcpSocketFactory",
Address(InetSocketAddress(i1i2.GetAddress(1), 9)));
onoff.SetAttribute("DataRate", StringValue("10Mbps"));
onoff.SetAttribute("PacketSize", UintegerValue(1024));
onoff.SetAttribute("OnTime",
StringValue("ns3::ConstantRandomVariable[Constant=1]"));
onoff.SetAttribute("OffTime",
StringValue("ns3::ConstantRandomVariable[Constant=1]"));
ApplicationContainer app = onoff.Install(nodes.Get(0));
app.Start(Seconds(1.0));
app.Stop(Seconds(10.0));
PacketSinkHelper sink("ns3::TcpSocketFactory",
InetSocketAddress(Ipv4Address::GetAny(), 9));
ApplicationContainer sinkApp = sink.Install(nodes.Get(2));
sinkApp.Start(Seconds(0.0));
sinkApp.Stop(Seconds(10.0));
AnimationInterface anim("vegas-animation.xml");
FlowMonitorHelper flowmon;
Ptr<FlowMonitor> monitor = flowmon.InstallAll();
Simulator::Stop(Seconds(10.0));
Simulator::Run();
monitor->SerializeToXmlFile("vegas.xml", true, true);
Simulator::Destroy();
return 0;
}
Output Screenshots:
NetAnim
FlowMonitor
TraceMetrics
GNUPLOT
The graph shows the variation of throughput over time for TCP Vegas under bursty ON/OFF traffic conditions. It can be observed that the throughput remains relatively smooth and stable compared to TCP NewReno, with fewer fluctuations between ON and OFF periods. This is because TCP Vegas uses a delay-based congestion control mechanism, allowing it to detect congestion early and adjust its transmission rate accordingly, resulting in more consistent network performance.
Comparison & Result Analysis of Both Graphs
The comparison shows that TCP NewReno achieves slightly higher throughput but with noticeable fluctuations, delay, and packet loss due to its loss-based approach. In contrast, TCP Vegas provides smoother and more stable performance by detecting congestion early using a delay-based mechanism. Overall, TCP Vegas offers more consistent network behavior, while NewReno is more aggressive under bursty traffic conditions.
Large Language Model (LLM) Used
ChatGPT (OpenAI)
Prompt Inserted
Generate NS-3 C++ code to simulate and compare TCP NewReno and TCP Vegas under a bursty ON/OFF traffic model. Use a 3-node topology consisting of a sender, router, and receiver, with a high-bandwidth link followed by a low-bandwidth bottleneck link to create congestion. Configure ON/OFF traffic using the OnOffApplication, and include FlowMonitor, NetAnim, and trace metrics to analyze performance in terms of throughput, delay, and packet loss. The simulation should run for a fixed duration and allow comparison of both TCP variants under identical conditions. Also, generate appropriate data and provide GNUPLOT scripts to plot throughput versus time graphs for each TCP variant and a combined comparison graph.
Comments
Post a Comment