胡言乱语
“它能放吗?放不了,没这个能力知道吗?这样下去要拖五一了,清明拖完拖五一,再拖端午,接下来没假拖了。务实一点,你说它补到暑假能行吗?不行啊,还有小学期呢” 刚想吐槽输麻了的时候 诶?中南也不放了 我们通知还比他们早一点,这就直接赢麻了啊hhh
说些什么
之后的实验等结束了再补充吧,毕竟是核心课,不同班的验收进度也不同,所以现在写出来肯定有些不太合适 但是为什么要先写实验三嘞,大概就是早点写出来可以让更多的小伙伴少踩点雷吧 这里特别鸣谢一下我的大长腿室友
实验
前言
ubuntu的话还是用16.04那个版本比较好一点
配置
Oh my god!我亲爱的小伙伴们,难度你们还在按照前辈们的博客,痛苦地安装着各种依赖包,然后去下载安装包,再配置环境变量,然后为各种报错秃头,逐渐失去你的仪态你良好的品质你的头发嘛? 拜托,这样子超机车的好嘛? 事实证明,朴素的程序员往往习惯用朴素的指令来完成项目要求
sudo apt install ns2 gnuplot
如果这句话一下子解决了你所有的烦恼,答应我,请务必把它放到仅此于“奇变偶不变,符号看象限”的高度,好嘛? 于是我们成功完成了相关包的安装和配置
正式实验
老师给出的那个.tcl文件其实问题挺大的,至少它跑不通,比如什么puts后面没加空格,什么r0达成了n0,所以按照惯例贴出来一份正确的
if {$argc != 1} {
puts "Usage: ns lab11.tcl TCPversion"
puts "Example:ns lab11.tcl Tahoe or ns lab11.tcl Reno"
exit
}
set par1 [lindex $argv 0]
set ns [new Simulator]
set nd [open out-$par1.tr w]
$ns trace-all $nd
set f0 [open cwnd-$par1.tr w]
proc finish {} {
global ns nd f0 tcp
puts [format "average throughput:%1.f Kbps"\
[expr [$tcp set ack_]* ([$tcp set packetSize_]) *8/1000.0/10]]
$ns flush-trace
close $nd
close $f0
exit 0
}
proc record {} {
global ns tcp f0
set now [$ns now]
puts $f0 "$now [$tcp set cwnd_]"
$ns at [expr $now+0.01] "record"
}
set n0 [$ns node]
set r0 [$ns node]
set r1 [$ns node]
set n1 [$ns node]
$ns duplex-link $n0 $r0 10Mb 1ms DropTail
$ns duplex-link $r0 $r1 1Mb 4ms DropTail
$ns duplex-link $r1 $n1 10Mb 1ms DropTail
set queue 18
$ns queue-limit $r0 $r1 $queue
if {$par1 == "Tahoe"} {
set tcp [new Agent/TCP]
} else {
set tcp [new Agent/TCP/Reno]
}
$ns attach-agent $n0 $tcp
set tcpsink [new Agent/TCPSink]
$ns attach-agent $n1 $tcpsink
$ns connect $tcp $tcpsink
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ns at 0.0 "$ftp start"
$ns at 10.0 "$ftp stop"
$ns at 0.0 "record"
$ns at 10.0 "finish"
$ns run
然后把这个复制到你的文件里,命名成lab3.tcl就行 执行命令
ns lab3.tcl Tahoe
会生成两个文件,其中cwnd-Tahoe.tr是这次实验需要用到的 注意!这里需要大写T!如果阅读它那个.tcl文件,就会看到如果输入的不是Tahoe的话,就生成的全是Reno的.tr文件。不要问我为什么知道,问就是爱过,被伤害过
然后使用gnuplot
gnuplot
在这个画图软件里依次输入指令
set title “Tahoe”
设置图像的标题
set xlabel “time”
设置横坐标为时间
set ylabel “cwnd”
设置纵坐标为拥塞窗口大小
set terminal gif
设置输出为gif格式
set output “cwnd-Tahoe.gif”
设置输出的文件名
plot “cwnd-Tahoe.tr” with linespoints
画图,引号内为上一步仿真结果的文件名 这样就可以得到图像了 同理换成Reno就可以执行得到Reno的图像了 分析什么的就不赘述了,课本讲得挺清晰的 不行,我必须要吐槽一句它中文版翻译的真的好有问题啊,明明应该是先修改阈值再修改拥塞窗口,结果他翻译顺序反了就搞得我当时困扰了好久好伐
问题
A.这个实验中只对cwnd的测量,没有对ACK帧的测量,能够能体现出“快重传”(不管在Tahoe还是在Reno中都有快重传这一特性的)这一特性吗?
Tahoe没有体现出快重传这一特性,从图片可以看出来不管是发生超时指示的丢包事件,还是发生3个冗余ACK指示的丢包事件,都是将cwnd减至1个MSS。 Reno体现出来了快重传这一特性,从图片中可以看出来TCP将cwnd设为出现数据包丢失时的值的1/2。因为发送端在收到冗余ACK后采用快速重传,而发生超时是采用慢启动策略,所以能体现。
B.为什么Reno版本在出现封包丢失后选择将ssthresh和cwnd都设为出现数据包丢失时的Windows值的1/2,而不是其它值呢?比如1/3,2/3?
如果在慢启动的第N个传输回合发生了丢包事件,那么我们可以知道最大的不产生丢包的拥塞窗口是在第N-1个传输回合,而由于慢启动是以指数增长,所以第n-1个传输回合的拥塞窗口是当前Windows值的1/2. 在查阅资料的过程中也有其他的发现,即ssthresh=max(FlightSize/2,2MSS),可以看出来ssthresh虽然是出现数据包丢失时的Windows值的1/2,但是也有最小值界限即2MSS。
C.本实验也没有详细对这两个版本的运行机制进行对比,例如分别在1、2、3和4个packet miss的情况下对协议进行分析,更真实的进行模拟,更能体现出Tahoe和Reno版本的平均吞吐率的差别。
这个不是在陈述这个实验的不足之处嘛???为什么需要修改.tcl代码实现啊???
|