TCP不同版本的比较_第1页
TCP不同版本的比较_第2页
TCP不同版本的比较_第3页
TCP不同版本的比较_第4页
TCP不同版本的比较_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TCP不同版本的比较实验目的:观测TCP协议的数据传输过程拥塞窗口变化,比较TCPTahoe,TCPReno,TCPNewReno和SACK版本的拥塞控制算法。实验环境:WindowsXP+Cygwin+NS22.29实验说明:当数据从频宽较大的网络送到频宽较小的网络,会发生拥塞现象。同样当很多流量同时到达一个路由器时也会发生拥塞。所以在运输层TCP协议下有拥塞控制机制来防止或减少拥塞。为了研究TCP不同版本拥塞控制的机制,所以选用如下的网络拓扑结构和链路参数配置(FTP代表端施加恒定的流CBR)实验过程:观察TCPTahoe,TCPReno,TCPNewReno和SACK版本的拥塞窗口的变化:打开ns2窗口:1.观察Tahoe版本的congestionwindow和queuelength的变化情况:Tahoe算法是TCP的早期版本。Tahoe包括3个基本的拥塞控制算法:“慢启动”、“拥塞避免”和“快速重传”。Tahoe算法存在着不足之处:在收到3个重复ACK或在超时的情况下,Tahoe置cwnd为1,然后进入慢启动阶段。这一方面会引起网络的激烈振荡,另一方面大大降低了网络的利用率。如上图所示出现错误:“}”和“elseif”之间要有空格,“}”和“else”之间同理,改正后$nslab2.tclTahoe可以看到结果如上图所示:使用gnuplot观察cwnd的变化值:$gnuplot之后打开cwnd-Tahoe.gif图片如图11所示:图11通过图11可以看出,在TCP的Tahoe版本中,cwnd值会呈现周期性的重复变化。刚开始采用慢启动(Slow-Start),避免了连接建立时突发数据流对网络的冲击,cwnd呈指数方式增长,当cwnd超过Ssthresh时就进入了拥塞避免(congestionavoidance)阶段,限制传输过程中无限制的速率增长,避免由此可能导致的拥塞。由于网络上的数据包不断增加,超过路由器的转发能力时,排队缓冲队列出现了溢出,路由器开始使用Drop-tail将数据包丢掉。当数据包丢失后,Tahoe版本TCP将ssthresh设为出现数据包丢失时的Windows值的1/2,并将cwnd值重设为1,并重新开始执行慢启动算法。使用gnuplot观察queuelength的变化值:之后打开queue_length_Tahoe.gif图片如图12所示: 图122.观察Reno版本的congestionwindow和queuelength的变化情况:针对Tahoe算法的不足之处,在Tahoe的基础上提出了改进算法Reno。改进主要有两个方面:一是对于收到连续3个重复ACK,算法不经过慢启动,而直接进入拥塞避免阶段;二是增加了快速重传/快速恢复机制。Reno在收到3个重复ACK后,就转入快速重传/快速恢复阶段;而遇到超时时,Reno和Tahoe一样进入慢启动阶段。使用gnuplot观察cwnd的变化值:之后打开cwnd-Reno.gif图片如图21所示: 图21通过图21可以看出,在TCP的Reno版本中,开始阶段与Tahoe的表现一样。当网络上的数据包不断增加,超过路由器的转发能力时,排队缓冲队列出现了溢出,出现数据包丢,Reno版本TCP将ssthresh和cwnd都设为出现数据包丢失时的Windows值的1/2,重传丢失的数据包,由于重传过程中发生超时(timeout),所以ssthresh设为当前窗口的一半,cwnd=1,并开始慢启动阶段,当cwnd>ssthresh时进入拥塞避免阶段。当网络上的数据包不断增加,超过路由器的转发能力时,排队缓冲队列出现了溢出,出现数据包丢失,Reno版本TCP将ssthresh和cwnd都设为出现数据包丢失时的Windows值的1/2,重传丢失的数据包,不发生超时的情况下,进入拥塞避免阶段。使用gnuplot观察queuelength的变化值:之后打开queue_length_Reno.gif图片如图22所示: 图223.TCP的NewReno版本congestionwindow和queuelength的变化:NewReno是修改自Reno的TCP版本。这个版本中主要修改了TCPReno的快速恢复算法。NewReno在收到PartialACK时,并不会立刻结束快速恢复,相反,NewReno的传送端会持续地重送PartialACK之后的封包,直到将所有遗失的封包重送后才会结束快速恢复,这使得NewReno的传送端在网络有大量封包遗失时不需等待Timeout就能更正此错误,减少大量封包遗失对传输效果所造成的影响。使用gnuplot观察cwnd的变化值:之后打开cwnd-Newreno.gif图片如图31所示: 图31通过图31可以看出,在TCP的NewReno版本中,当网络上的数据包不断增加,超过路由器的转发能力时,排队缓冲队列出现了溢出,数据包丢失后,NewReno版本TCP将ssthresh和cwnd都设为出现数据包丢失时的Windows值的1/2,重传丢失的数据包,不发生超时的情况下,进入拥塞避免阶段。使用gnuplot观察queuelength的变化值:之后打开queue_length_Newreno.gif图片如图32所示: 图324.TCP的(SACK)版本congestionwindow和queuelength的变化:SACK版本是选择重传的版本,是对NewReno版本的一种改进,通过SACK选项,传送端可以很明确地知道哪些封包已经被接收到了,并且直接针对遗失部分重传,而不必重传重复确认的ACK后的所有窗口内的数据包,所以效率明显比NewReno版本高。使用gnuplot观察cwnd的变化值:之后打开cwnd-Sack.gif图片如图41所示: 图41通过图41可以看出,在TCP的Sack版本中,当网络上的数据包不断增加,超过路由器的转发能力时,出现数据包丢失后,将ssthresh和cwnd都设为出现数据包丢失时的Windows值的1/2,重传丢失的数据包,不发生超时的情况下,进入拥塞避免阶段。使用gnuplot观察queuelength的变化值:之后打开queue_length_Sack.gif图片如图42所示: 图42实验图分析: 从图11和21的比较可以看出Tahoe版本的TCP在每次出现数据包丢失的时候都重新开始执行Slow-Start算法,这样使得网络的吞吐率并不高。但经过改进后的Reno版本出现数据包丢失的时候,并不是把当前cwnd设为1,而是设为出现数据包丢失时窗口cwnd的1/2,所以Reno版本的TCP的平均吞吐率较Tahoe更高。 由图21和31比较可以看出Newreno版本的效率比Reno版本高。当网络有大量的数据丢失时,Reno版本会出现数据超时,则进入慢启动阶段,NewReno的传送端在网络有大量封包遗失时不需等待Timeout就可以重传所有丢失的数据包,从而避免了不必要的timeout。 由图31和41的比较可以看出Sack的优势,在快速重传阶段图31中Newreno版本所用的时间明显比图41中Sack版本所用的时间多,从而可以看出Sack版本中,发送端只快速传送未收到确认ACK的数据包,从而提高了效率。 由图12,22,32,42比较可知,Tahoe版本的queuelength的波动较大,可知Tahoe版本在出现丢包之后就进入慢启动阶段,使网路的震荡较大,传输效率低。快速重传阶段图32中Newreno版本queuelength明显比图42中Sack版本queuelength的变化幅度大,从而证明了TCP的SACK版本采用选择重传的优越性。实验总结: 本次实验是在借鉴了已有资料的基础上,自己动手实现的,根据自己对ns2相关的知识的学习,对于已有文件进行了改动,使之符合自己实验的思路。通过实验数据图比较了TCP的四种版本的拥塞控制策略,从而对TCP各版本的拥塞控制策略有了更深的了解。但是通过cwnd和queuelength图只能定性的看出网络的拥塞状况,而不能看出丢包,延时等的具体情况。将lab2.tcl进行部分改动,改动后的内容见lab.tcl,可以查看动态的网络数据包传输情况。通过命令$nslab.tclTCPversion例如:$nslab.tclSack附件:Lab2.tcl文件:if{$argc!=1}{ puts"Usage:nslab2.tclTCPversion" puts"Example:nslab2.tclTahoeornslab2.tclRenoornslab2.tclNewrenoornslab2.tclSack" exit}setpar1[lindex$argv0]#产生一个仿真对象setns[newSimulator]#打开一个trace文件,用来记录封包传送的过程setnd[openout-$par1.trw]$nstrace-all$nd#打开一个文件用来记录cwnd的变化情况setf0[opencwnd-$par1.trw]#﹚定义一个结束的程序procfinish{}{globalnsndf0tcppar1#显示最后的平均吞吐量puts[format"averagethroughput:%.1fKbps"\ [expr[$tcpsetack_]*([$tcpsetpacketSize_])*8/1000.0/10]]$nsflush-trace #关闭文件close$ndclose$f0 #使用awk分析记录文件,以观察队列的变化 execawk{ BEGIN{ highest_packet_id=-1; packet_count=0; q_eln=0; } { action=$1; time=$2; src_node=$3; dst_node=$4;type=$5;flow_id=$8;seq_no=$11;packet_id=$12; if(src_node=="0"&&dst_node=="1"){ if(packet_id>highest_packet_id){ highest_packet_id=packet_id; } if(action=="+"){ q_len++; printtime,q_len; } if(action=="-"||action=="d"){ q_eln=q_len--; printtime,q_len; } } } }out-$par1.tr>queue_length-$par1.trexit0}#定义一个记录的程序#每隔0.01s就去记录当时的cwndprocrecord{}{ globalnstcpf0 setnow[$nsnow] puts$f0"$now[$tcpsetcwnd_]" $nsat[expr$now+0.01]"record"}#产生传送结点,路由器r1,r2和接收结点setr0[$nsnode]setr1[$nsnode]setn0[$nsnode]setn1[$nsnode]#建立链路$nsduplex-link$n0$r010Mb1msDropTail$nsduplex-link$r0$r11Mb4msDropTail$nsduplex-link$r1$n110Mb1msDropTail#设置队列长度为15个封包大小setbuffer_size15$nsqueue-limit$r0$r1$buffer_size#根据用户的设置,指定TCP版本if{$par1=="Tahoe"}{ settcp[newAgent/TCP] settcpsink[newAgent/TCPSink] $tcpsetdebug_1}elseif{$par1=="Reno"}{ settcp[newAgent/TCP/Reno] settcpsink[newAgent/TCPSink] $tcpsetdebug_1#这里的setdebug_设为1的话就可以产生出上文所提的Debug数据了}elseif{$par1=="Newreno"}{ settcp[newAgent/TCP/Newreno] settcpsink[newAgent/TCPSink] $tcpsetdebug_1}else{ settcp[newAgent/TCP/Sack1] settcpsink[newAgent/TCPSink/Sack1] $tcpsetdebug_1}$nsattach-agent$n0$tcp #将awnd的值设为24,这是advertisedwindow的上限#advertisedwindow是接收端的缓冲区可以容纳的封包个数#因此当congestionwindow的值超过advertisedwindow时#TCP的传送端会执行流量控制,以避免传送得太快而导致接收端的缓冲区溢满$tcpsetwindow_24 $nsattach-agent$n1$tcpsink$nsconnect$tcp$tcpsink#建立FTP应用程序setftp[newApplication/FTP]$ftpattach-agent$tcp#在0.0s时,开始传送$nsat0.0"$ftpstart"#在10.0s时,结束传送$nsat10.0"$ftpstop"#在0.0s时调用record来记录TCP的cwnd变化情况$nsat0.0"record"#在第10.0s时调用finish来结束模拟$nsat10.0"finish"#计算在传输路径上大约可以容纳多少个封包#计算方式:在bottlenecklink上每秒可以传送的封包数*RTT+队列缓冲区大小puts[format"onpath:%.2fpackets"\[expr(1000000/(8*([$tcpsetpacketSize_]+40))*((1+4+1)*2*0.001))+$buffer_size]]#执行模拟$nsrunLab.tcl文件:if{$argc!=1}{ puts"Usage:nslab2.tclTCPversion" puts"Example:nslab2.tclTahoeornslab2.tclRenoornslab2.tclNewrenoornslab2.tclSack" exit}setpar1[lindex$argv0]#产生一个仿真对象setns[newSimulator]#Openthenamtracefilesetnf[opentest.namw]$nsnamtrace-all$nf#打开一个trace文件,用来记录封包传送的过程setnd[openout-$par1.trw]$nstrace-all$nd#打开一个文件用来记录cwnd的变化情况setf0[opencwnd-$par1.trw]#﹚定义一个结束的程序procfinish{}{globalnsndf0tcppar1nf#显示最后的平均吞吐量puts[format"averagethroughput:%.1fKbps"\ [expr[$tcpsetack_]*([$tcpsetpacketSize_])*8/1000.0/10]]$nsflush-trace #关闭文件close$ndclose$f0 #使用awk分析记录文件,以观察队列的变化 execawk{ BEGIN{ highest_packet_id=-1; packet_count=0; q_eln=0; } { action=$1; time=$2; src_node=$3; dst_node=$4;type=$5;flow_id=$8;seq_no=$11;packet_id=$12; if(src_node=="0"&&dst_node=="1"){ if(packet_id>highest_packet_id){ highest_packet_id=packet_id; } if(action=="+"){ q_len++; printtime,q_len; } if(action=="-"||action=="d"){ q_eln=q_len--; printtime,q_len; } } } }out-$par1.tr>queue_length-$par1.tr #Closethetracefileclose$nf #Executenamonthetracefileexecnamtest.nam&exit0}#定义一个记录的程序#每隔0.01s就去记录当时的cwndprocrecord{}{ globalnstcpf0 setnow[$nsnow] puts$f0"$now[$tcpsetcwnd_]" $nsat[expr$now+0.01]"record"}#产生传送结点,路由器r1,r2和接收结点setr0[$nsnode]setr1[$nsnode]setn0[$nsnode]setn1[$nsnode]#建立链路$nsduplex-link$n0$r010Mb1msDropTail$nsduplex-link$r0$r11Mb4msDropTail$nsduplex-link$r1$n110Mb1msDropTail$nsduplex-link-op$n0$r0orientright-up$nsduplex-link-op$r0$r1orientright$nsduplex-link-op$r1$n1orientright-down#设置队列长度为15个封包大小setbuffer_size15$nsqueue-limit$r0$r1$buffer_size#根据用户的设置,指定TCP版本if{$par1=="Tahoe"}{ settcp[newAgent/TCP] settcpsink[newAgent/TCPSink] $tcpsetdebug_1}elseif{$par1=="Reno"}{ settcp[newAgent/TCP/Reno] set

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论