TCP Tahoe 與 Reno 運(yùn)行機(jī)制對(duì)比分析

一、實(shí)驗(yàn)?zāi)康?/h1>

學(xué)習(xí) TCP 的擁塞控制機(jī)制并了解 TCP Tahoe 和 TCP Reno 協(xié)議的運(yùn)行機(jī)制

二、實(shí)驗(yàn)內(nèi)容

觀測(cè) tahoe 和 reno 協(xié)議的特征

觀察 Tahoe 版本的 congestion window 的變化情況

觀察 Reno 版本的 congestion window 的變化情況

三、實(shí)驗(yàn)步驟

環(huán)境:ubuntu16.04

1、安裝NS2

1.1 更新系統(tǒng)

sudo apt-get update    #更新源列表
sudo apt-get upgrade   #更新已安裝的包

1.2 安裝NS2運(yùn)行時(shí)需要的三個(gè)依賴包

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

1.3 下載安裝包并編譯安裝(ns 2.35)

NS-2下載地址:https://sourceforge.net/projects/nsnam/files/(先下載再解壓)

tar xvfz ns-allinone-2.35.tar.gz    #解壓壓縮包 
cd ns-allinone-2.35         #定位到所在文件夾

修改ls文件,位置是:ns-2.35/linkstate/ls.h第137行:

void eraseAll() { erase(baseMap::begin(), baseMap::end()); }

改為:

void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); }

然后執(zhí)行

./install

等待安裝成功

1.4 配置環(huán)境變量

打開(kāi).bashrc文件

gedit  ~/.bashrc     # ~ 這個(gè)符號(hào)為當(dāng)前用戶根目錄,即/home/用戶名

直接在文檔的最后面加上以下環(huán)境變量

export NS_HOME=/home/用戶名/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   

1.5 驗(yàn)證ns2是否成功安裝

關(guān)閉終端,重啟終端,輸入ns,出現(xiàn)%,說(shuō)明ns2安裝成功

1.6 測(cè)試ns并驗(yàn)證nam是否安裝成功

倘若彈出動(dòng)畫(huà)演示框,則證明ns完全安裝正確


2、Tahoe和Reno算法的測(cè)試

安裝繪圖軟件gunplot

sudo apt-get install gnuplot-x11

安裝好后輸入gnuplot可啟動(dòng)gnuplot

實(shí)驗(yàn)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu) 和 鏈路參數(shù)配置 (FTP代表端施加恒定的流CBR):

本實(shí)驗(yàn)tcl程序:

if { $argc!=1 } {
    puts"Usage:ns lab11.tcl tcpversion"
    exit
}
 
set par1 [lindex $argv 0]
set ns [new Simulator]
 
#打開(kāi)一個(gè)trace文件,用來(lái)記錄數(shù)據(jù)報(bào)傳送的過(guò)程
set nd [open $par1.tr w]
$ns trace-all $nd
 
#打開(kāi)一個(gè)文件用來(lái)記錄cwnd變化情況
set f0 [open cwnd-$par1.tr w] 
 
#定義一個(gè)結(jié)束的程序
proc finish {} {
    global ns nd f0 tcp
    puts [format "average throughput:%.1f Kbps" \ [expr [$tcp set ack_]*([$tcp set packetSize_])*8/1000.0/10]]
    $ns flush-trace
    close $nd
    close $f0
    exit 0
}
 
#定義一個(gè)記錄的程序
proc record {} { 
    global ns tcp f0
    set now [$ns now]
    puts $f0 "$now [$tcp set cwnd_]"
    $ns at [expr $now+0.01] "record"
}
 
#產(chǎn)生傳送結(jié)點(diǎn),路由器r1和r2和接收結(jié)點(diǎn)
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
 
#設(shè)置隊(duì)列長(zhǎng)度為18個(gè)封包大小
set queue 18
$ns queue-limit $r0 $r1 $queue
 
#根據(jù)用戶的設(shè)置,指定TCP版本,并建立相應(yīng)的Agent
 
if { $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.1 觀察Tahoe版本的congestion window的變化情況

輸入如下指令即可得到使用Tahoe版本下?lián)砣翱诘淖兓闆r:

得到文件Tahoe.trcwnd-Tahoe.tr

然后利用gnuplot繪圖:

得到gif圖片swnd-Tahoe.gif:

