计算机网络实验四——TCP Tahoe与Reno运行机制对比分析

  • 一、实验目的
  • 二、实验内容
  • 三、实验原理
    • TCP 基于窗口的拥塞控制策略
    • 1.加法增加乘法减少(AIMD)窗口算法
    • 2. TCP 拥塞控制的四个阶段
  • 四、实验步骤
  • 五、 实验心得与不足

一、实验目的

通过本实验学习TCP 的拥塞控制机制并了解TCP Tahoe 和TCP Reno 协议的运行机制。

二、实验内容

1.观察Tahoe版本的congestion window的变化情况。
2.观察Reno版本的congestion window的变化情况。

三、实验原理

TCP 基于窗口的拥塞控制策略

1.加法增加乘法减少(AIMD)窗口算法

TCP 是Internet 中最流行的端到端传输协议,为主机之间提供可靠按序的传输服务。在现有的TCP/IP 协议体系下,TCP 拥塞控制机制主要基于加法增加乘法减少(AIMD)算法。在该算法中主要用到三个窗口变量:
(1) 拥塞窗口(cwnd):限定源端在拥塞控制中在一定时间内允许传送的最大数据量,是来自源端的流量控制。
(2) 通告窗口(awnd):连接建立及传输过程中,接收端向源端通告的最大可接收速率,是来自接收端的流量控制。
(3) 有效窗口(win):源端数据发送的实际窗口大小,限定为win=min(cwnd,awnd)。
由于计算机计算能力和存储能力的提高,通告窗口一般都比较大,因此当前发送窗口的大小大多数情况下等于拥塞窗口的大小。
AIMD 的具体工作过程为:
(1)源端每收到一个ACK,拥塞窗口按下式增加:
Incr=MSS×(MSS/cwnd) (MSS 为分组大小)
cwnd=cwnd+Incr
也就是,如果每个发出的分组都在最近的RTT(往返时延)时间内获得确认,源端就将cwnd 增加1,即加法增加。
(2)当发生超时,TCP 将超时看作拥塞的标志,并减小发送速率。每发生一次超时,源端重新计算拥塞窗口值:
cwnd=cwnd/2
也就是,一次超时,拥塞窗口值减为当前值的一半,即乘法减少。

2. TCP 拥塞控制的四个阶段

2.1.启动阶段
当连接刚建立或超时时,进入慢启动阶段。当新建TCP 连接时,拥塞窗口(cwnd)被初始化为一个数据包大小。源端按cwnd 大小发送数据,每收到一个ACK 确认,就增加一个数据包发送量,这样慢启动阶段cwnd 随RTT呈指数级增长。
慢启动采用逐渐增大cwnd 的方法,可以防止TCP 在启动一个连接时向网络发送过多的数据包而造成不必要的数据丢失和网络拥塞,并且它还能够避免采用单纯的AIMD 算法造成的吞吐量增加过慢的问题。
为了防止cwnd 的无限制增长引起网络拥塞,引入一个状态变量:慢启动阈值ssthresh
当cwnd<ssthresh 时,使用上述的慢启动算法,cwnd 随RTT 呈指数增长。
当cwnd>ssthresh 时,使用拥塞避免算法,减缓cwnd 的增长速度。

2.2.拥塞避免阶段
当TCP 源端发现超时或收到3 个相同的ACK 确认帧时,即认为网络将发生拥塞,此时进入拥塞避免阶段。
在拥塞避免阶段,慢启动域值ssthresh 将被设置为当前cwnd 的一半,当发生超时时,cwnd 被置为初始值1。此时,如果cwnd < ssthresh,TCP 重新进入慢启动过程;如果cwnd>=ssthresh,则执行拥塞避免算法,即cwnd 在每次收到一个ACK 确认时只增加1/cwnd 个数据包。拥塞避免阶段cwnd 随RTT 呈线性增长。

2.3.快速重传和快速恢复阶段
在拥塞避免阶段,当数据包超时时,cwnd 被置为1,重新进入慢启动阶段,这会导致过大地减小发送窗口尺寸,降低TCP 连接的吞吐量。因此,引入了快速重传和快速恢复机制。
在快速重传阶段,当源端收到3 个或3 个以上重复的ACK 时,就判定数据包丢失,同时将ssthresh 设置为当前cwnd 的一半,并重传丢失的包,进入快速恢复阶段。
在快速恢复阶段,每收到重复的ACK,则cwnd 加1;收到非重复ACK 时,置cwnd=ssthresh,转入拥塞避免阶段;如果发生超时重传,则置ssthresh 为当前cwnd 的一半,cwnd=1,重新进入慢启动阶段。
这种方法避免了数据包超时后就重新进入慢启动阶段,提高了TCP 连接的吞吐量。

