1 set N 8 2 set B 250 3 set K 65 4 set RTT 0.0001 5 6 set simulationTime 1.0 7 8 set startMeasurementTime 1 9 set stopMeasurementTime 2 10 set flowClassifyTime 0.001 11 12 set sourceAlg DC-TCP-Sack 13 set switchAlg RED 14 set lineRate 10Gb 15 set inputLineRate 11Gb 16 17 set DCTCP_g_ 0.0625 18 set ackRatio 1 19 set packetSize 1460 20 21 set traceSamplingInterval 0.0001 22 set throughputSamplingInterval 0.01 23 set enableNAM 0 24 25 set ns [new Simulator] 26 27 Agent/TCP set ecn_ 1 28 Agent/TCP set old_ecn_ 1 29 Agent/TCP set packetSize_ $packetSize 30 Agent/TCP/FullTcp set segsize_ $packetSize 31 Agent/TCP set window_ 1256 32 Agent/TCP set slow_start_restart_ false 33 Agent/TCP set tcpTick_ 0.01 34 Agent/TCP set minrto_ 0.2 ; # minRTO = 200ms 35 Agent/TCP set windowOption_ 0 36 37 38 if {[string compare $sourceAlg "DC-TCP-Sack"] == 0} { 39 Agent/TCP set dctcp_ true 40 Agent/TCP set dctcp_g_ $DCTCP_g_; 41 } 42 Agent/TCP/FullTcp set segsperack_ $ackRatio; 43 Agent/TCP/FullTcp set spa_thresh_ 3000; 44 Agent/TCP/FullTcp set interval_ 0.04 ; #delayed ACK interval = 40ms 45 46 Queue set limit_ 1000 47 48 Queue/RED set bytes_ false 49 Queue/RED set queue_in_bytes_ true 50 Queue/RED set mean_pktsize_ $packetSize 51 Queue/RED set setbit_ true 52 Queue/RED set gentle_ false 53 Queue/RED set q_weight_ 1.0 54 Queue/RED set mark_p_ 1.0 55 Queue/RED set thresh_ [expr $K] 56 Queue/RED set maxthresh_ [expr $K] 57 58 DelayLink set avoidReordering_ true 59 60 if {$enableNAM != 0} { 61 set namfile [open out.nam w] 62 $ns namtrace-all $namfile 63 } 64 65 set mytracefile [open mytracefile.tr w] 66 set throughputfile [open thrfile.tr w] 67 68 proc finish {} { 69 global ns enableNAM namfile mytracefile throughputfile 70 $ns flush-trace 71 close $mytracefile 72 close $throughputfile 73 if {$enableNAM != 0} { 74 close $namfile 75 exec nam out.nam & 76 } 77 exit 0 78 } 79 80 proc myTrace {file} { 81 global ns N traceSamplingInterval tcp qfile MainLink nbow nclient packetSize enableBumpOnWire 82 83 set now [$ns now] 84 85 for {set i 0} {$i < $N} {incr i} { 86 set cwnd($i) [$tcp($i) set cwnd_] 87 set dctcp_alpha($i) [$tcp($i) set dctcp_alpha_] 88 } 89 90 $qfile instvar parrivals_ pdepartures_ pdrops_ bdepartures_ 91 92 puts -nonewline $file "$now $cwnd(0)" 93 for {set i 1} {$i < $N} {incr i} { 94 puts -nonewline $file " $cwnd($i)" 95 } 96 for {set i 0} {$i < $N} {incr i} { 97 puts -nonewline $file " $dctcp_alpha($i)" 98 } 99 100 puts -nonewline $file " [expr $parrivals_-$pdepartures_-$pdrops_]" 101 puts $file " $pdrops_" 102 103 $ns at [expr $now+$traceSamplingInterval] "myTrace $file" 104 } 105 106 proc throughputTrace {file} { 107 global ns throughputSamplingInterval qfile flowstats N flowClassifyTime 108 109 set now [$ns now] 110 111 $qfile instvar bdepartures_ 112 113 puts -nonewline $file "$now [expr $bdepartures_*8/$throughputSamplingInterval/1000000]" 114 set bdepartures_ 0 115 if {$now <= $flowClassifyTime} { 116 for {set i 0} {$i < [expr $N-1]} {incr i} { 117 puts -nonewline $file " 0" 118 } 119 puts $file " 0" 120 } 121 122 if {$now > $flowClassifyTime} { 123 for {set i 0} {$i < [expr $N-1]} {incr i} { 124 $flowstats($i) instvar barrivals_ 125 puts -nonewline $file " [expr $barrivals_*8/$throughputSamplingInterval/1000000]" 126 set barrivals_ 0 127 } 128 $flowstats([expr $N-1]) instvar barrivals_ 129 puts $file " [expr $barrivals_*8/$throughputSamplingInterval/1000000]" 130 set barrivals_ 0 131 } 132 $ns at [expr $now+$throughputSamplingInterval] "throughputTrace $file" 133 } 134 135 136 $ns color 0 Red 137 $ns color 1 Orange 138 $ns color 2 Yellow 139 $ns color 3 Green 140 $ns color 4 Blue 141 $ns color 5 Violet 142 $ns color 6 Brown 143 $ns color 7 Black 144 145 for {set i 0} {$i < $N} {incr i} { 146 set n($i) [$ns node] 147 } 148 149 set nqueue [$ns node] 150 set nclient [$ns node] 151 152 153 $nqueue color red 154 $nqueue shape box 155 $nclient color blue 156 157 for {set i 0} {$i < $N} {incr i} { 158 $ns duplex-link $n($i) $nqueue $inputLineRate [expr $RTT/4] DropTail 159 $ns duplex-link-op $n($i) $nqueue queuePos 0.25 160 } 161 162 163 $ns simplex-link $nqueue $nclient $lineRate [expr $RTT/4] $switchAlg 164 $ns simplex-link $nclient $nqueue $lineRate [expr $RTT/4] DropTail 165 $ns queue-limit $nqueue $nclient $B 166 167 $ns duplex-link-op $nqueue $nclient color "green" 168 $ns duplex-link-op $nqueue $nclient queuePos 0.25 169 set qfile [$ns monitor-queue $nqueue $nclient [open queue.tr w] $traceSamplingInterval] 170 171 172 for {set i 0} {$i < $N} {incr i} { 173 if {[string compare $sourceAlg "Newreno"] == 0 || [string compare $sourceAlg "DC-TCP-Newreno"] == 0} { 174 set tcp($i) [new Agent/TCP/Newreno] 175 set sink($i) [new Agent/TCPSink] 176 } 177 if {[string compare $sourceAlg "Sack"] == 0 || [string compare $sourceAlg "DC-TCP-Sack"] == 0} { 178 set tcp($i) [new Agent/TCP/FullTcp/Sack] 179 set sink($i) [new Agent/TCP/FullTcp/Sack] 180 $sink($i) listen 181 } 182 183 $ns attach-agent $n($i) $tcp($i) 184 $ns attach-agent $nclient $sink($i) 185 186 $tcp($i) set fid_ [expr $i] 187 $sink($i) set fid_ [expr $i] 188 189 $ns connect $tcp($i) $sink($i) 190 } 191 192 for {set i 0} {$i < $N} {incr i} { 193 set ftp($i) [new Application/FTP] 194 $ftp($i) attach-agent $tcp($i) 195 } 196 197 $ns at $traceSamplingInterval "myTrace $mytracefile" 198 $ns at $throughputSamplingInterval "throughputTrace $throughputfile" 199 200 set ru [new RandomVariable/Uniform] 201 $ru set min_ 0 202 $ru set max_ 1.0 203 204 for {set i 0} {$i < $N} {incr i} { 205 $ns at 0.0 "$ftp($i) send 10000" 206 $ns at [expr 0.1 + $simulationTime * $i / ($N + 0.0001)] "$ftp($i) start" 207 $ns at [expr $simulationTime] "$ftp($i) stop" 208 } 209 210 set flowmon [$ns makeflowmon Fid] 211 set MainLink [$ns link $nqueue $nclient] 212 213 $ns attach-fmon $MainLink $flowmon 214 215 set fcl [$flowmon classifier] 216 217 $ns at $flowClassifyTime "classifyFlows" 218 219 proc classifyFlows {} { 220 global N fcl flowstats 221 puts "NOW CLASSIFYING FLOWS" 222 for {set i 0} {$i < $N} {incr i} { 223 set flowstats($i) [$fcl lookup autp 0 0 $i] 224 } 225 } 226 227 228 set startPacketCount 0 229 set stopPacketCount 0 230 231 proc startMeasurement {} { 232 global qfile startPacketCount 233 $qfile instvar pdepartures_ 234 set startPacketCount $pdepartures_ 235 } 236 237 proc stopMeasurement {} { 238 global qfile startPacketCount stopPacketCount packetSize startMeasurementTime stopMeasurementTime simulationTime 239 $qfile instvar pdepartures_ 240 set stopPacketCount $pdepartures_ 241 puts "Throughput = [expr ($stopPacketCount-$startPacketCount)/(1024.0*1024*($stopMeasurementTime-$startMeasurementTime))*$packetSize*8] Mbps" 242 } 243 244 $ns at $startMeasurementTime "startMeasurement" 245 $ns at $stopMeasurementTime "stopMeasurement" 246 247 $ns at $simulationTime "finish" 248 249 $ns run