在 TCP 的 Tahoe 版本中,Congestion Windows 值會(huì)呈現(xiàn)周期性的重復(fù)變化。剛開(kāi)始采用 Slow-Start 開(kāi)始,cwnd 呈指數(shù)方式增長(zhǎng),當(dāng) cwnd 超過(guò) Ssthresh 時(shí) 就進(jìn)入了 Congestion Avoidance 階段。由于網(wǎng)絡(luò)上的數(shù)據(jù)包不斷增加,超過(guò)路由器的轉(zhuǎn)發(fā) 能力時(shí),排隊(duì)緩沖隊(duì)列出現(xiàn)了溢出,路由器開(kāi)始使用 Drop-tail 將數(shù)據(jù)包丟掉。當(dāng)數(shù)據(jù)包丟失后,Tahoe 版本 TCP 將 ssthresh 設(shè)為出現(xiàn)數(shù)據(jù)包丟失時(shí)的 Windows 值的 1/2,并將 cwnd 值重設(shè)為 1,并重新開(kāi)始執(zhí)行 Slow-Start 算法。

2.2 觀察 Reno 版本的 congestion window 的變化情況

輸入如下指令即可得到使用Reno版本下?lián)砣翱诘淖兓闆r:

得到文件Reno.trcwnd-Reno.tr

然后利用gnuplot繪圖:

得到gif圖片swnd-Reno.gif:

在 TCP 的 Reno 版本中,開(kāi)始階段與 Tahoe 的表現(xiàn)一樣。當(dāng)網(wǎng)絡(luò)上的數(shù)據(jù)包不斷增加,超過(guò)路由器的轉(zhuǎn)發(fā)能力時(shí),排隊(duì)緩沖隊(duì)列出現(xiàn)了溢出,路由器開(kāi)始使 用 Drop-tail 將數(shù)據(jù)包后,Reno 版本 TCP 將 ssthresh 和 cwnd 都設(shè)為出現(xiàn)數(shù)據(jù)包丟失時(shí)的Windows 值的 1/2,并開(kāi)始執(zhí)行 Congestion Avoidance 算法。

3、題目

3.1 A

這個(gè)實(shí)驗(yàn)中只對(duì) cwnd 的測(cè)量,沒(méi)有對(duì) ACK 幀的測(cè)量,能夠能體現(xiàn)出“快重傳”(不 管在 Tahoe 還是在 Reno 中都有快重傳這一特性的)這一特性嗎?

答:

在Tahoe中,不能體現(xiàn)快速重傳這一特性,因?yàn)榘l(fā)送端在收到重復(fù)的ACK和發(fā)生超時(shí)都是采用慢啟動(dòng)策略,現(xiàn)象是一樣的,所以不能體現(xiàn);

在Reno中,能體現(xiàn)快速重傳這一特性,可以看到圖中的情況都是收到DupACK后然后快速重傳的例子,因?yàn)榘l(fā)送端在收到重復(fù)的ACK后采用快速重傳,而發(fā)生超時(shí)是采用慢啟動(dòng)策略,所以能體現(xiàn)。

3.2 B

為什么 Reno 版本在出現(xiàn)封包丟失后選擇將 ssthresh 和 cwnd 都設(shè)為出現(xiàn)數(shù)據(jù)包丟失 時(shí)的 Windows 值的 1/2,而不是其它值呢?比如 1/3,2/3?

答:

四、實(shí)驗(yàn)中遇到的問(wèn)題

1、在更新源列表時(shí),鍵入

sudo apt-get update

后,出現(xiàn)了下圖所示的錯(cuò)誤:

通過(guò)查找相關(guān)資料,找到解決方法:

sudo rm /var/lib/apt/lists/lock

2、然后在更新源列表時(shí),速度真的非常感人,于是通過(guò)修改/etc/apt/sources.list,換成了清華大學(xué)的源,下載速度簡(jiǎn)直飛的起。(可參考https://blog.csdn.net/zl10086111/article/details/82917462

3、安裝gnuplot時(shí)提示無(wú)法定位軟件包,

再執(zhí)行一次

sudo apt-get update

再次安裝就行了

五、實(shí)驗(yàn)心得

通過(guò)這次實(shí)驗(yàn),我對(duì)TCP Tahoe和TCP Reno協(xié)議的運(yùn)行機(jī)制有了更深刻的了解。

從以上分析可以看出 Tahoe 版本的 TCP 在每次出現(xiàn)封包丟失的時(shí)候都重新開(kāi)始執(zhí)行 Slow-Start 算法,這樣使得網(wǎng)絡(luò)的吞吐率并不高。但經(jīng)過(guò)改進(jìn)后的 Reno 版本出現(xiàn)封包丟失 的時(shí)候,并不是把當(dāng)前 cwnd 設(shè)為 1,而是設(shè)為出現(xiàn)封包丟失時(shí)的 1/2,所以 Reno 版本的 TCP 的平均吞吐率較 Tahoe 更高,這一點(diǎn)可以從實(shí)驗(yàn)結(jié)果得證。

參考鏈接:
https://blog.csdn.net/circle2015/article/details/52490582
https://blog.csdn.net/yyd19981117/article/details/89331937
https://blog.csdn.net/qq_40323844/article/details/89329686

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容