四、实验步骤

1.配置实验环境
Linux 平台 (Ubuntu 16.04)+NS2 2.35

1)安装NS2
进入http://www.isi.edu/nsnam/ns/ns-build.html下载需要的安装包;
接着在ubuntu中通过指令进行依赖包安装:

sudo apt-get install build-essential
sudo apt-get install tcl8.5 tcl8.5-dev tk8.5 tk8.5-dev
sudo apt-get install libxmu-dev libxmu-headers

接下来将下载的安装包进行解压:

tar -xvzf  ns-allinone-2.35.tar.gz

要把ns-allinone-2.35/ns-2.35/linkstate/ls.h中的137行:
void eraseAll() { erase(baseMap::begin(), baseMap::end()); }
改为void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); }
(主要因为GCC编译器的版本问题,也有些不需要更改)
然后在文件下执行 sudo ./install

2)设置环境变量
在install结束后会在最后提示需要将几个路径内容添加到系统环境;
Ubuntu中的系统环境在bashrc中;
通过gedit ~/.bashrc打开文件,将提示的路径都按照要求添加进去:

export NS_HOME=/home/bz/Code/ns-allinone-2.35
export PATH=$PATH:$NS_HOME/bin:$NS_HOME/tcl8.5.10/unix:$NS_HOME/tk8.5.10/unix
export LD_LIBRARY_PATH=$NS_HOME/otcl-1.14:$NS_HOME/lib
export TCL_LIBRARY=$NS_HOME/tcl8.5.10/library

注意,路径是在你本机上的位置,不能照抄我的
即:NS_HOME=/home/bz/Code/ns-allinone-2.35 需要修改为你自己的路径

3)验证安装是否成功

ns、nam均成功,环境安装完成,可以进行实验。

2.Tahoe和Reno运行机制测试
仿真实验的网络结构图和源程序:

本实验用到的程序成为“tcl脚本程序”。运行脚本程序,首先需要安装解释器。只要在第一步中,安装了ns2 allinone的压缩包的话,就已经安装了该tcl脚本语言的解释shell了(一般解释器被称作壳shell)。

2.1.程序纠错
实验指导书中的lab11.tcl代码在ns2.35中无法运行,含有语法错误;

大多是空格问题,因此这里不再进行截图;
最终代码:

if { $argc!=1 } {puts"Usage:ns lab11.tcl tcpversion"exit
}set par1 [lindex $argv 0]
set ns [new Simulator]#打开一个trace文件,用来记录数据报传送的过程
set nd [open $par1.tr w]
$ns trace-all $nd#打开一个文件用来记录cwnd变化情况
set f0 [open cwnd-$par1.tr w] #定义一个结束的程序
proc finish {} {global ns nd f0 tcpputs [format "average throughput:%.1f Kbps" \ [expr [$tcp set ack_]*([$tcp set packetSize_])*8/1000.0/10]]$ns flush-traceclose $ndclose $f0exit 0
}#定义一个记录的程序
proc record {} { global ns tcp f0set 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 20Mb 1ms DropTail
$ns duplex-link $r0 $r1 1Mb 4ms DropTail
$ns duplex-link $r1 $n1 20Mb 1ms DropTail#设置队列长度为18个封包大小
set queue 18
$ns queue-limit $r0 $r1 $queue#根据用户的设置,指定TCP版本,并建立相应的Agentif { $par1 == "Tahoe" } {set tcp [new Agent/TCP]set tcpsink [new Agent/TCPSink]
} elseif { $par1 == "Reno" } {set tcp [new Agent/TCP/Reno]set tcpsink [new Agent/TCPSink]
}$ns attach-agent $n0 $tcp
$ns attach-agent $n1 $tcpsink

