姜雨菲,梁向陽
(西安工業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院 新型網(wǎng)絡(luò)與檢測(cè)控制國家地方 聯(lián)合工程實(shí)驗(yàn)室,陜西 西安 710021)
“計(jì)算機(jī)網(wǎng)絡(luò)”及其相關(guān)課程是教育部指定的計(jì)算機(jī)專業(yè)和信息類專業(yè)本科生和研究生的核心基礎(chǔ)課程[1]。課程以網(wǎng)絡(luò)體系結(jié)構(gòu)為框架展開,由于網(wǎng)絡(luò)概念一般比較抽象,學(xué)生難以理解,而實(shí)驗(yàn)教學(xué)環(huán)節(jié)能很好地彌補(bǔ)這一缺陷。又由于實(shí)際的網(wǎng)絡(luò)實(shí)驗(yàn)受到環(huán)境、規(guī)模的限制,采用仿真方法便成為最經(jīng)濟(jì)有效的課程教學(xué)實(shí)驗(yàn)手段[2]。
TCP擁塞控制是“計(jì)算機(jī)網(wǎng)絡(luò)”教學(xué)中的一個(gè)重點(diǎn)和難點(diǎn)[3]。隨著當(dāng)前傳統(tǒng)的單一網(wǎng)絡(luò)結(jié)構(gòu)轉(zhuǎn)變?yōu)槎喾N異構(gòu)網(wǎng)絡(luò)結(jié)合的復(fù)雜混合網(wǎng)絡(luò)結(jié)構(gòu),也對(duì)相關(guān)的實(shí)驗(yàn)教學(xué)內(nèi)容提出了新的挑戰(zhàn)和要求。復(fù)雜混合網(wǎng)絡(luò)中的擁塞控制不僅是網(wǎng)絡(luò)穩(wěn)定、高效運(yùn)行的關(guān)鍵,同時(shí)又是實(shí)現(xiàn)各種服務(wù)的基礎(chǔ)和前提。本文基于NS3仿真平臺(tái),以TCP擁塞控制為實(shí)驗(yàn)?zāi)繕?biāo),詳細(xì)論述了當(dāng)前普遍使用的多種TCP擁塞控制算法的仿真實(shí)現(xiàn)過程,并在多個(gè)網(wǎng)絡(luò)環(huán)境下對(duì)各類算法的公平性以及友好性進(jìn)行了實(shí)驗(yàn)比較。
NS3是一種基于 Linux的開源、免費(fèi)的網(wǎng)絡(luò)仿真軟件,由于其能夠更符合實(shí)際地模擬現(xiàn)實(shí)世界中的各種網(wǎng)絡(luò),因而其可靠性得到世界上眾多研究者和企業(yè)界的認(rèn)可[4]。同時(shí)由于其適應(yīng)性非常廣泛,可以實(shí)現(xiàn)多類復(fù)雜混合的網(wǎng)絡(luò)傳輸環(huán)境和拓?fù)洵h(huán)境,因而對(duì)“計(jì)算機(jī)網(wǎng)絡(luò)”教學(xué)有著非常重要的輔助價(jià)值和現(xiàn)實(shí)意義。圖1為其可模擬的典型復(fù)雜混合網(wǎng)絡(luò)。
圖1 模擬真實(shí)環(huán)境中復(fù)雜網(wǎng)絡(luò)拓?fù)?/p>
NS3仿真模塊基本涵蓋了網(wǎng)絡(luò)通信的所有層次,包括應(yīng)用層的各種分組產(chǎn)生器,傳輸層的 TCP和UDP,網(wǎng)絡(luò)層的IPv4和IPv6協(xié)議,鏈路層和物理層的點(diǎn)對(duì)點(diǎn)(PPP)、CSMA,以及 IEEE 802.11a/b/g/n和LTE協(xié)議等無線網(wǎng)絡(luò)。
NS3提供各種用于網(wǎng)絡(luò)模擬的應(yīng)用程序接口(application programming interface,API),可以在模擬腳本中調(diào)用這些 API來構(gòu)建自己的仿真網(wǎng)絡(luò)結(jié)構(gòu)[5-6],其仿真的基本模型如圖2所示。
圖2 NS3基本模型
其中,Node類提供了用來管理模擬器中網(wǎng)絡(luò)組件表示的各種方法,包括應(yīng)用程序、協(xié)議棧、外接卡和驅(qū)動(dòng)程序。Application類為仿真中的用戶級(jí)應(yīng)用程序提供了各種方法。在這些應(yīng)用程序中,發(fā)送方和接收方應(yīng)用程序都用于在仿真網(wǎng)絡(luò)中發(fā)送和接收數(shù)據(jù)包。Channel類用于描述通信子網(wǎng)對(duì)象,并提供一種方法來管理它們并將它們連接到節(jié)點(diǎn)。NetDevice類用于描述 NS3中的網(wǎng)絡(luò)設(shè)備,包括 CsmaNetDevice、PointToPointNetDevice、Wi-FiNetDevice等。NetDevice類的主要功能是管理節(jié)點(diǎn)和連接信道對(duì)象。Topology Helper用于幫助連接網(wǎng)絡(luò)設(shè)備和節(jié)點(diǎn)以及網(wǎng)絡(luò)設(shè)備和通道,并幫助安排IP地址。
網(wǎng)絡(luò)中 Channel的傳輸方式主要包括點(diǎn)對(duì)點(diǎn)(PPP)、CSMA和無線。點(diǎn)對(duì)點(diǎn)仿真使用點(diǎn)對(duì)點(diǎn)協(xié)議(point-to-point protocol,PPP)傳輸分組。對(duì)于點(diǎn)對(duì)點(diǎn)信道來說,對(duì)應(yīng)的網(wǎng)絡(luò)設(shè)備類是PointToPointNetDevice,信道類是PointToPointChannel。構(gòu)建點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)鏈路的核心代碼如圖3所示。
圖3 點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)鏈路的核心代碼
CSMA網(wǎng)絡(luò)與PPP都屬于有線網(wǎng)絡(luò)技術(shù),不同之處是 CSMA信道可以連接多個(gè)節(jié)點(diǎn),如總線型網(wǎng)絡(luò)等,需要節(jié)點(diǎn)競(jìng)爭(zhēng)信道使用權(quán)。其鏈路仿真構(gòu)建的核心代碼如圖4所示。
圖4 CSMA鏈路仿真構(gòu)建的核心代碼
無線網(wǎng)絡(luò)由一個(gè)接入點(diǎn)(access point,AP)和多個(gè)nWifi移動(dòng)節(jié)點(diǎn)組成,無線鏈路仿真構(gòu)建的核心代碼如圖5所示。
在NS3仿真平臺(tái)上可以通過自主創(chuàng)建節(jié)點(diǎn)、配置信道屬性、創(chuàng)建信道并連接節(jié)點(diǎn)來實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)涞慕?。NS3的所有模塊都為用戶提供了豐富的助手類,可以屏蔽復(fù)雜操作的實(shí)現(xiàn)細(xì)節(jié),從而降低了編寫模擬腳本的復(fù)雜度。
圖5 無線鏈路仿真構(gòu)建的核心代碼
實(shí)驗(yàn)場(chǎng)景如圖6所示,其中0—3,6—9節(jié)點(diǎn)可以同時(shí)作為發(fā)送端和接收端,4,5節(jié)點(diǎn)為交換路由節(jié)點(diǎn),4~5鏈路為典型的瓶頸鏈路。傳輸方式是有線,通過設(shè)置節(jié)點(diǎn)發(fā)送速率和鏈路的傳輸時(shí)延,可模擬多種混合網(wǎng)絡(luò)環(huán)境,具有較好的普適性。
圖6 4∶4啞鈴網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
本文使用 NS-3.29版本,仿真環(huán)境為 Ubuntu 16.04。構(gòu)建圖6網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的主要代碼如圖7所示。
在網(wǎng)絡(luò)運(yùn)行的某段時(shí)間,如果對(duì)網(wǎng)絡(luò)傳輸資源的需求超過了該資源所能提供的可用部分,網(wǎng)絡(luò)的性能就要發(fā)生變化,這種情況叫擁塞[7]。擁塞控制能防止過多的數(shù)據(jù)同一時(shí)間注入到網(wǎng)絡(luò)當(dāng)中,從而使網(wǎng)絡(luò)中的設(shè)備資源或鏈路不致過載。擁塞控制常常是在TCP中實(shí)現(xiàn)的,因此也叫TCP擁塞控制。
NS3中TCP的屬性和trace變量都集中在以下3個(gè)核心類中。TcpSocket:這是一個(gè)虛類,主要定義了一些基本的TCP屬性;TcpSocketBase:窗口管理、擁塞控制等主要TCP算法都在這個(gè)類中實(shí)現(xiàn);TcpL4Protocol:是與網(wǎng)絡(luò)層的接口,也負(fù)責(zé)TcpSocketBase對(duì)象。
圖7 圖6網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的主要代碼
實(shí)驗(yàn)人員在仿真程序的頂部以及在為節(jié)點(diǎn)創(chuàng)建網(wǎng)絡(luò)協(xié)議棧之前添加相應(yīng)代碼,就可以設(shè)置所需要的TCP擁塞控制算法。例如,設(shè)置Cubic擁塞控制算法如下:
擁塞控制算法的公平性和友好性一般是通過吞吐量的值來衡量的,而吞吐量的獲取需要套接字的屬性[8]。通過 Socket::CreateSocket()函數(shù)創(chuàng)建套接字,其返回值就是一個(gè)套接字指針,其參數(shù)必須是ns3::SocketFactory對(duì)象,需要通過配置套接字指針把屬性和 TcpL4Protocol對(duì)象關(guān)聯(lián)在一起,采用的方法是通過配置系統(tǒng)函數(shù)Config::Set(),其核心代碼如下:
NS3支持的擁塞控制算法有十多種之多,基本涵蓋了當(dāng)前所有常用的擁塞控制算法,包括NewReno、Cubic、Vegas、Yeah、Hybla等。對(duì) NS3支持的主要TCP擁塞控制算法進(jìn)行仿真,將仿真參數(shù)設(shè)置如下:鏈路帶寬 100 Mbps,時(shí)延 100 ms,仿真時(shí)間 250 s,丟包率0.000 001。去掉前50 s非穩(wěn)態(tài)區(qū)數(shù)據(jù)后的仿真實(shí)驗(yàn)結(jié)果如圖8所示。
圖8 TCP擁塞控制算法的cwnd(網(wǎng)絡(luò)擁塞窗口)
下面兩小節(jié)將以其中兩個(gè)典型的擁塞控制算法NewReno和Cubic為例,進(jìn)行驗(yàn)證性分析。
4.1.1 NewReno擁塞控制算法的驗(yàn)證性分析
NewReno是 Windows系統(tǒng)多個(gè)版本中采用的TCP擁塞控制算法[9],也是大部分“計(jì)算機(jī)網(wǎng)絡(luò)”課程中的教學(xué)事例算法,其核心思想涉及對(duì)擁塞控制窗口和慢啟動(dòng)閾值的調(diào)節(jié)機(jī)制。
在慢啟動(dòng)階段,發(fā)送端每收到了一個(gè)新的 ACK(確認(rèn)字符),擁塞窗口就增加一個(gè) MSS(最大數(shù)據(jù)段長度),擁塞窗口的計(jì)算方法為:
在擁塞避免階段,擁塞窗口的增長幅度相對(duì)于慢啟動(dòng)階段有所放緩。窗口大小在一個(gè)RTT(往返時(shí)延)內(nèi)增加一個(gè) MSS,從指數(shù)增加變成了線性增加。此時(shí),發(fā)送端收到一個(gè)新ACK時(shí),新?lián)砣翱诘挠?jì)算方法為:
RTO(重傳超時(shí)時(shí)間)超時(shí)、快速重傳與快速恢復(fù)時(shí),擁塞事件可以由RTO超時(shí)和重復(fù)ACK引起。若發(fā)送方連續(xù)收到N(一般為3)個(gè)重復(fù)ACK,則發(fā)送方確定數(shù)據(jù)包丟失,它將立即重新發(fā)送數(shù)據(jù)包,而不等待RTO超時(shí),之后進(jìn)入快速恢復(fù)階段。此時(shí),慢啟動(dòng)閾值的計(jì)算方法為:
截取圖 8(g)中 NewReno擁塞控制窗口變化的部分?jǐn)?shù)據(jù)放大,如圖9所示。
圖9 NewReno算法擁塞控制窗口局部放大圖
由圖9可見,擁塞控制窗口在增加的時(shí)候有一個(gè)明顯的指數(shù)上升階段和一個(gè)線性上升階段,而當(dāng)發(fā)生重傳時(shí),慢啟動(dòng)閾值會(huì)降為當(dāng)前擁塞窗口的一半,并基于此進(jìn)入擁塞避免階段。由此可見,該算法的仿真結(jié)果和理論分析完全一致[10]。
4.1.2 Cubic擁塞控制算法的驗(yàn)證性分析
Cubic算法是在 Bic算法基礎(chǔ)上改進(jìn)而來的,并被應(yīng)用在當(dāng)前多個(gè)Linux操作系統(tǒng)版本中[11],也是較流行的一種擁塞控制算法,對(duì)其進(jìn)行研究有助于理解Linux操作系統(tǒng)的網(wǎng)絡(luò)特性。
Cubic算法使用一個(gè)如下的三次立方函數(shù)來代替Bic算法中的窗口探測(cè)曲線,其擁塞窗口的計(jì)算方法為:
截取圖8(h)中Cubic擁塞控制窗口變化的部分?jǐn)?shù)據(jù)放大,如圖10所示。
從圖 10可見,除了發(fā)生丟包重傳而使得擁塞控制窗口數(shù)值突然下降外,整個(gè)擁塞控制窗口的變化完全符合三次立方函數(shù)的變化趨勢(shì),和理論分析完全一致[12]。
除了上述兩個(gè)典型的擁塞控制算法,文獻(xiàn)[13—25]也分別說明了其他算法仿真結(jié)果的合理性與準(zhǔn)確性。
圖10 Cubic算法擁塞控制窗口局部放大圖
公平性是TCP擁塞控制算法的重要特征之一,是指采用同一種擁塞控制算法的 TCP流對(duì)網(wǎng)絡(luò)共享資源(如瓶頸鏈路)的占用公平程度。對(duì)NS3內(nèi)支持的主要TCP擁塞控制算法進(jìn)行公平性實(shí)驗(yàn)仿真,每次仿真中,有4條采用相同擁塞控制算法的TCP流,2條基于高延時(shí)(100 ms)、高帶寬(100 Mb·s-1)的鏈路,2 條普通鏈路(2 ms,1 Mb·s-1),以各鏈路的吞吐量作為比較的指標(biāo)依據(jù)。其仿真結(jié)果如圖11所示。仿真時(shí)間為 250 s,丟包率為 0.000 001。
圖11 TCP擁塞控制算法不同鏈路吞吐量對(duì)比
仍以NewReno算法和Cubic算法為例進(jìn)行分析說明。NewReno算法是 RTT敏感性算法,在網(wǎng)絡(luò)運(yùn)行初期,低延遲的TCP流具有較小的RTT,因此其擁塞窗口增長很快,吞吐量激增,而當(dāng)高延遲TCP流的擁塞窗口也增長上來后,在網(wǎng)絡(luò)傳輸錯(cuò)誤率不高的情況下,網(wǎng)絡(luò)帶寬的大小將決定對(duì)瓶頸鏈路的占用比例。由此可見,NewReno算法對(duì)網(wǎng)絡(luò)環(huán)境是較為敏感的,不同的網(wǎng)絡(luò)環(huán)境會(huì)有不同的性能特征,但同質(zhì)網(wǎng)絡(luò)環(huán)境下的公平性卻非常好。而Cubic算法的擁塞窗口增長函數(shù)是由連續(xù)兩個(gè)擁塞事件之間的時(shí)間間隔決定的,與RTT無關(guān)[26],這就使得Cubic算法在多個(gè)共享瓶頸鏈路的TCP流之間表現(xiàn)出良好的公平性,且不受網(wǎng)絡(luò)環(huán)境的影響。由此可見,采用Cubic的Linux操作系統(tǒng)在網(wǎng)絡(luò)環(huán)境略差的情況下還可以保持相對(duì)優(yōu)良的網(wǎng)絡(luò)傳輸性能。
友好性是TCP擁塞控制算法的另一個(gè)重要特征,是指采用不同擁塞控制算法的 TCP流之間對(duì)網(wǎng)絡(luò)共享資源(如瓶頸鏈路)的占用公平程度。下面以Cubic為基準(zhǔn),實(shí)現(xiàn)其與其他擁塞控制算法的友好性對(duì)比實(shí)驗(yàn)。每次仿真有4條TCP流,2條采用Cubic,2條采用其他算法,各鏈路的帶寬為 100 Mb·s-1,時(shí)延為 100 ms,仿真時(shí)間250 s,丟包率為0.000 001。其仿真結(jié)果如圖12所示。
圖12 Cubic算法與其他擁塞控制算法友好性對(duì)比
由圖12可見,在本實(shí)驗(yàn)設(shè)定的網(wǎng)絡(luò)環(huán)境中,Cubic具有較好的傳輸性,網(wǎng)絡(luò)吞吐量穩(wěn)定,且不會(huì)受其他TCP流的影響。由于每種擁塞控制算法的設(shè)計(jì)都有其適應(yīng)性范圍和條件,因此也可以得出,一些擁塞控制算法(如 NewReno、YeAH)在當(dāng)前網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境下與Cubic相比的友好性較差。
文章采用NS3仿真工具,搭建了多種類TCP擁塞控制算法的啞鈴型混合網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境,并詳細(xì)論述了實(shí)驗(yàn)平臺(tái)實(shí)現(xiàn)的方法,包括拓?fù)錁?gòu)建、網(wǎng)絡(luò)環(huán)境參數(shù)設(shè)置、協(xié)議棧和套接字的安裝、擁塞控制算法的配置等關(guān)鍵步驟。文章對(duì)多個(gè)擁塞控制算法進(jìn)行了驗(yàn)證性仿真實(shí)驗(yàn),并以NewReno和Cubic算法為例進(jìn)行了理論分析對(duì)比。在此基礎(chǔ)上,對(duì)多個(gè)算法在不同網(wǎng)絡(luò)環(huán)境下的公平性進(jìn)行了仿真和結(jié)果分析,并以 Cubic為對(duì)象,仿真對(duì)比了該算法與其他擁塞控制算法的友好性。仿真結(jié)果符合理論分析,實(shí)驗(yàn)設(shè)計(jì)成功,結(jié)果正確。該實(shí)驗(yàn)方法和平臺(tái)不僅可以服務(wù)于本科生和研究生教學(xué),也可以通過修改擁塞控制算法源代碼,產(chǎn)生新的擁塞控制算法,使其進(jìn)一步成為可靠的研究性實(shí)驗(yàn)平臺(tái)。