82#include "ns3/applications-module.h"
83#include "ns3/core-module.h"
84#include "ns3/internet-module.h"
85#include "ns3/network-module.h"
86#include "ns3/point-to-point-module.h"
87#include "ns3/traffic-control-module.h"
109 std::cout <<
"Progress to " << std::fixed << std::setprecision(1)
135 for (std::size_t i = 0; i < 10; i++)
139 for (std::size_t i = 0; i < 20; i++)
143 for (std::size_t i = 0; i < 10; i++)
152 for (std::size_t i = 0; i < 10; i++)
158 for (std::size_t i = 0; i < 20; i++)
164 for (std::size_t i = 0; i < 10; i++)
177 uint64_t sumSquares = 0;
180 for (std::size_t i = 0; i < 10; i++)
185 average = ((sum / 10) * 8 / measurementWindow.
GetSeconds()) / 1e6;
186 fairness =
static_cast<double>(sum * sum) / (10 * sumSquares);
187 fairnessIndex <<
"Average throughput for S1-R1 flows: " << std::fixed << std::setprecision(2)
188 << average <<
" Mbps; fairness: " << std::fixed << std::setprecision(3)
189 << fairness << std::endl;
194 for (std::size_t i = 0; i < 20; i++)
199 average = ((sum / 20) * 8 / measurementWindow.
GetSeconds()) / 1e6;
200 fairness =
static_cast<double>(sum * sum) / (20 * sumSquares);
201 fairnessIndex <<
"Average throughput for S2-R2 flows: " << std::fixed << std::setprecision(2)
202 << average <<
" Mbps; fairness: " << std::fixed << std::setprecision(3)
203 << fairness << std::endl;
208 for (std::size_t i = 0; i < 10; i++)
213 average = ((sum / 10) * 8 / measurementWindow.
GetSeconds()) / 1e6;
214 fairness =
static_cast<double>(sum * sum) / (10 * sumSquares);
215 fairnessIndex <<
"Average throughput for S3-R1 flows: " << std::fixed << std::setprecision(2)
216 << average <<
" Mbps; fairness: " << std::fixed << std::setprecision(3)
217 << fairness << std::endl;
219 for (std::size_t i = 0; i < 10; i++)
223 for (std::size_t i = 0; i < 20; i++)
227 fairnessIndex <<
"Aggregate user-level throughput for flows through T1: "
228 <<
static_cast<double>(sum * 8) / 1e9 <<
" Gbps" << std::endl;
230 for (std::size_t i = 0; i < 10; i++)
234 for (std::size_t i = 0; i < 10; i++)
238 fairnessIndex <<
"Aggregate user-level throughput for flows to R1: "
239 <<
static_cast<double>(sum * 8) / 1e9 <<
" Gbps" << std::endl;
246 uint32_t qSize = queue->GetNPackets();
247 Time backlog =
Seconds(
static_cast<double>(qSize * 1500 * 8) / 1e10);
258 uint32_t qSize = queue->GetNPackets();
259 Time backlog =
Seconds(
static_cast<double>(qSize * 1500 * 8) / 1e9);
268main(
int argc,
char* argv[])
270 std::string outputFilePath =
".";
271 std::string tcpTypeId =
"TcpDctcp";
275 bool enableSwitchEcn =
true;
279 cmd.AddValue(
"tcpTypeId",
"ns-3 TCP TypeId", tcpTypeId);
280 cmd.AddValue(
"flowStartupWindow",
281 "startup time window (TCP staggered starts)",
283 cmd.AddValue(
"convergenceTime",
"convergence time", convergenceTime);
284 cmd.AddValue(
"measurementWindow",
"measurement window", measurementWindow);
285 cmd.AddValue(
"enableSwitchEcn",
"enable ECN at switches", enableSwitchEcn);
286 cmd.Parse(argc, argv);
291 Time stopTime = flowStartupWindow + convergenceTime + measurementWindow;
338 std::vector<NetDeviceContainer> S1T1;
340 std::vector<NetDeviceContainer> S2T1;
342 std::vector<NetDeviceContainer> S3T2;
344 std::vector<NetDeviceContainer> R2T2;
349 for (std::size_t i = 0; i < 10; i++)
352 S1T1.push_back(pointToPointSR.
Install(n, T1));
354 for (std::size_t i = 0; i < 20; i++)
357 S2T1.push_back(pointToPointSR.
Install(n, T1));
359 for (std::size_t i = 0; i < 10; i++)
362 S3T2.push_back(pointToPointSR.
Install(n, T2));
364 for (std::size_t i = 0; i < 20; i++)
367 R2T2.push_back(pointToPointSR.
Install(n, T2));
400 for (std::size_t i = 0; i < 10; i++)
402 tchRed1.
Install(S1T1[i].Get(1));
404 for (std::size_t i = 0; i < 20; i++)
406 tchRed1.
Install(S2T1[i].Get(1));
408 for (std::size_t i = 0; i < 10; i++)
410 tchRed1.
Install(S3T2[i].Get(1));
412 for (std::size_t i = 0; i < 20; i++)
414 tchRed1.
Install(R2T2[i].Get(1));
418 std::vector<Ipv4InterfaceContainer> ipS1T1;
420 std::vector<Ipv4InterfaceContainer> ipS2T1;
422 std::vector<Ipv4InterfaceContainer> ipS3T2;
424 std::vector<Ipv4InterfaceContainer> ipR2T2;
426 address.SetBase(
"172.16.1.0",
"255.255.255.0");
428 address.SetBase(
"192.168.0.0",
"255.255.255.0");
430 address.SetBase(
"10.1.1.0",
"255.255.255.0");
431 for (std::size_t i = 0; i < 10; i++)
433 ipS1T1.push_back(
address.Assign(S1T1[i]));
436 address.SetBase(
"10.2.1.0",
"255.255.255.0");
437 for (std::size_t i = 0; i < 20; i++)
439 ipS2T1.push_back(
address.Assign(S2T1[i]));
442 address.SetBase(
"10.3.1.0",
"255.255.255.0");
443 for (std::size_t i = 0; i < 10; i++)
445 ipS3T2.push_back(
address.Assign(S3T2[i]));
448 address.SetBase(
"10.4.1.0",
"255.255.255.0");
449 for (std::size_t i = 0; i < 20; i++)
451 ipR2T2.push_back(
address.Assign(R2T2[i]));
458 std::vector<Ptr<PacketSink>> r2Sinks;
460 for (std::size_t i = 0; i < 20; i++)
462 uint16_t
port = 50000 + i;
467 r2Sinks.push_back(packetSink);
468 sinkApp.
Start(startTime);
472 clientHelper1.SetAttribute(
"OnTime",
473 StringValue(
"ns3::ConstantRandomVariable[Constant=1]"));
474 clientHelper1.SetAttribute(
"OffTime",
475 StringValue(
"ns3::ConstantRandomVariable[Constant=0]"));
477 clientHelper1.SetAttribute(
"PacketSize",
UintegerValue(1000));
481 clientHelper1.SetAttribute(
"Remote", remoteAddress);
482 clientApps1.
Add(clientHelper1.Install(S2.
Get(i)));
488 std::vector<Ptr<PacketSink>> s1r1Sinks;
489 std::vector<Ptr<PacketSink>> s3r1Sinks;
490 s1r1Sinks.reserve(10);
491 s3r1Sinks.reserve(10);
492 for (std::size_t i = 0; i < 20; i++)
494 uint16_t
port = 50000 + i;
501 s1r1Sinks.push_back(packetSink);
505 s3r1Sinks.push_back(packetSink);
507 sinkApp.
Start(startTime);
511 clientHelper1.SetAttribute(
"OnTime",
512 StringValue(
"ns3::ConstantRandomVariable[Constant=1]"));
513 clientHelper1.SetAttribute(
"OffTime",
514 StringValue(
"ns3::ConstantRandomVariable[Constant=0]"));
516 clientHelper1.SetAttribute(
"PacketSize",
UintegerValue(1000));
520 clientHelper1.SetAttribute(
"Remote", remoteAddress);
523 clientApps1.
Add(clientHelper1.Install(S1.
Get(i)));
528 clientApps1.
Add(clientHelper1.Install(S3.
Get(i - 10)));
529 clientApps1.
Start((i - 10) * flowStartupWindow / 10 + startTime +
MilliSeconds(i * 5));
541 fairnessIndex.open(
"dctcp-example-fairness.dat", std::ios::out);
542 t1QueueLength.open(
"dctcp-example-t1-length.dat", std::ios::out);
543 t1QueueLength <<
"#Time(s) qlen(pkts) qlen(us)" << std::endl;
544 t2QueueLength.open(
"dctcp-example-t2-length.dat", std::ios::out);
545 t2QueueLength <<
"#Time(s) qlen(pkts) qlen(us)" << std::endl;
546 for (std::size_t i = 0; i < 10; i++)
550 for (std::size_t i = 0; i < 20; i++)
554 for (std::size_t i = 0; i < 10; i++)
a polymophic address class
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
void Stop(Time stop) const
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container.
Parse command-line arguments.
Class for representing data rates.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
static void Bind(std::string name, const AttributeValue &value)
Iterate over the set of GlobalValues until a matching name is found and then set its value with Globa...
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
static Ipv4Address GetAny()
static void PopulateRoutingTables()
Build a routing database and initialize the routing tables of the nodes in the simulation.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
Receive and consume traffic generated to an IP address and port.
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
NetDeviceContainer Install(NodeContainer c)
Smart pointer class similar to boost::intrusive_ptr.
Holds a vector of ns3::QueueDisc pointers.
Ptr< QueueDisc > Get(std::size_t i) const
Get the Ptr<QueueDisc> stored in this container at a given index.
Class for representing queue sizes.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static Time Now()
Return the current simulation virtual time.
static void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
int64_t GetMicroSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Build a set of QueueDisc objects.
QueueDiscContainer Install(NetDeviceContainer c)
uint16_t SetRootQueueDisc(const std::string &type, Args &&... args)
Helper function used to set a root queue disc of the given type and with the given attributes.
Hold an unsigned integer type.
void TraceS1R1Sink(std::size_t index, Ptr< const Packet > p, const Address &a)
std::ofstream rxS3R1Throughput
std::ofstream fairnessIndex
std::ofstream t1QueueLength
std::vector< uint64_t > rxS3R1Bytes
std::stringstream filePlotQueue1
void PrintFairness(Time measurementWindow)
void InitializeCounters()
void TraceS2R2Sink(std::size_t index, Ptr< const Packet > p, const Address &a)
std::vector< uint64_t > rxS2R2Bytes
void PrintThroughput(Time measurementWindow)
void CheckT1QueueSize(Ptr< QueueDisc > queue)
void PrintProgress(Time interval)
std::stringstream filePlotQueue2
std::ofstream rxS2R2Throughput
void TraceS3R1Sink(std::size_t index, Ptr< const Packet > p, const Address &a)
std::vector< uint64_t > rxS1R1Bytes
std::ofstream rxS1R1Throughput
std::ofstream t2QueueLength
void CheckT2QueueSize(Ptr< QueueDisc > queue)
void SetDefault(std::string name, const AttributeValue &value)
auto MakeBoundCallback(R(*fnPtr)(Args...), BArgs &&... bargs)
Make Callbacks with varying number of bound arguments.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.