2.2.观察Tahoe版本的congestion window的变化情况
【核心思想】
Tahoe算法是TCP的早期版本。让cwnd以指数增长方式迅速逼进可用信道容量,然后慢慢接近均衡。Tahoe包括3个基本的拥塞控制算法:“慢启动”、“拥塞避免”和“快速重传”。
(1) 慢启动:避免了连接建立时突发数据流对网络的冲击。初始设置cwnd为1,并按指数型方式增长,直至cwnd超过ssthresh。当cwnd>=ssthresh时,Tahoe进入拥塞避免阶段。
(2)拥塞避免:限制传输过程中无限制的速率增长,避免由此可能导致的拥塞。cwnd以线性方式增长。如果发生超时或者连续收到3个重复ACK,Tahoe认为发生了拥塞。对于超时,置ssthresh为当前拥塞窗口的一半,cwnd=1,转入慢启动。如果收到3个连续ACK,则Tahoe进入快速重传阶段。
(3)快速重传:根据3个重复的应答报文来判断丢包,减少了超时重传的发生,加快了源端对拥塞的响应,使得拥塞能快速消除。立即重传丢失的分组,同时置ssthresh为当前拥塞窗口的一半,cwnd=1,转入慢启动。
Tahoe算法存在着不足之处:在收到3个重复ACK或在超时的情况下,Tahoe置cwnd为1,然后进入慢启动阶段。这一方面会引起网络的激烈振荡,另一方面大大降低了网络的利用率。
【操作过程】
定位到包含tcl脚本程序的文件夹下。
执行指令:$ns 文件名.tcl Tahoe,观察结果:

此时,会在文件夹中生成两个文件,分别是cwnd-Tahoe.tr和Tahoe.tr,这两个文件反映的是NS-2模拟平台上的网络流量和拥塞窗口信息,其中,cwnd-Tahoe反映的是本次实验需要用到的拥塞窗口变化,需要之后用到并画图。

【图像分析】

初始阈值=20,cwnd从1开始慢启动,cwnd大小呈指数增长。 cwnd=20后,进入拥塞避免阶段,cwnd值呈线性增长。
当收到3个冗余ACK或超时,阈值减半=10;cwnd减为1,重新进入慢启动阶段。而后呈现指数增长,直到cwnd=阈值,进入线性增长阶段,直到再次出现收到3个冗余ACK事件。 不断重复循环以上过程。

【结果分析】
TCP的Congestion Window 值会呈现周期性重复变化。TCP Tahoe 开始执行时,先由slow-start(SS)开始,cwnd超过ssthresh时进入拥塞避免(CA)阶段。由于传送到网络上的丢包不断增加,当超出允许能传送到网络上的个数时,路由器开始使用DropTail算法将数据报丢掉。当数据报遗失时,TCP Tahoe会将ssthresh设为发现数据报遗失时的一半,接着将Window的值设为1。Tahoe重新进入slow-start阶段。

2.3.观察Reno版本的congestion window的变化情况
【核心思想】
针对Tahoe算法的不足之处,1990年Jacobson在Tahoe的基础上提出了改进算法Reno。改进主要有两个方面:一是对于收到连续3个重复ACK,算法不经过慢启动,而直接进入拥塞避免阶段;二是增加了快速重传/快速恢复机制。具体实现过程为:
(1)收到三个重复的ACK,进入快速重传/快速恢复,此时ssthresh设置为当前拥塞窗口的一半。
(2)重传丢失的数据包,并置cwnd=cwnd+ndup(ndup为收到的重复ACK数)。
(3)发送新的数据包。
(4)当收到非重复的ACK时,cwnd=ssthresh。
(5)进入拥塞避免阶段。
从上面的过程可以看出,Reno在收到3个重复ACK后,就转入快速重传/快速恢复阶段;而遇到超时时,Reno和Tahoe一样进入慢启动阶段。
【操作过程】
与上述Tahoe过程类似,不再赘述。
【图像分析】

初始阈值=20,cwnd从1开始进入慢启动阶段,而后cwnd大小呈指数增长。当检测到数据报遗失时,ssthresh和cwnd的值会被设置为先前cwnd值的一半。因此重传遗失数据报后,TCP Reno 会由 Congestion Avoidanc(CA)开始。由于结束Fast recovery 后,TCP Reno中cwnd的值由先前cwnd值的1/2开始增加,所以得到的平均吞吐量比TCP Tahoe 大一些。此外,当TCP的传送端观察到端点到端点的路径没有拥塞的情况下,会持续地以累加的方式增加传送速率。但是,当检测到路径拥塞情况发生时,则以倍数方式减少传送速率。

