一、實(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.tr和cwnd-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.tr和cwnd-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