TCP不同版本的比較_第1頁
TCP不同版本的比較_第2頁
TCP不同版本的比較_第3頁
TCP不同版本的比較_第4頁
TCP不同版本的比較_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

TCP不同版本的比較實(shí)驗(yàn)?zāi)康模河^測TCP協(xié)議的數(shù)據(jù)傳輸過程擁塞窗口變化,比較TCPTahoe,TCPReno,TCPNewReno和SACK版本的擁塞控制算法。實(shí)驗(yàn)環(huán)境:WindowsXP+Cygwin+NS22.29實(shí)驗(yàn)說明:當(dāng)數(shù)據(jù)從頻寬較大的網(wǎng)絡(luò)送到頻寬較小的網(wǎng)絡(luò),會(huì)發(fā)生擁塞現(xiàn)象。同樣當(dāng)很多流量同時(shí)到達(dá)一個(gè)路由器時(shí)也會(huì)發(fā)生擁塞。所以在運(yùn)輸層TCP協(xié)議下有擁塞控制機(jī)制來防止或減少擁塞。為了研究TCP不同版本擁塞控制的機(jī)制,所以選用如下的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和鏈路參數(shù)配置(FTP代表端施加恒定的流CBR)實(shí)驗(yàn)過程:觀察TCPTahoe,TCPReno,TCPNewReno和SACK版本的擁塞窗口的變化:打開ns2窗口:1.觀察Tahoe版本的congestionwindow和queuelength的變化情況:Tahoe算法是TCP的早期版本。Tahoe包括3個(gè)基本的擁塞控制算法:“慢啟動(dòng)”、“擁塞避免”和“快速重傳”。Tahoe算法存在著不足之處:在收到3個(gè)重復(fù)ACK或在超時(shí)的情況下,Tahoe置cwnd為1,然后進(jìn)入慢啟動(dòng)階段。這一方面會(huì)引起網(wǎng)絡(luò)的激烈振蕩,另一方面大大降低了網(wǎng)絡(luò)的利用率。如上圖所示出現(xiàn)錯(cuò)誤:“}”和“elseif”之間要有空格,“}”和“else”之間同理,改正后$nslab2.tclTahoe可以看到結(jié)果如上圖所示:使用gnuplot觀察cwnd的變化值:$gnuplot之后打開cwnd-Tahoe.gif圖片如圖11所示:圖11通過圖11可以看出,在TCP的Tahoe版本中,cwnd值會(huì)呈現(xiàn)周期性的重復(fù)變化。剛開始采用慢啟動(dòng)(Slow-Start),避免了連接建立時(shí)突發(fā)數(shù)據(jù)流對網(wǎng)絡(luò)的沖擊,cwnd呈指數(shù)方式增長,當(dāng)cwnd超過Ssthresh時(shí)就進(jìn)入了擁塞避免(congestionavoidance)階段,限制傳輸過程中無限制的速率增長,避免由此可能導(dǎo)致的擁塞。由于網(wǎng)絡(luò)上的數(shù)據(jù)包不斷增加,超過路由器的轉(zhuǎn)發(fā)能力時(shí),排隊(duì)緩沖隊(duì)列出現(xiàn)了溢出,路由器開始使用Drop-tail將數(shù)據(jù)包丟掉。當(dāng)數(shù)據(jù)包丟失后,Tahoe版本TCP將ssthresh設(shè)為出現(xiàn)數(shù)據(jù)包丟失時(shí)的Windows值的1/2,并將cwnd值重設(shè)為1,并重新開始執(zhí)行慢啟動(dòng)算法。使用gnuplot觀察queuelength的變化值:之后打開queue_length_Tahoe.gif圖片如圖12所示: 圖122.觀察Reno版本的congestionwindow和queuelength的變化情況:針對Tahoe算法的不足之處,在Tahoe的基礎(chǔ)上提出了改進(jìn)算法Reno。改進(jìn)主要有兩個(gè)方面:一是對于收到連續(xù)3個(gè)重復(fù)ACK,算法不經(jīng)過慢啟動(dòng),而直接進(jìn)入擁塞避免階段;二是增加了快速重傳/快速恢復(fù)機(jī)制。Reno在收到3個(gè)重復(fù)ACK后,就轉(zhuǎn)入快速重傳/快速恢復(fù)階段;而遇到超時(shí)時(shí),Reno和Tahoe一樣進(jìn)入慢啟動(dòng)階段。使用gnuplot觀察cwnd的變化值:之后打開cwnd-Reno.gif圖片如圖21所示: 圖21通過圖21可以看出,在TCP的Reno版本中,開始階段與Tahoe的表現(xiàn)一樣。當(dāng)網(wǎng)絡(luò)上的數(shù)據(jù)包不斷增加,超過路由器的轉(zhuǎn)發(fā)能力時(shí),排隊(duì)緩沖隊(duì)列出現(xiàn)了溢出,出現(xiàn)數(shù)據(jù)包丟,Reno版本TCP將ssthresh和cwnd都設(shè)為出現(xiàn)數(shù)據(jù)包丟失時(shí)的Windows值的1/2,重傳丟失的數(shù)據(jù)包,由于重傳過程中發(fā)生超時(shí)(timeout),所以ssthresh設(shè)為當(dāng)前窗口的一半,cwnd=1,并開始慢啟動(dòng)階段,當(dāng)cwnd>ssthresh時(shí)進(jìn)入擁塞避免階段。當(dāng)網(wǎng)絡(luò)上的數(shù)據(jù)包不斷增加,超過路由器的轉(zhuǎn)發(fā)能力時(shí),排隊(duì)緩沖隊(duì)列出現(xiàn)了溢出,出現(xiàn)數(shù)據(jù)包丟失,Reno版本TCP將ssthresh和cwnd都設(shè)為出現(xiàn)數(shù)據(jù)包丟失時(shí)的Windows值的1/2,重傳丟失的數(shù)據(jù)包,不發(fā)生超時(shí)的情況下,進(jìn)入擁塞避免階段。使用gnuplot觀察queuelength的變化值:之后打開queue_length_Reno.gif圖片如圖22所示: 圖223.TCP的NewReno版本congestionwindow和queuelength的變化:NewReno是修改自Reno的TCP版本。這個(gè)版本中主要修改了TCPReno的快速恢復(fù)算法。NewReno在收到PartialACK時(shí),并不會(huì)立刻結(jié)束快速恢復(fù),相反,NewReno的傳送端會(huì)持續(xù)地重送PartialACK之后的封包,直到將所有遺失的封包重送后才會(huì)結(jié)束快速恢復(fù),這使得NewReno的傳送端在網(wǎng)絡(luò)有大量封包遺失時(shí)不需等待Timeout就能更正此錯(cuò)誤,減少大量封包遺失對傳輸效果所造成的影響。使用gnuplot觀察cwnd的變化值:之后打開cwnd-Newreno.gif圖片如圖31所示: 圖31通過圖31可以看出,在TCP的NewReno版本中,當(dāng)網(wǎng)絡(luò)上的數(shù)據(jù)包不斷增加,超過路由器的轉(zhuǎn)發(fā)能力時(shí),排隊(duì)緩沖隊(duì)列出現(xiàn)了溢出,數(shù)據(jù)包丟失后,NewReno版本TCP將ssthresh和cwnd都設(shè)為出現(xiàn)數(shù)據(jù)包丟失時(shí)的Windows值的1/2,重傳丟失的數(shù)據(jù)包,不發(fā)生超時(shí)的情況下,進(jìn)入擁塞避免階段。使用gnuplot觀察queuelength的變化值:之后打開queue_length_Newreno.gif圖片如圖32所示: 圖324.TCP的(SACK)版本congestionwindow和queuelength的變化:SACK版本是選擇重傳的版本,是對NewReno版本的一種改進(jìn),通過SACK選項(xiàng),傳送端可以很明確地知道哪些封包已經(jīng)被接收到了,并且直接針對遺失部分重傳,而不必重傳重復(fù)確認(rèn)的ACK后的所有窗口內(nèi)的數(shù)據(jù)包,所以效率明顯比NewReno版本高。使用gnuplot觀察cwnd的變化值:之后打開cwnd-Sack.gif圖片如圖41所示: 圖41通過圖41可以看出,在TCP的Sack版本中,當(dāng)網(wǎng)絡(luò)上的數(shù)據(jù)包不斷增加,超過路由器的轉(zhuǎn)發(fā)能力時(shí),出現(xiàn)數(shù)據(jù)包丟失后,將ssthresh和cwnd都設(shè)為出現(xiàn)數(shù)據(jù)包丟失時(shí)的Windows值的1/2,重傳丟失的數(shù)據(jù)包,不發(fā)生超時(shí)的情況下,進(jìn)入擁塞避免階段。使用gnuplot觀察queuelength的變化值:之后打開queue_length_Sack.gif圖片如圖42所示: 圖42實(shí)驗(yàn)圖分析: 從圖11和21的比較可以看出Tahoe版本的TCP在每次出現(xiàn)數(shù)據(jù)包丟失的時(shí)候都重新開始執(zhí)行Slow-Start算法,這樣使得網(wǎng)絡(luò)的吞吐率并不高。但經(jīng)過改進(jìn)后的Reno版本出現(xiàn)數(shù)據(jù)包丟失的時(shí)候,并不是把當(dāng)前cwnd設(shè)為1,而是設(shè)為出現(xiàn)數(shù)據(jù)包丟失時(shí)窗口cwnd的1/2,所以Reno版本的TCP的平均吞吐率較Tahoe更高。 由圖21和31比較可以看出Newreno版本的效率比Reno版本高。當(dāng)網(wǎng)絡(luò)有大量的數(shù)據(jù)丟失時(shí),Reno版本會(huì)出現(xiàn)數(shù)據(jù)超時(shí),則進(jìn)入慢啟動(dòng)階段,NewReno的傳送端在網(wǎng)絡(luò)有大量封包遺失時(shí)不需等待Timeout就可以重傳所有丟失的數(shù)據(jù)包,從而避免了不必要的timeout。 由圖31和41的比較可以看出Sack的優(yōu)勢,在快速重傳階段圖31中Newreno版本所用的時(shí)間明顯比圖41中Sack版本所用的時(shí)間多,從而可以看出Sack版本中,發(fā)送端只快速傳送未收到確認(rèn)ACK的數(shù)據(jù)包,從而提高了效率。 由圖12,22,32,42比較可知,Tahoe版本的queuelength的波動(dòng)較大,可知Tahoe版本在出現(xiàn)丟包之后就進(jìn)入慢啟動(dòng)階段,使網(wǎng)路的震蕩較大,傳輸效率低??焖僦貍麟A段圖32中Newreno版本queuelength明顯比圖42中Sack版本queuelength的變化幅度大,從而證明了TCP的SACK版本采用選擇重傳的優(yōu)越性。實(shí)驗(yàn)總結(jié): 本次實(shí)驗(yàn)是在借鑒了已有資料的基礎(chǔ)上,自己動(dòng)手實(shí)現(xiàn)的,根據(jù)自己對ns2相關(guān)的知識(shí)的學(xué)習(xí),對于已有文件進(jìn)行了改動(dòng),使之符合自己實(shí)驗(yàn)的思路。通過實(shí)驗(yàn)數(shù)據(jù)圖比較了TCP的四種版本的擁塞控制策略,從而對TCP各版本的擁塞控制策略有了更深的了解。但是通過cwnd和queuelength圖只能定性的看出網(wǎng)絡(luò)的擁塞狀況,而不能看出丟包,延時(shí)等的具體情況。將lab2.tcl進(jìn)行部分改動(dòng),改動(dòng)后的內(nèi)容見lab.tcl,可以查看動(dòng)態(tài)的網(wǎng)絡(luò)數(shù)據(jù)包傳輸情況。通過命令$nslab.tclTCPversion例如:$nslab.tclSack附件:Lab2.tcl文件:if{$argc!=1}{ puts"Usage:nslab2.tclTCPversion" puts"Example:nslab2.tclTahoeornslab2.tclRenoornslab2.tclNewrenoornslab2.tclSack" exit}setpar1[lindex$argv0]#產(chǎn)生一個(gè)仿真對象setns[newSimulator]#打開一個(gè)trace文件,用來記錄封包傳送的過程setnd[openout-$par1.trw]$nstrace-all$nd#打開一個(gè)文件用來記錄cwnd的變化情況setf0[opencwnd-$par1.trw]#﹚定義一個(gè)結(jié)束的程序procfinish{}{globalnsndf0tcppar1#顯示最后的平均吞吐量puts[format"averagethroughput:%.1fKbps"\ [expr[$tcpsetack_]*([$tcpsetpacketSize_])*8/1000.0/10]]$nsflush-trace #關(guān)閉文件close$ndclose$f0 #使用awk分析記錄文件,以觀察隊(duì)列的變化 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}#定義一個(gè)記錄的程序#每隔0.01s就去記錄當(dāng)時(shí)的cwndprocrecord{}{ globalnstcpf0 setnow[$nsnow] puts$f0"$now[$tcpsetcwnd_]" $nsat[expr$now+0.01]"record"}#產(chǎn)生傳送結(jié)點(diǎn),路由器r1,r2和接收結(jié)點(diǎn)setr0[$nsnode]setr1[$nsnode]setn0[$nsnode]setn1[$nsnode]#建立鏈路$nsduplex-link$n0$r010Mb1msDropTail$nsduplex-link$r0$r11Mb4msDropTail$nsduplex-link$r1$n110Mb1msDropTail#設(shè)置隊(duì)列長度為15個(gè)封包大小setbuffer_size15$nsqueue-limit$r0$r1$buffer_size#根據(jù)用戶的設(shè)置,指定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_設(shè)為1的話就可以產(chǎn)生出上文所提的Debug數(shù)據(jù)了}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的值設(shè)為24,這是advertisedwindow的上限#advertisedwindow是接收端的緩沖區(qū)可以容納的封包個(gè)數(shù)#因此當(dāng)congestionwindow的值超過advertisedwindow時(shí)#TCP的傳送端會(huì)執(zhí)行流量控制,以避免傳送得太快而導(dǎo)致接收端的緩沖區(qū)溢滿$tcpsetwindow_24 $nsattach-agent$n1$tcpsink$nsconnect$tcp$tcpsink#建立FTP應(yīng)用程序setftp[newApplication/FTP]$ftpattach-agent$tcp#在0.0s時(shí),開始傳送$nsat0.0"$ftpstart"#在10.0s時(shí),結(jié)束傳送$nsat10.0"$ftpstop"#在0.0s時(shí)調(diào)用record來記錄TCP的cwnd變化情況$nsat0.0"record"#在第10.0s時(shí)調(diào)用finish來結(jié)束模擬$nsat10.0"finish"#計(jì)算在傳輸路徑上大約可以容納多少個(gè)封包#計(jì)算方式:在bottlenecklink上每秒可以傳送的封包數(shù)*RTT+隊(duì)列緩沖區(qū)大小puts[format"onpath:%.2fpackets"\[expr(1000000/(8*([$tcpsetpacketSize_]+40))*((1+4+1)*2*0.001))+$buffer_size]]#執(zhí)行模擬$nsrunLab.tcl文件:if{$argc!=1}{ puts"Usage:nslab2.tclTCPversion" puts"Example:nslab2.tclTahoeornslab2.tclRenoornslab2.tclNewrenoornslab2.tclSack" exit}setpar1[lindex$argv0]#產(chǎn)生一個(gè)仿真對象setns[newSimulator]#Openthenamtracefilesetnf[opentest.namw]$nsnamtrace-all$nf#打開一個(gè)trace文件,用來記錄封包傳送的過程setnd[openout-$par1.trw]$nstrace-all$nd#打開一個(gè)文件用來記錄cwnd的變化情況setf0[opencwnd-$par1.trw]#﹚定義一個(gè)結(jié)束的程序procfinish{}{globalnsndf0tcppar1nf#顯示最后的平均吞吐量puts[format"averagethroughput:%.1fKbps"\ [expr[$tcpsetack_]*([$tcpsetpacketSize_])*8/1000.0/10]]$nsflush-trace #關(guān)閉文件close$ndclose$f0 #使用awk分析記錄文件,以觀察隊(duì)列的變化 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}#定義一個(gè)記錄的程序#每隔0.01s就去記錄當(dāng)時(shí)的cwndprocrecord{}{ globalnstcpf0 setnow[$nsnow] puts$f0"$now[$tcpsetcwnd_]" $nsat[expr$now+0.01]"record"}#產(chǎn)生傳送結(jié)點(diǎn),路由器r1,r2和接收結(jié)點(diǎn)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#設(shè)置隊(duì)列長度為15個(gè)封包大小setbuffer_size15$nsqueue-limit$r0$r1$buffer_size#根據(jù)用戶的設(shè)置,指定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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論