2.4.实验分析
通过图1可以看出,在TCP的Tahoe版本中,Congestion Windows值会呈现周期性的重复变化。刚开始采用Slow-Start开始,cwnd呈指数方式增长,当cwnd超过Ssthresh时就进入了Congestion Avoidance阶段。由于网络上的数据包不断增加,超过路由器的转发能力时,排队缓冲队列出现了溢出,路由器开始使用Drop-tail将数据包丢掉。当数据包丢失后,Tahoe版本TCP将ssthresh设为出现数据包丢失时的Windows值的1/2,并将cwnd值重设为1,并重新开始执行Slow-Start算法。
通过图2可以看出,在TCP的Reno版本中,开始阶段与Tahoe的表现一样。当网络上的数据包不断增加,超过路由器的转发能力时,排队缓冲队列出现了溢出,路由器开始使用Drop-tail将数据包后,Reno版本TCP将ssthresh和cwnd都设为出现数据包丢失时的Windows值的1/2,并开始执行Congestion Avoidance算法。
从以上分析可以看出Tahoe版本的TCP在每次出现封包丢失的时候都重新开始执行Slow-Start算法,这样使得网络的吞吐率并不高。但经过改进后的Reno版本出现封包丢失的时候,并不是把当前cwnd设为1,而是设为出现封包丢失时的1/2,所以Reno版本的TCP的平均吞吐率较Tahoe更高,这一点可以从实验结果得证。

3.思考题
A.这个实验中只对cwnd的测量,没有对ACK帧的测量,能够能体现出“快重传”(不管在Tahoe还是在Reno中都有快重传这一特性的)这一特性吗?
答:
在Tahoe中,不能体现快速重传这一特性,因为发送端在收到重复的ACK和发生超时都是采用慢启动策略,现象是一样的,所以不能体现;
在Reno中,能体现快速重传这一特性,可以看到图中的情况都是收到DupACK后然后快速重传的例子,因为发送端在收到重复的ACK后采用快速重传,而发生超时是采用慢启动策略,所以能体现。

B.为什么Reno版本在出现封包丢失后选择将ssthresh和cwnd都设为出现数据包丢失时的Windows值的1/2,而不是其它值呢?比如1/3,2/3?
答:
Congestion Avoidance and Control这篇论文中作者Jacobson提到了为什么是设置0.5为拥塞避免时乘性减的原因;
其中一个原因是在slow start的过程中Wi发生丢包,那么说明我们当前已知的最大的不会导致丢包的cwnd值为Wi-1,也就是Wi的一半!当然还有其他的一些原因,这里就不详细叙述了。

C.本实验也没有详细对这两个版本的运行机制进行对比,例如分别在1、2、3 和4 个packet miss 的情况下对协议进行分析,更真实的进行模拟,更能体现出Tahoe 和Reno版本的平均吞吐率的差别。

4.实验遇到的问题
遇到的最多的问题就是环境的配置!
环境配置可能才是最难的地方吧~

五、 实验心得与不足

通过本次实验“TCP Tahoe与Reno 运行机制对比分析”,我学习TCP的拥塞控制机制并了解TCP Tahoe和TCP Reno协议的运行机制。
Tahoe算法是TCP的早期版本。它的核心思想是:让cwnd以指数增长方式迅速逼进可用信道容量,然后慢慢接近均衡。Tahoe包括3个基本的拥塞控制算法:“慢启动”、“拥塞避免”和“快速重传”。 Tahoe算法存在着不足之处:在收到3个重复ACK或在超时的情况下,Tahoe置cwnd为1,然后进入慢启动阶段。这一方面会引起网络的激烈振荡,另一方面降低了网络的利用率。针对Tahoe算法的不足之处,出现了改进算法Reno。改进主要有两个方面:一是对于收到连续3个重复ACK,算法不经过慢启动,而直接进入拥塞避免阶段;二是增加了快速重传/快速恢复机制。Reno在收到3个重复ACK后,就转入快速重传/快速恢复阶段;而遇到超时时,Reno和Tahoe一样进入慢启动阶段。
通过完成本次实验,我对TCP协议的理解又进一步加深了,并通过比对Tahoe和Reno之间的联系与不同、了解二者的优缺点,掌握了更多新知识。

