93 #include "ns3/applications-module.h"
94 #include "ns3/core-module.h"
95 #include "ns3/internet-module.h"
96 #include "ns3/network-module.h"
97 #include "ns3/point-to-point-module.h"
98 #include "ns3/traffic-control-module.h"
120 std::cout <<
"Progress to " << std::fixed << std::setprecision(1)
146 for (std::size_t i = 0; i < 10; i++)
150 for (std::size_t i = 0; i < 20; i++)
154 for (std::size_t i = 0; i < 10; i++)
163 for (std::size_t i = 0; i < 10; i++)
169 for (std::size_t i = 0; i < 20; i++)
175 for (std::size_t i = 0; i < 10; i++)
188 uint64_t sumSquares = 0;
191 for (std::size_t i = 0; i < 10; i++)
196 average = ((sum / 10) * 8 / measurementWindow.
GetSeconds()) / 1e6;
197 fairness =
static_cast<double>(sum * sum) / (10 * sumSquares);
198 fairnessIndex <<
"Average throughput for S1-R1 flows: " << std::fixed << std::setprecision(2)
199 << average <<
" Mbps; fairness: " << std::fixed << std::setprecision(3)
200 << fairness << std::endl;
205 for (std::size_t i = 0; i < 20; i++)
210 average = ((sum / 20) * 8 / measurementWindow.
GetSeconds()) / 1e6;
211 fairness =
static_cast<double>(sum * sum) / (20 * sumSquares);
212 fairnessIndex <<
"Average throughput for S2-R2 flows: " << std::fixed << std::setprecision(2)
213 << average <<
" Mbps; fairness: " << std::fixed << std::setprecision(3)
214 << fairness << std::endl;
219 for (std::size_t i = 0; i < 10; i++)
224 average = ((sum / 10) * 8 / measurementWindow.
GetSeconds()) / 1e6;
225 fairness =
static_cast<double>(sum * sum) / (10 * sumSquares);
226 fairnessIndex <<
"Average throughput for S3-R1 flows: " << std::fixed << std::setprecision(2)
227 << average <<
" Mbps; fairness: " << std::fixed << std::setprecision(3)
228 << fairness << std::endl;
230 for (std::size_t i = 0; i < 10; i++)
234 for (std::size_t i = 0; i < 20; i++)
238 fairnessIndex <<
"Aggregate user-level throughput for flows through T1: "
239 <<
static_cast<double>(sum * 8) / 1e9 <<
" Gbps" << std::endl;
241 for (std::size_t i = 0; i < 10; i++)
245 for (std::size_t i = 0; i < 10; i++)
249 fairnessIndex <<
"Aggregate user-level throughput for flows to R1: "
250 <<
static_cast<double>(sum * 8) / 1e9 <<
" Gbps" << std::endl;
258 Time backlog =
Seconds(
static_cast<double>(qSize * 1500 * 8) / 1e10);
270 Time backlog =
Seconds(
static_cast<double>(qSize * 1500 * 8) / 1e9);
279 main(
int argc,
char* argv[])
281 std::string outputFilePath =
".";
282 std::string tcpTypeId =
"TcpDctcp";
286 bool enableSwitchEcn =
true;
290 cmd.AddValue(
"tcpTypeId",
"ns-3 TCP TypeId", tcpTypeId);
291 cmd.AddValue(
"flowStartupWindow",
292 "startup time window (TCP staggered starts)",
294 cmd.AddValue(
"convergenceTime",
"convergence time", convergenceTime);
295 cmd.AddValue(
"measurementWindow",
"measurement window", measurementWindow);
296 cmd.AddValue(
"enableSwitchEcn",
"enable ECN at switches", enableSwitchEcn);
297 cmd.Parse(argc, argv);
302 Time stopTime = flowStartupWindow + convergenceTime + measurementWindow;
349 std::vector<NetDeviceContainer> S1T1;
351 std::vector<NetDeviceContainer> S2T1;
353 std::vector<NetDeviceContainer> S3T2;
355 std::vector<NetDeviceContainer> R2T2;
360 for (std::size_t i = 0; i < 10; i++)
363 S1T1.push_back(pointToPointSR.
Install(n, T1));
365 for (std::size_t i = 0; i < 20; i++)
368 S2T1.push_back(pointToPointSR.
Install(n, T1));
370 for (std::size_t i = 0; i < 10; i++)
373 S3T2.push_back(pointToPointSR.
Install(n, T2));
375 for (std::size_t i = 0; i < 20; i++)
378 R2T2.push_back(pointToPointSR.
Install(n, T2));
411 for (std::size_t i = 0; i < 10; i++)
413 tchRed1.
Install(S1T1[i].Get(1));
415 for (std::size_t i = 0; i < 20; i++)
417 tchRed1.
Install(S2T1[i].Get(1));
419 for (std::size_t i = 0; i < 10; i++)
421 tchRed1.
Install(S3T2[i].Get(1));
423 for (std::size_t i = 0; i < 20; i++)
425 tchRed1.
Install(R2T2[i].Get(1));
429 std::vector<Ipv4InterfaceContainer> ipS1T1;
431 std::vector<Ipv4InterfaceContainer> ipS2T1;
433 std::vector<Ipv4InterfaceContainer> ipS3T2;
435 std::vector<Ipv4InterfaceContainer> ipR2T2;
437 address.SetBase(
"172.16.1.0",
"255.255.255.0");
439 address.SetBase(
"192.168.0.0",
"255.255.255.0");
441 address.SetBase(
"10.1.1.0",
"255.255.255.0");
442 for (std::size_t i = 0; i < 10; i++)
444 ipS1T1.push_back(
address.Assign(S1T1[i]));
447 address.SetBase(
"10.2.1.0",
"255.255.255.0");
448 for (std::size_t i = 0; i < 20; i++)
450 ipS2T1.push_back(
address.Assign(S2T1[i]));
453 address.SetBase(
"10.3.1.0",
"255.255.255.0");
454 for (std::size_t i = 0; i < 10; i++)
456 ipS3T2.push_back(
address.Assign(S3T2[i]));
459 address.SetBase(
"10.4.1.0",
"255.255.255.0");
460 for (std::size_t i = 0; i < 20; i++)
462 ipR2T2.push_back(
address.Assign(R2T2[i]));
469 std::vector<Ptr<PacketSink>> r2Sinks;
471 for (std::size_t i = 0; i < 20; i++)
473 uint16_t
port = 50000 + i;
478 r2Sinks.push_back(packetSink);
479 sinkApp.
Start(startTime);
483 clientHelper1.SetAttribute(
"OnTime",
484 StringValue(
"ns3::ConstantRandomVariable[Constant=1]"));
485 clientHelper1.SetAttribute(
"OffTime",
486 StringValue(
"ns3::ConstantRandomVariable[Constant=0]"));
487 clientHelper1.SetAttribute(
"DataRate", DataRateValue(
DataRate(
"1Gbps")));
488 clientHelper1.SetAttribute(
"PacketSize",
UintegerValue(1000));
493 clientApps1.
Add(clientHelper1.Install(S2.
Get(i)));
499 std::vector<Ptr<PacketSink>> s1r1Sinks;
500 std::vector<Ptr<PacketSink>> s3r1Sinks;
501 s1r1Sinks.reserve(10);
502 s3r1Sinks.reserve(10);
503 for (std::size_t i = 0; i < 20; i++)
505 uint16_t
port = 50000 + i;
512 s1r1Sinks.push_back(packetSink);
516 s3r1Sinks.push_back(packetSink);
518 sinkApp.
Start(startTime);
522 clientHelper1.SetAttribute(
"OnTime",
523 StringValue(
"ns3::ConstantRandomVariable[Constant=1]"));
524 clientHelper1.SetAttribute(
"OffTime",
525 StringValue(
"ns3::ConstantRandomVariable[Constant=0]"));
526 clientHelper1.SetAttribute(
"DataRate", DataRateValue(
DataRate(
"1Gbps")));
527 clientHelper1.SetAttribute(
"PacketSize",
UintegerValue(1000));
534 clientApps1.
Add(clientHelper1.Install(S1.
Get(i)));
539 clientApps1.
Add(clientHelper1.Install(S3.
Get(i - 10)));
540 clientApps1.
Start((i - 10) * flowStartupWindow / 10 + startTime +
MilliSeconds(i * 5));
552 fairnessIndex.open(
"dctcp-example-fairness.dat", std::ios::out);
553 t1QueueLength.open(
"dctcp-example-t1-length.dat", std::ios::out);
554 t1QueueLength <<
"#Time(s) qlen(pkts) qlen(us)" << std::endl;
555 t2QueueLength.open(
"dctcp-example-t2-length.dat", std::ios::out);
556 t2QueueLength <<
"#Time(s) qlen(pkts) qlen(us)" << std::endl;
557 for (std::size_t i = 0; i < 10; i++)
561 for (std::size_t i = 0; i < 20; i++)
565 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.
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.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
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)
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.
uint32_t GetNPackets() const
Get the number of packets stored by the queue disc.
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.
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
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.