Please see https://github.com/snowzjx/ns3-ecn-sharp for a more clean code base.
We have implemented the following transportation protocol and load balance scheme.
- Hermes
- Per flow ECMP
- CONGA
- DRB
- Presto
- Weighted Presto, which has to be used together with asymmetric topology
- FlowBender
- CLOVE
- DRILL
- LetFlow
- LinkMonitor
You can use ./waf --run conga-simulation-large
to run most of the test cases to reproduce the results of our paper.
You can follow the instructions below to change the parameters of the test cases.
--ID: Running ID [default value: 0], the running ID will be added to the beginning of all ouput files.
--randomSeed: Random seed, 0 for random generated seed (based on current time) [default value: 0]
--StartTime: Start time of the simulation [default value: 0]
--EndTime: End time of the simulation [defaule value: 0.25s]
--FlowLaunchEndTime: End time of the flow launch period [default value: 0.1s]
From StartTime to FlowLaunchEndTime, flows will be generated according to CDF (see below). From FlowLaunchEndTime to EndTime, no flows will generated.
--runMode: Load balancing scheme: TLB (Hermes), Conga, Conga-flow, Presto, DRB, FlowBender, ECMP, Clove, DRILL, LetFlow [default value: Conga]
--transportProt: Transport protocol to use: Tcp, DcTcp [default value: Tcp]
--enableLargeDupAck: Whether to set the ReTxThreshold to a very large value to mask reordering [default value: false]
--enableLargeSynRetries: Whether the SYN packet would retry thousands of times [default value: false]
--enableFastReConnection: Whether the SYN gap will be very small when reconnecting [default value: false]
--enableLargeDataRetries: Whether the data retransmission will be more than 6 times [default value: false]
--serverCount: The server count [default value: 8]
--spineCount: The spine count [default value: 4]
--leafCount: The leaf count [default value: 4]
--linkCount: The link count between one spine and one leaf switch [default value: 1]
--spineLeafCapacity: Spine <-> leaf capacity (in Gbps) [default value: 10Gbps]
--leafServerCapacity: Leaf <-> server capacity (in Gbps) [default value: 10Gbps]
--linkLatency: Link latency of one hop (in microsecond) [default value: 10us]
The topology used in all test cases is a spine-leaf topology, see Figure 7 in Conga paper for more details.
To simulate an asymmetric topology, you can change the following parameters:
--asymCapacity: Whether the capacity is asym, which means some link will have only 1/5 the capacity of others [default value: false]
--asymCapacityPoss: The possibility that a path will have only 1/5 capacity (in %) [default value: 40%]
--asymCapacity2: Whether the Spine0-Leaf0's capacity is only 1/5 [default value: false]
--cdfFileName: File name for flow distribution [no default value, YOU MUST SPECIFY THIS VALUE]
--load: Load of the network, 0.0 - 1.0 [default value: 0]
If you are using DRB, Presto or other packet spay load balancing scheme, you can turn on the resequence buffer to avoid the performance degradation caused by TCP disorder.
--resequenceBuffer: Whether to enable the resequence buffer [default value: false]
--resequenceInOrderTimer: In order queue timeout (in microseconds) [default value: 5us]
--resequenceOutOrderTimer: Out order queue timeout (in microseconds) [default value: 500us]
--resequenceInOrderSize: In order queue size (in packets) [default value: 100 packets]
--resequenceBufferLog: Whether to enable the resequence buffer logging system [default value: false]
You can change the following parameters to simulate grey failures in DCN, such as pakcet random drop or packet black hole.
Random packet drop:
--enableRandomDrop: Whether the Spine-0 to other leaves has the random drop problem [default value: false]
--randomDropRate: The random drop rate when the random drop is enabled [default value: 0.005]
Packet black hole:
--blackHoleMode: The packet black hole mode, 0 for disable, 1 for matching src address only, 2 for matching dest address only, 3 for both src/dest address [default value: 0]
--blackHoleSrcAddr: The packet black hole source address [default value: 10.1.1.1]
--blackHoleSrcMask: The packet black hole source mask [default value: 255.255.255.240]
--blackHoleDestAddr: The packet black hole destination address [default value: 10.1.2.0]
--blackHoleDestMask: The packet black hole destination mask [default value: 255.255.255.0]
Notification: TLB is the former name of Hermes.
--TLBMinRTT: The RTT threshold used to judge a good path in TLB (T_{RTT_LOW}) in microseconds [Recommended value: 60 (20 + one-way base RTT)]
--TLBHighRTT: The RTT threshold used to judge a good path in TLB (T_{RTT_HIGH}) in microseconds [Recommended value: 180]
--TLBBetterPathRTT: The RTT threshold used to judge whether a path is better than another one (Delta_{RTT}) in microseconds [Recommended value: 100]
--TLBT1: The path aging time interval (i.e., the frequency to update path condition) in microseconds [Recommended value: 60]
--TLBECNPortionLow: The ECN portion used in judging a good path in TLB (T_{ECN}). (We mainly use RTT in our simulation and not all parameters related to ECN is exposed here. Please refer to /src/tlb/model/ipv4-tlb.cc for more details)
--TLBRunMode: The running mode of TLB (i.e., how to choose path from candidate paths), 0 for minimize counter, 1 for minimize RTT, 2 for random, 11 for RTT counter, 12 for RTT DRE [Recommended value: 12]
--TLBProbingEnable: Whether the TLB probing is enabled [Recommended value: true]
--TLBProbingInterval: Probing interval for TLB probing (in microseconds) [Recommended value: 100-500]
--TLBSmooth: Whether the RTT calculation is smoothed (i.e., using EWMA) [Recommended value: true]
--TLBRerouting: Whether the rerouting is enabled in TLB [Recommended value: true]
--TLBS: The sent size used to judge a whether a flow should change path in TLB (in bytes) [Recommended value: 600000]
--TLBReverseACK: Whether to enable the TLB reverse ACK path selection [Default value: false]
--quantifyRTTBase: The quantify RTT base (granularity to quantify paths to different categories according to RTT) [Default value: 10]
--TLBFlowletTimeout: The flowlet timeout value [Default value: 5ms]
If you are using Conga loading balancing scheme, you should set the following parameters:
--congaFlowletTimeout: Flowlet timeout in Conga (in microseconds) [default value: 500us]
--congaAwareAsym: Whether Conga is aware of the capacity of asymmetric path capacity [default value: true]
If you are using LetFlow loading balancing scheme, you should set the following parameters:
--letFlowFlowletTimeout: Flowlet timeout in LetFlow (in microseconds) [default value: 500us]
If you are using Clove loading balancing scheme, you should set the following parameters:
--cloveFlowletTimeout: Flowlet timeout for Clove (in microseconds) [default value: 500us]
--cloveRunMode: Clove run mode, 0 for edge flowlet, 1 for ECN, 2 for INT (not yet implemented) [default value: 0]
--cloveHalfRTT: Half RTT used in Clove ECN (in microseconds) [default value: 40us]
--cloveDisToUncongestedPath: Whether Clove will distribute the weight to uncongested path (no ECN) or all paths [default value: false]
If you are using FlowBender loading balancing scheme, you should set the following parameters:
--flowBenderT: The T in FlowBender [default value: 0.05]
--flowBenderN: The N in FlowBender [default value: 1]
Please DO NOT use those parameters if you haven't read all the code
--TcpPause: Whether TCP will pause in Hermes & FlowBender [default value: false]
--applicationPauseThresh: How many packets can pass before we have delay, 0 for disable [default value: 0]
--applicationPauseTime: The time for a delay (in microseconds) [default value: 1000us]