计网实验四—TCP Tahoe与Reno运行机制对比分析相关推荐

  1. 计算机网络实验三:TCP Tahoe与Reno运行机制对比分析

    一.实验目的 学习TCP的拥塞控制机制并了解TCP Tahoe和TCP Reno协议的运行机制. 二.实验背景知识--TCP基于窗口的拥塞控制策略 1.1  加法增加乘法减少(AIMD)窗口算法 TC ...

  2. java 柱状图jar_GitHub - mafulong/NetworkExper: 计网实验,抓包,java,jigloo界面开发,柱状图,文件自定义保存...

    jiWangShiYanByJava 计网实验,抓包,java,jigloo界面开发,柱状图,文件自定义保存 基于Winpcap的网络流量统计分析系统的设计与实现 一.实验内容描述 本实验是用java ...

  3. 2020计网实验报告

    title: 计网实验报告 date: 2020-12-13 16:31:07 tags: *实验名称* 实验1 WireShark的使用 *实验时间* 2020年10月7日 10:00-11:40时 ...

  4. 计网第四章 网络层(咕咕咕)

    计网第四章 网络层(更新ing 咕咕咕) 网络层提供的两种服务 面向连接的通讯:虚电路 虚电路知识一种逻辑上的连接,分组沿着这个逻辑转发而不是真的建立了一条物理线路. 面向无连接的通讯:数据报服务 网 ...

  5. 云南大学软件学院java实验九_云南大学 软件学院 计网实验

    <云南大学 软件学院 计网实验>由会员分享,可在线阅读,更多相关<云南大学 软件学院 计网实验(6页珍藏版)>请在人人文库网上搜索. 1.云南大学软件学院实 验 报 告课程: ...

  6. 【计网实验——prj6】生成树机制实验

    [计网实验--prj6]生成树机制实验 实验要求 1. 基于已有代码,实现生成树运行机制,对于给定拓扑(four_node_ring.py),计算输出相应状态下的最小生成树拓扑; 2. 自己构造一个不 ...

  7. BUAA 计网实验笔记 3

    BUAA 计网实验笔记 3 -第三周网络层实验 这周实验还是挺繁琐的,尤其是VLAN间通信,重点理解一下.要不然你可能也像我一样,实验4小时 实验(1) ARP分析 ARP协议是用来建立mac地址和i ...

  8. 南航计算机硬件实验,南航计硬实验四数据块移动实验报告.doc

    南航计硬实验四数据块移动实验报告 电工电子实验中心 课程名称: 计算机硬件技术基础实验 实验名称: 实验四 数据块移动 姓名: 学号: 评定成绩: 审阅教师: 实验时间: 2020.5.7 南京航空航 ...

  9. BUAA 计网实验笔记 1

    BUAA 计网实验笔记 1 ​ - 第一周网络实验入门 尽管笔者事先预习了相关实验内容,但是,还是做了2小时的实验. (流下憨憨的眼泪,特此记录一下,后来者可留心注意下) 问题1:设备认知 在线实验平 ...

最新文章

  1. 从CCNA到CCIE的网工认证道路规划
  2. jquery event 封装的源源分析
  3. spring用的很开心的标签(随时增加)
  4. 数字滚动_告别单调!让PPT数字滚动起来。
  5. Python使用pyechart绘制3d散点图
  6. 聊聊 API Gateway 和 Netflix Zuul
  7. 1.1 echo rem cd dir命令
  8. calloc与malloc的区别
  9. 基于SSM的猫头鹰家教兼职平台
  10. C语言实现2048游戏
  11. 网络安全行业是蓝景吗?
  12. JavaScript格式化数字
  13. 多项式的余数定理及其应用
  14. 动态照片怎么制作?这三款软件推荐给你
  15. 为什么运放一般要反比例放大?
  16. python工资一般多少p-我会P图,工资5000,兼职1.5w……
  17. 如何使用stc12c5a60s2控制蜂鸣器
  18. access导出mysql数据库_如何从ACCESS数据库导出数据
  19. UVA Magical GCD
  20. 哈工大计算机网络第七章——无线网络与移动网络复习

热门文章

  1. “大”领时代·“云”起未来 ——芝诺数据迎接四川外国语大学国商师生参观学习...
  2. 2019年中国外贸四大猜想
  3. 想要开咖啡店要怎么开始
  4. Oppo面经:浏览器输入URL都发生了什么?
  5. 【HDU 2553】 N皇后问题
  6. Win10设置共享访问时提示需要密码的解决
  7. SQL数据库安装的时错误号:0x80072F8F
  8. linux查主机物理地址查询,在操作系统中查询物理主机硬件信息-ipmitool、dmidecode...
  9. 查看weblogic Java版本_获取WebLogic版本号有以下几种方式
  10. Java做服务器开发语言