HNU计网实验:实验三 TCP Tahoe与Reno 运行机制对比分析

胡言乱语

“它能放吗?放不了,没这个能力知道吗?这样下去要拖五一了,清明拖完拖五一,再拖端午,接下来没假拖了。务实一点,你说它补到暑假能行吗?不行啊,还有小学期呢”
刚想吐槽输麻了的时候
诶?中南也不放了
我们通知还比他们早一点,这就直接赢麻了啊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]

#打开一个trace file, 用来记录封包传送的过程
set nd [open out-$par1.tr w]
$ns trace-all $nd

#打开一个文件用来记录cwnd 变化情况
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
}

#定义一个记录的程序
#每格0.01s就去记录当时的cwnd
proc record {} {
	global ns tcp f0

	set now [$ns now]
	puts $f0 "$now [$tcp set cwnd_]"
	$ns at [expr $now+0.01] "record"
}

#产生传送结点,路由器r1,r2和接收结点
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

#设置队列长度为18个封包大小
set queue 18
$ns queue-limit $r0 $r1 $queue

#根据用户的设置,指定TCP版本
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

#建立FTP应用程序
set ftp [new Application/FTP]
$ftp attach-agent $tcp

#在0.0s时,开始传送
$ns at 0.0 "$ftp start"

#在10.0s时,结束传送
$ns at 10.0 "$ftp stop"

#在0.0s时调用record来记录TCP的cwnd变化情况
$ns at 0.0 "record"

#在第10.0s时调用finish来结束模拟
$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代码实现啊???

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值