dctcp example-ns2

 

  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

 

posted @ 2014-12-25 16:57  Ryan in C++  阅读(1167)  评论(0编辑  收藏  举报